Pandas计算日期时间差异,但是对于每个用户

时间:2018-04-30 19:02:59

标签: python pandas datetime group-by pandas-groupby

数据集与用户查看项目所花费的时间有关:

user_id   item_id           view_started
  121        160       2015-10-20 17:02:02
  231        160       2015-10-18 11:02:29
  231        161       2015-10-18 11:05:23
  121        166       2015-10-18 11:04:34
  231        180       2015-10-18 11:06:16
  121        182       2015-10-20 17:02:10
  134        182       2015-10-18 11:02:53
  124        185       2015-10-18 11:04:23
  231        187       2015-10-18 11:04:45
  124        190       2015-10-18 11:05:43

目标是为每个项目创建用户查看(或查看项目之间的差距)项目所花费的时间。

user_id item_id     minutes
  121     160        4320
  ...

应该在用户查看的直接项目之间计算差异。示例:X1, X2, X3 | Time between X1-X2, X2-X3...并且需要重置每个组的时间。我认为使用diff不是正确的方法。

df.groupby(['user_id']).apply(
            lambda x: x.sort_values(['view_started'], ascending = True))['view_started'].diff()

这给出了第一个值NaT。每组(每位用户)应重置时差

* Time probably don't reflect the above data frame due to sort

0                  NaT
1      0 days 00:08:58
2      0 days 00:04:51
3      0 days 00:06:46
4      0 days 17:05:03
5      0 days 00:00:51
6    -9 days +10:21:49
7      0 days 00:02:33

1 个答案:

答案 0 :(得分:3)

diff在这里似乎很好,但你需要做一些家务。首先,对数据进行排序:

df = df.sort_values(by=['user_id', 'view_started']).reset_index(drop=True)

现在,您可以执行groupby + diff操作。

df['minutes'] = (
    df.groupby('user_id', sort=False)
      .view_started
      .diff()
      .dt.total_seconds()
      .div(60)
      .shift(-1)
)

df
   user_id  item_id        view_started      minutes
0      121      166 2015-10-18 11:04:34  3237.466667
1      121      160 2015-10-20 17:02:02     0.133333
2      121      182 2015-10-20 17:02:10          NaN
3      124      185 2015-10-18 11:04:23     1.333333
4      124      190 2015-10-18 11:05:43          NaN
5      134      182 2015-10-18 11:02:53          NaN
6      231      160 2015-10-18 11:02:29     2.266667
7      231      187 2015-10-18 11:04:45     0.633333
8      231      161 2015-10-18 11:05:23     0.883333
9      231      180 2015-10-18 11:06:16          NaN