2016-04-30 35 views
3

我有以下数据框:的GroupBy - 如何从日期时间与差异中提取秒()

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 

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

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

感谢您的帮助!

回答

4

UPDATE:从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 

transform()class SeriesGroupBy(GroupBy)试图做到以下几点:

result = _possibly_downcast_to_dtype(result, dtype) 

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

OLD答案:

试试这个:

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 
+0

点上,谢谢!在转换过程中是否存在一些问题,或者在变换中无法完成的原因是什么? – Thanos

+0

@Thanos,请参阅“更新” – MaxU

+0

@Thanos,我已经提交了一个[bug](https://github.com/pydata/pandas/issues/13046) – MaxU