我有一个包含一些日期的数据框,以及与我从 csv 文件中读取的每个日期相关的数据(该文件相对较小,大约有 10,000 行和约 10 列):
memid date a b
10000 7/3/2017 221 143
10001 7/4/2017 442 144
10002 7/6/2017 132 145
10003 7/8/2017 742 146
10004 7/10/2017 149 147
我想向此数据框添加一列“date_diff”,用于计算每个日期与上一个日期之间的天数(行始终按日期排序):
memid date a b date_diff
10000 7/3/2017 221 143 NaN
10001 7/4/2017 442 144 1
10002 7/6/2017 132 145 2
10003 7/8/2017 742 146 2
10004 7/11/2017 149 147 3
我无法找到创建此“date_diff”列的好方法,因为在使用 pandas/numpy 时逐行迭代往往会受到皱眉。有没有一种简单的方法可以在 python/pandas/numpy 中创建此列,或者在将 csv 读入我的脚本之前更好地完成这项工作?
谢谢!
编辑:感谢 jpp 和 Tai 的回答。它涵盖了最初的问题,但我有一个后续问题:
如果我的数据集每个日期有多行怎么办?有没有一种方法可以轻松检查每组日期之间的差异以产生如下例所示的输出?如果每个日期都有一定数量的行,会不会更容易?
memid date a b date_diff
10000 7/3/2017 221 143 NaN
10001 7/3/2017 442 144 NaN
10002 7/4/2017 132 145 1
10003 7/4/2017 742 146 1
10004 7/6/2017 149 147 2
10005 7/6/2017 457 148 2
最佳答案
编辑回答OP的新问题:如果日期
列中有重复项怎么办?
设置:创建一个不包含重复项的 df
df.date = pd.to_datetime(df.date, infer_datetime_format=True)
df_no_dup = df.drop_duplicates("date").copy()
df_no_dup["diff"] = df_no_dup["date"].diff().dt.days
方法1:合并
df.merge(df_no_dup[["date", "diff"]], left_on="date", right_on="date", how="left")
memid date a b diff
0 10000 2017-07-03 221 143 NaN
1 10001 2017-07-03 442 144 NaN
2 10002 2017-07-04 132 145 1.0
3 10003 2017-07-04 742 146 1.0
4 10004 2017-07-06 149 147 2.0
5 10005 2017-07-06 457 148 2.0
方法2: map
df["diff"] = df["date"].map(df_no_dup.set_index("date")["diff"])
<小时/>
试试这个。
df.date = pd.to_datetime(df.date, infer_datetime_format=True)
df.date.diff()
0 NaT
1 1 days
2 2 days
3 2 days
4 2 days
Name: date, dtype: timedelta64[ns]
转换为整数:
df['diff'] = df['date'].diff() / np.timedelta64(1, 'D')
# memid date a b diff
# 0 10000 2017-07-03 221 143 NaN
# 1 10001 2017-07-04 442 144 1.0
# 2 10002 2017-07-06 132 145 2.0
# 3 10003 2017-07-08 742 146 2.0
# 4 10004 2017-07-10 149 147 2.0
关于python - 创建一个列来计算每个新行之间的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49072274/