pandas时间戳和创建新DataFrame之间的区别

时间:2018-08-06 10:35:00

标签: python pandas datetime

我有一个如下的数据集

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使用循环来实现此目的。

或者有其他方法吗?

1 个答案:

答案 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())