我有一个如下所示的数据框:
In [134]: df
Out[134]:
A ID3 DATETIME
0 BRT-481028 b76cd912ffcb97e21de83b252391b2a0 2014-10-08 13:43:27
1 BRT-481054 4a57ed0b02fa357bf3c51cc9460e8d96 2014-10-08 14:26:19
2 BRT-481076 1a682034f8cbc542f36e46215635da9a 2014-10-08 14:29:01
3 BRT-481023 b76cd912ffcb97e21de83b252391b2a0 2014-10-08 18:39:34
4 BRT-481023 f88g8d7sds799asde83b2523944p9r78 2014-10-08 18:40:18
5 BRT-481033 b76cd912ffcb97e21de83b252391b2a0 2014-10-08 18:44:30
6 BRT-481032 b76cd912ffcb97e21de83b252391b2a0 2014-10-08 18:46:00
7 BRT-481037 b76cd912ffcb97e21de83b252391b2a0 2014-10-08 18:52:15
8 BRT-481046 db959faf023e5df33032db4808882f0c 2014-10-08 18:59:59
9 BRT-481053 b76cd912ffcb97e21de83b252391b2a0 2014-10-08 19:17:48
10 BRT-481065 b76cd912ffcb97e21de83b252391b2a0 2014-10-08 19:21:38
每一行代表由用户触发的 事件 - 为了此示例而在 {{1 }} 的。每个事件都附加了更多属性,但我已将其他所有内容剪切掉了。
对于我正在尝试构建的内容,我只需要为每个用户和每5分钟滚动期间保留一个事件。所有其他事件,在同一时间段内和同一用户,只是干扰其他逻辑的噪声,这些逻辑会被进一步向下执行,因此应该被丢弃。因此,我需要保留每个用户最多一条记录和5分钟 滚动期 。更具体地说,我需要在同一时间段保留最新记录。
所需的输出如下所示:
df['ID3']
上面的行 A ID3 DATETIME
0 BRT-481028 b76cd912ffcb97e21de83b252391b2a0 2014-10-08 13:43:27
1 BRT-481054 4a57ed0b02fa357bf3c51cc9460e8d96 2014-10-08 14:26:19
2 BRT-481076 1a682034f8cbc542f36e46215635da9a 2014-10-08 14:29:01
4 BRT-481023 f88g8d7sds799asde83b2523944p9r78 2014-10-08 18:40:18
6 BRT-481032 b76cd912ffcb97e21de83b252391b2a0 2014-10-08 18:46:00
7 BRT-481037 b76cd912ffcb97e21de83b252391b2a0 2014-10-08 18:52:15
8 BRT-481046 db959faf023e5df33032db4808882f0c 2014-10-08 18:59:59
10 BRT-481065 b76cd912ffcb97e21de83b252391b2a0 2014-10-08 19:21:38
上的记录已被丢弃,因为它们符合上述标准。另外,请注意行[3,5,9]
和3
之间的时间间隔大于5分钟,但是,由于同时创建了记录6
,滚动窗口被丢弃了。
另请注意,行5
上的记录保持不变,因为它与其他用户相关联。
修改
现在我进一步了解了,我使用了4
和diff()
来看到这一点:
groupby()
我似乎无法获得差异的秒数。我尝试过:
In [309]: df['diff'] = df.sort_values(by='DATETIME').groupby('ID3')['DATETIME'].transform(lambda x: x.diff())
In [310]: df
Out[310]:
A ID3 DATETIME \
0 BRT-481028 b76cd912ffcb97e21de83b252391b2a0 2014-10-08 13:43:27
1 BRT-481054 4a57ed0b02fa357bf3c51cc9460e8d96 2014-10-08 14:26:19
2 BRT-481076 1a682034f8cbc542f36e46215635da9a 2014-10-08 14:29:01
3 BRT-481023 b76cd912ffcb97e21de83b252391b2a0 2014-10-08 18:39:34
4 BRT-481023 f88g8d7sds799asde83b2523944p9r78 2014-10-08 18:40:18
5 BRT-481033 b76cd912ffcb97e21de83b252391b2a0 2014-10-08 18:44:30
6 BRT-481032 b76cd912ffcb97e21de83b252391b2a0 2014-10-08 18:46:00
7 BRT-481037 b76cd912ffcb97e21de83b252391b2a0 2014-10-08 18:52:15
8 BRT-481046 db959faf023e5df33032db4808882f0c 2014-10-08 18:59:59
9 BRT-481053 b76cd912ffcb97e21de83b252391b2a0 2014-10-08 19:17:48
10 BRT-481065 b76cd912ffcb97e21de83b252391b2a0 2014-10-08 19:21:38
diff
0 NaT
1 NaT
2 NaT
3 1970-01-01 04:56:07
4 NaT
5 1970-01-01 00:04:56
6 1970-01-01 00:01:30
7 1970-01-01 00:06:15
8 NaT
9 1970-01-01 00:25:33
10 1970-01-01 00:03:50
代替上面的>> findTheDiff = lambda x: x.diff().astype(np.int64)
,但这并没有太大区别。
我希望lambda
成为'1970-01-01 00:01:30'
!
感谢您的帮助!
答案 0 :(得分:1)
diff
正在返回Timedelta
属性为seconds
的对象。
findTheDiff = lambda x: x.diff().seconds
答案 1 :(得分:1)
在这种情况下,transform()
似乎没有返回正确的dtype,与已知的issue相关。
使用transform()
确实应该在这里工作,但是,鉴于行为不稳定,解决方法是尝试这样做:
>> df.sort_values(by='DATETIME').groupby('ID3')['DATETIME'].diff().dt.total_seconds()
Out[168]:
0 NaN
1 NaN
2 NaN
3 17767.0
4 NaN
5 296.0
6 90.0
7 375.0
8 NaN
9 1533.0
10 230.0
这也会返回一个类似索引的DF(如transform
所做的那样)并完成工作。
可以找到原始答案以及有关transform()
错误的更多信息here