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

标签 python python-3.x pandas dataframe

我有以下数据框:

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 以秒为单位表示,而不是与 Epoch 时间相关的某个时间。

我发现我可以将 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,但没有成功。

感谢您的帮助!

最佳答案

更新: 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

关于python - GroupBy - 如何使用 diff() 从 DateTime 中提取秒数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36960086/

相关文章:

python - 是否有一个函数可以在维持我的订单的同时将我的数字四舍五入?

python - cph.plot() : how to make it bigger?

python - 父实例未绑定(bind)到 Session;属性“帐户”的延迟加载操作无法进行

javascript - Django:Bokeh.safely 不是函数

javascript - selenium execute_script 带换行符

python - 单独文件中的功能较慢

python - 如何从 Pandas 数据框中提取 x 和 y 对,然后在 symfit 中使用?

python - 二维和一维 Numpy 数组的交集

python - 使用 Firefox 的 Tensorboard 在 Google Colab 中出现错误 403

python - 如何将抖动添加到具有 X 和 Y 值的散点图?