如何在数据框中找到每个活动的间隔?

时间:2019-06-13 15:46:31

标签: python dataframe

对于每个User_id,我都有一个不同事件的列表。例如,事件1可以由同一用户发生在不同的时间。

我试图做的是找到属于该用户的每个事件的间隔,并找到每个事件的间隔的平均值。

我尝试使用groupby(['user_id','events'])['time']和聚合函数,但结果不是我想要的。

User_id       events           time 

1            A             2012-11-24 09:30:00

1            A             2012-11-24 11:50:00

1            B             2012-11-24 12:15:00

1            B             2012-11-24 16:22:00

1            C             2012-11-24 16:23:40  

1            D             2012-11-25 05:20:00

1            B             2012-11-25 05:24:00

1            A             2012-11-25 15:00:00

2            A             2012-12-20 01:00:00

预期结果是:

User_id       events           time                     interval

  1           A            2012-11-24 09:30:00           0

              A            2012-11-24 11:50:00          2h20m

              A            2012-11-25 15:00:00          27h10m

              B            2012-11-24 12:15:00           0

              B            2012-11-24 16:22:00          4h7m

              B            2012-11-25 05:24:00          13h2m

然后找到每个事件的时间间隔平均值。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

假设时间已排序,则可以通过groupby和shift来获取上一个事件的时间

df.groupby(['User_id', 'events']).time.shift())
0                   NaT
1   2012-11-24 09:30:00
2                   NaT
3   2012-11-24 12:15:00
4                   NaT
5                   NaT
6   2012-11-24 16:22:00
7   2012-11-24 11:50:00
8                   NaT

您可以从上一个时间中减去时间,以获得所需的“经过”时间。

>>> df.time - df.groupby(['User_id', 'events']).time.shift()     
0               NaT
1   0 days 02:20:00
2               NaT
3   0 days 04:07:00
4               NaT
5               NaT
6   0 days 13:02:00
7   1 days 03:10:00
8               NaT

好像您将第一个间隔定义为0,可以使用fillna进行操作。您可以将其重新插入数据框以获得预期的结果。

df['interval'] = (df.time - df.groupby(['User_id', 'events']).time.shift()).fillna(pd.Timedelta(0))