【问题标题】:GroupBy - How to extract seconds from DateTime with diff()GroupBy - 如何使用 diff() 从 DateTime 中提取秒数
【发布时间】:2016-04-30 20:48:14
【问题描述】:

我有以下数据框:

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]

我想要实现的是以秒为单位表示 diff,而不是相对于纪元时间的某个时间。

我发现我可以将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

有没有办法在transform 的一个步骤中实现这一点(秒作为df_2['diff'] 的值),而不必在此过程中采取几个步骤?

最后,我已经尝试在transform中转换为TimeDelta,但没有任何成功。

感谢您的帮助!

【问题讨论】:

    标签: python python-3.x pandas dataframe


    【解决方案1】:

    更新:来自class 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
    

    来自class 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
    

    【讨论】:

    • 正确,谢谢!在转换内部进行缓存是否存在一些问题,或者在transform 内部无法完成的原因是什么?
    • @Thanos,请参阅“更新”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-07
    • 1970-01-01
    • 2015-06-12
    • 1970-01-01
    • 2012-02-12
    相关资源
    最近更新 更多