我有一个名为“ df”的数据框,该数据框由日期,ID和活动组成,该数据帧同时在“日期”和“ ID”上排序,以便将ID分组在一起,然后按时间顺序将它们排到最早。
我想从先前的“日期”中减去当前的“日期”列,以便找到两次之间的持续时间。
Date ID Activity Duration
4/12/2018 7:58 1111 1
4/12/2018 8:40 1111 0
4/12/2018 8:42 1111 1
4/12/2018 9:26 1111 0
到目前为止,我的脚本是:
for row in df.itertuples():
callDate = datetime.strptime(row.Date, "%m/%d/%y %I:%M %p")
previousRecord = df['Date'].shift(-1).strptime(row.Date, "%m/%d/%y %I:%M %p")
duration = callDate - previousRecord
第3行出错,因为我无法访问上一行并将其转换为datetime对象,因此duration可以相应地处理timedelta。如果我在第3行中删除了strptime调用,那么脚本会出错,因为该脚本正在接收日期时间和字符串。
有没有更优雅的方法可以做到这一点?另外,如果我在“持续时间”列中输入值时可以省去月/日/年,则可以得到奖励积分。
非常感谢!我非常感谢您的帮助。
最佳答案
将groupby
与diff
一起使用
df.assign(Duration=df.groupby('ID').Date.diff().fillna(0))
Date ID Activity Duration
0 2018-04-12 07:58:00 1111 1 00:00:00
1 2018-04-12 08:40:00 1111 0 00:42:00
2 2018-04-12 08:42:00 1111 1 00:02:00
3 2018-04-12 09:26:00 1111 0 00:44:00