2016-04-30 37 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