2016-08-09 193 views
2

Ich habe ein Datenrahmen wie dieseWie konvertiert man ein (möglicherweise negatives) Pandas TimeDelta in Minuten (float)?

df[['timestamp_utc','minute_ts','delta']].head() 
Out[47]: 
      timestamp_utc   minute_ts     delta 
0 2015-05-21 14:06:33.414 2015-05-21 12:06:00 -1 days +21:59:26.586000 
1 2015-05-21 14:06:33.414 2015-05-21 12:07:00 -1 days +22:00:26.586000 
2 2015-05-21 14:06:33.414 2015-05-21 12:08:00 -1 days +22:01:26.586000 
3 2015-05-21 14:06:33.414 2015-05-21 12:09:00 -1 days +22:02:26.586000 
4 2015-05-21 14:06:33.414 2015-05-21 12:10:00 -1 days +22:03:26.586000 

Wo df['delta']=df.minute_ts-df.timestamp_utc

timestamp_utc  datetime64[ns] 
minute_ts   datetime64[ns] 
delta   timedelta64[ns] 

Problem ist, ich möchte die Anzahl (möglicherweise negative) Minuten zwischen timestamp_utc und minutes_ts bekommen, die Sekunden ohne Berücksichtigung Komponente.

Also für die erste Zeile möchte ich -120 bekommen. In der Tat ist 2015-05-21 12:06:00 120 Minuten vor 2015-05-21 14:06:33.414.

Was ist der pandaesque Weg, es zu tun?

Vielen Dank!

Antwort

1

können Sie verwenden:

df['a'] = df['delta']/np.timedelta64(1, 'm') 
print (df) 
      timestamp_utc   minute_ts     delta \ 
0 2015-05-21 14:06:33.414 2015-05-21 12:06:00 -1 days +21:59:26.586000 
1 2015-05-21 14:06:33.414 2015-05-21 12:07:00 -1 days +22:00:26.586000 
2 2015-05-21 14:06:33.414 2015-05-21 12:08:00 -1 days +22:01:26.586000 
3 2015-05-21 14:06:33.414 2015-05-21 12:09:00 -1 days +22:02:26.586000 
4 2015-05-21 14:06:33.414 2015-05-21 12:10:00 -1 days +22:03:26.586000 

      a 
0 -120.5569 
1 -119.5569 
2 -118.5569 
3 -117.5569 
4 -116.5569 

Und dann konvertieren float zu int:

df['a'] = (df['delta']/np.timedelta64(1, 'm')).astype(int) 
print (df) 
      timestamp_utc   minute_ts     delta a 
0 2015-05-21 14:06:33.414 2015-05-21 12:06:00 -1 days +21:59:26.586000 -120 
1 2015-05-21 14:06:33.414 2015-05-21 12:07:00 -1 days +22:00:26.586000 -119 
2 2015-05-21 14:06:33.414 2015-05-21 12:08:00 -1 days +22:01:26.586000 -118 
3 2015-05-21 14:06:33.414 2015-05-21 12:09:00 -1 days +22:02:26.586000 -117 
4 2015-05-21 14:06:33.414 2015-05-21 12:10:00 -1 days +22:03:26.586000 -116 
+0

danke jezrael, aber Sie sehen, 'a' enthält immer noch die Sekunden Teil. Ich will nur -120, nicht -120.5569 –

+1

kein Problem, gib mir eine Sekunde. – jezrael

+0

hehehe du bist zu schnell –

1

Sie die Timedelta object in Pandas verwenden können, und dann Bodenteilung in einer Liste Verständnis verwenden, um die Minuten zu berechnen . Beachten Sie, dass die Eigenschaft seconds von Timedelta die Anzahl der Sekunden (> = 0 und weniger als 1 Tag) zurückgibt, sodass Sie Tage explizit in die entsprechenden Minuten konvertieren müssen.

df = pd.DataFrame({'minute_ts': [pd.Timestamp('2015-05-21 12:06:00'), 
           pd.Timestamp('2015-05-21 12:07:00'), 
           pd.Timestamp('2015-05-21 12:08:00'), 
           pd.Timestamp('2015-05-21 12:09:00'), 
           pd.Timestamp('2015-05-21 12:10:00')], 
        'timestamp_utc': [pd.Timestamp('2015-05-21 14:06:33.414')] * 5}) 

df['minutes_neg'] = [td.days * 24 * 60 + td.seconds//60 
       for td in [pd.Timedelta(delta) 
          for delta in df.minute_ts - df.timestamp_utc]] 

df['minutes_pos'] = [td.days * 24 * 60 + td.seconds//60 
       for td in [pd.Timedelta(delta) 
          for delta in df.timestamp_utc - df.minute_ts]] 

>>> df 
      minute_ts   timestamp_utc minutes_neg minutes_pos 
0 2015-05-21 12:06:00 2015-05-21 14:06:33.414   -121   120 
1 2015-05-21 12:07:00 2015-05-21 14:06:33.414   -120   119 
2 2015-05-21 12:08:00 2015-05-21 14:06:33.414   -119   118 
3 2015-05-21 12:09:00 2015-05-21 14:06:33.414   -118   117 
4 2015-05-21 12:10:00 2015-05-21 14:06:33.414   -117   116 

Beachten Sie, dass die Minuten aufgrund der Unterteilung des Bodens um eins abgelaufen sind. Zum Beispiel: 90 // 60 = 1, aber -90 // 60 = -2. Sie können eins zu dem Ergebnis hinzufügen, wenn es negativ ist, aber da ist der Kantenfall von genau einer Minute (gemessen in Millisekunden-Genauigkeit) um eine Minute abgelaufen.

+0

danke Alexander aber funktioniert diese Lösung sowohl für positive und negative Deltas? –

+1

siehe oben bearbeiten. – Alexander

+0

danke. sonst könnte man den millisekunden teil von den zeitstempeln direkt loswerden, denkst du nicht? –