2017-04-11 6 views
1

Ich habe einen Pandas Datenrahmen, der Zeit in Stunden hat: Minuten Format (zB 09:35) und ich möchte den Unterschied zwischen aufeinanderfolgenden Zeiten in der B-Spalte mit Bezug auf ihre zugehörigen Schlüssel in die A-Spalte.Wie subtrahieren Zeiten in Python

Die Daten sehen wie folgt aus:

 A  B 
1  key1  09:12 
2  key1  09:15 
3  key1  09:21 
4  key2  10:21 
5  key2  10:27 
6  key2  10:32 

Die Ausgabe in etwa so sein sollte:

 A  B 
1  key1  00:00 
2  key1  00:03 
3  key1  00:06 
4  key2  00:00 
5  key2  00:06 
6  key2  00:05 

Oder etwas Ähnliches:

 A  B 
1  key1  0 
2  key1  3 
3  key1  6 
4  key2  0 
5  key2  6 
6  key2  5 

ich die Daten im Falle kennen In der Spalte B sind Ganzzahlen, wir können so etwas tun:

df['B'] = df.groupby('A')['B'].diff().fillna(0).astype(int) 

Die Daten in der Spalte B sind jedoch keine Ganzzahlen, sondern im Zeitformat.

Jede Hilfe bei der Lösung dieses Problems ist willkommen.

Antwort

1

Plan

  • Verwendung pd.to_datetime%H:%M Format Timestamp s zu konvertieren. Ja, die Daten werden nicht korrekt sein. Aber das wird nicht Sache einmal verwenden wir diff
  • groupby Spalte 'A' und diff verwenden, um wiederum in Timedelta s
  • Verwendung pd.to_datetime wieder, so können wir dt.strftime und Format verwenden zurück zu '%H:%M'

pd.to_datetime(df.B).groupby(df.A).diff().fillna(0) 

1 00:00:00 
2 00:03:00 
3 00:06:00 
4 00:00:00 
5 00:06:00 
6 00:05:00 
Name: B, dtype: timedelta64[ns] 

pd.to_datetime(
    pd.to_datetime(df.B).groupby(df.A).diff().fillna(0) 
).dt.strftime('%H:%M') 

1 00:00 
2 00:03 
3 00:06 
4 00:00 
5 00:06 
6 00:05 
Name: B, dtype: object 

pd.to_datetime(df.B) \ 
    .groupby(df.A).diff() \ 
    .fillna(0).dt.total_seconds() \ 
    .div(60).astype(int) 

1 0 
2 3 
3 6 
4 0 
5 6 
6 5 
Name: B, dtype: int64 
+0

Danke für die Antwort. Sie haben jedoch die Spalte A nicht berücksichtigt. –