微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

python-GroupBy-如何使用diff()从DateTime中提取秒

我有以下数据框:

In [372]: df_2
Out[372]: 
        A         ID3            DATETIME
0   B-028  b76cd912ff 2014-10-08 13:43:27
1   B-054  4a57ed0b02 2014-10-08 14:26:19
2   B-076  1a682034f8 2014-10-08 14:29:01
3   B-023  b76cd912ff 2014-10-08 18:39:34
4   B-023  f88g8d7sds 2014-10-08 18:40:18
5   B-033  b76cd912ff 2014-10-08 18:44:30
6   B-032  b76cd912ff 2014-10-08 18:46:00
7   B-037  b76cd912ff 2014-10-08 18:52:15
8   B-046  db959faf02 2014-10-08 18:59:59
9   B-053  b76cd912ff 2014-10-08 19:17:48
10  B-065  b76cd912ff 2014-10-08 19:21:38

我想找到不同条目之间的区别-按“ ID3”分组.

我试图像这样在GroupBy上使用transform():

In [379]: df_2['diff'] = df_2.sort_values(by='DATETIME').groupby('ID3')['DATETIME'].transform(lambda x: x.diff()); df_2['diff']
Out[379]: 
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
Name: diff, dtype: datetime64[ns]

我也尝试过用x.diff().astype(int)进行lambda运算,结果完全相同.

“ DATETIME”和“ diff”的数据类型均为:datetime64 [ns]

我想要实现的是,以秒表示差异,而不是相对于纪元时间而言.

我已经知道可以将df_2 [‘diff’]转换为timedelta,然后在一个链式调用提取秒,如下所示:

In [405]: df_2['diff'] = pd.to_timedelta(df_2['diff']).map(lambda x: x.total_seconds()); df_2['diff']
Out[407]: 
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
Name: diff, dtype: float64

有没有一种方法可以在转换的一个步骤中实现此目标(以秒为df_2 [‘diff’]的值),而不必在此过程中采取几个步骤?

最后,我已经尝试过以转换方式转换到timedelta的方式,但没有成功.

谢谢您的帮助!

解决方法:

更新:类NDFrameGroupBy(GroupBy)中的transform()似乎没有向下转换,并且按预期工作:

In [220]: (df_2[['ID3','DATETIME']]
   .....:      .sort_values(by='DATETIME')
   .....:      .groupby('ID3')
   .....:      .transform(lambda x: x.diff().dt.total_seconds())
   .....: )
Out[220]:
    DATETIME
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

类SeriesGroupBy(GroupBy)中的transform()尝试执行以下操作:

result = _possibly_downcast_to_dtype(result, dtype)

这可能(我不确定)导致您的问题

旧答案:

尝试这个:

In [168]: df_2.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
dtype: float64

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐