我有一个如下的数据集
u_id request_day time request_time
4 2016-11-05 06:50 2016-11-05 06:50:30
4 2016-11-05 06:51 2016-11-05 06:51:55
4 2016-11-05 07:06 2016-11-05 07:06:38
4 2016-11-05 07:06 2016-11-05 07:06:44
4 2016-11-05 07:07 2016-11-05 07:07:32
4 2016-11-08 06:18 2016-11-08 06:18:03
4 2016-11-08 06:18 2016-11-08 06:18:10
4 2016-11-08 06:18 2016-11-08 06:18:55
5 2016-11-05 06:50 2016-11-05 06:50:30
5 2016-11-05 06:51 2016-11-05 06:51:55
5 2016-11-05 07:06 2016-11-05 07:06:38
5 2016-11-05 07:06 2016-11-05 07:06:44
5 2016-11-05 07:07 2016-11-05 07:07:32
5 2016-11-08 06:18 2016-11-08 06:18:03
5 2016-11-08 06:18 2016-11-08 06:18:10
5 2016-11-08 06:18 2016-11-08 06:18:55
对于每个u_id,request_day,我都希望花费总时间。 例如: u_id:4,请求日:2016-11-05,您发现时间之间的时差,如果时间差小于2分钟,则是有效时差。不超过2分钟。
假设要形成一个新的dataFrame
u_id request_day time_spent
4 2016-11-05 2:19 [(6:50:30 - 6:51:55) + <(6:51:55 - 7:06:38)> + (07:06:38 - 07:06:44) + (07:06:44 - 07:07:32)]
忽略具有
我应该通过对每个u_id使用for循环和对每个request_day使用循环来实现此目的。
或者有其他方法吗?
答案 0 :(得分:0)
尝试以下方法:
# change to datetime format if it isn't already
df.request_time = pd.to_datetime(df.request_time)
# group by u_id anf request_date and find the difference between the current and next row
time_diff = df.groupby(['u_id', 'request_day']).apply(lambda x: x.request_time.diff())
# select all data where the time_diff < 2 minutes and sum
time_diff[time_diff < pd.Timedelta('2M')].groupby(['u_id', 'request_day']).sum()
输出:
u_id request_day
4 2016-11-05 00:02:19
2016-11-08 00:00:52
5 2016-11-05 00:02:19
2016-11-08 00:00:52
Name: request_time, dtype: timedelta64[ns]
编辑:或者您可以使用以下一种班轮操作:
df.groupby(['u_id', 'request_day']).apply(lambda x: x.request_time.diff().where(
x.request_time.diff() < pd.Timedelta('2M')
).sum())