2016-04-30 8 views
3

Ich habe folgende Datenrahmen:GroupBy - Wie Sekunden von Datetime mit diff extrahieren()

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 

Und ich möchte den Unterschied zwischen den verschiedenen Einträgen zu finden - gruppiert nach 'ID3'.

Ich versuche transform() auf einem GroupBy wie folgt zu verwenden:

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] 

ich auch mit x.diff().astype(int) für lambda, mit dem exakt gleichen Ergebnis versucht habe.

Datentyp sowohl von 'DATETIME' und 'diff' ist: datetime64[ns]

Was ich versuche zu erreichen, haben diff statt einiger Zeit in Bezug auf Epoch Zeit in Sekunden dargestellt.

Ich habe herausgefunden, dass ich df_2['diff']-TimeDelta umwandeln kann und dann Sekunden in einem verketteten Anruf extrahiert an dieser Stelle, wie folgt aus:

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 

Gibt es eine Möglichkeit, diese (Sekunden als Wert zu erreichen, für df_2['diff']) in einem Schritt in der transform statt ein paar Schritte in dem Prozess zu machen?

Schließlich habe ich bereits versucht, die Umwandlung in TimeDelta in transform ohne Erfolg.

Danke für die Hilfe!

Antwort

4

UPDATE:transform() von class NDFrameGroupBy(GroupBy) scheint nicht Downcasting zu tun und wie erwartet funktioniert:

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 

die transform() von class SeriesGroupBy(GroupBy) versucht folgendes zu tun:

result = _possibly_downcast_to_dtype(result, dtype) 

das könnte (Ich bin mir nicht sicher) verursachen Sie Ihr Problem

OLD Antwort:

versuchen Sie dies:

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

Spot on, danke! Gibt es ein Problem mit der Verwandlung oder was ist der Grund dafür, dass dies nicht innerhalb von 'transform' geschehen kann? – Thanos

+0

@ Thanos, siehe "UPDATE" – MaxU

+0

@ Thanos, ich habe einen [Bug] eingereicht (https://github.com/pydata/pandas/issues/13046) – MaxU

Verwandte Themen