Berechnen Sie die Zeitdifferenz zwischen den Pandas Dataframe-Indizes

Ich versuche, eine Spalte von deltaT zu einem Dataframe hinzuzufügen, wobei deltaT die Zeitdifferenz zwischen den aufeinanderfolgenden Zeilen ist (wie in den Zeiträumen indiziert).

time value 2012-03-16 23:50:00 1 2012-03-16 23:56:00 2 2012-03-17 00:08:00 3 2012-03-17 00:10:00 4 2012-03-17 00:12:00 5 2012-03-17 00:20:00 6 2012-03-20 00:43:00 7 

Gewünschtes Ergebnis ist so etwas wie die folgenden (deltaT Einheiten in Minuten gezeigt):

 time value deltaT 2012-03-16 23:50:00 1 0 2012-03-16 23:56:00 2 6 2012-03-17 00:08:00 3 12 2012-03-17 00:10:00 4 2 2012-03-17 00:12:00 5 2 2012-03-17 00:20:00 6 8 2012-03-20 00:43:00 7 23 

  • Pandas dataframe Schicht Spalte nach Datum
  • Neue Spalte in Pandas DataFrame Python hinzufügen
  • Effizient ersetzen Werte aus einer Spalte in eine andere Spalte Pandas DataFrame
  • Wie kann man die Form eines Pandas Dataframs ändern (Zeilennummer mit einem "L")?
  • Tokening Worte in eine neue Spalte in einem Pandas Dataframe
  • Erstellen Sie Dataframes aus eindeutigen Wertpaaren, indem Sie über mehrere Spalten filtern
  • 2 Solutions collect form web for “Berechnen Sie die Zeitdifferenz zwischen den Pandas Dataframe-Indizes”

    Beachten Sie, dass dies numpy> = 1.7 verwendet, für numpy <1.7, siehe die Umwandlung hier: http://pandas.pydata.org/pandas-docs/dev/timeseries.html#time-deltas

    Ihr ursprünglicher Rahmen mit einem datetime index

     In [196]: df Out[196]: value 2012-03-16 23:50:00 1 2012-03-16 23:56:00 2 2012-03-17 00:08:00 3 2012-03-17 00:10:00 4 2012-03-17 00:12:00 5 2012-03-17 00:20:00 6 2012-03-20 00:43:00 7 In [199]: df.index Out[199]: <class 'pandas.tseries.index.DatetimeIndex'> [2012-03-16 23:50:00, ..., 2012-03-20 00:43:00] Length: 7, Freq: None, Timezone: None 

    Hier ist die timedelta64 von was du willst

     In [200]: df['tvalue'] = df.index In [201]: df['delta'] = (df['tvalue']-df['tvalue'].shift()).fillna(0) In [202]: df Out[202]: value tvalue delta 2012-03-16 23:50:00 1 2012-03-16 23:50:00 00:00:00 2012-03-16 23:56:00 2 2012-03-16 23:56:00 00:06:00 2012-03-17 00:08:00 3 2012-03-17 00:08:00 00:12:00 2012-03-17 00:10:00 4 2012-03-17 00:10:00 00:02:00 2012-03-17 00:12:00 5 2012-03-17 00:12:00 00:02:00 2012-03-17 00:20:00 6 2012-03-17 00:20:00 00:08:00 2012-03-20 00:43:00 7 2012-03-20 00:43:00 3 days, 00:23:00 

    Die Antwort herauszuholen, während ich den Tagesunterschied ignoriere (dein letzter Tag ist 3/20, vorher ist 3/17), ist eigentlich knifflig

     In [204]: df['ans'] = df['delta'].apply(lambda x: x / np.timedelta64(1,'m')).astype('int64') % (24*60) In [205]: df Out[205]: value tvalue delta ans 2012-03-16 23:50:00 1 2012-03-16 23:50:00 00:00:00 0 2012-03-16 23:56:00 2 2012-03-16 23:56:00 00:06:00 6 2012-03-17 00:08:00 3 2012-03-17 00:08:00 00:12:00 12 2012-03-17 00:10:00 4 2012-03-17 00:10:00 00:02:00 2 2012-03-17 00:12:00 5 2012-03-17 00:12:00 00:02:00 2 2012-03-17 00:20:00 6 2012-03-17 00:20:00 00:08:00 8 2012-03-20 00:43:00 7 2012-03-20 00:43:00 3 days, 00:23:00 23 

    Wir können eine Reihe mit sowohl Index als auch Werten erstellen, die den Indexschlüsseln mit to_series und dann die Unterschiede zwischen aufeinanderfolgenden Zeilen berechnen, die zu timedelta64[ns] dtype führen würden. Nachdem wir dies erhalten haben, können wir über die .dt Eigenschaft auf das Sekundenattribut des Zeitabschnitts zugreifen und jedes Element um 60 dividieren, um es in Minuten auszugeben (optional füllen den ersten Wert mit 0).

     In [13]: df['deltaT'] = df.index.to_series().diff().dt.seconds.div(60, fill_value=0) ...: df # use .astype(int) to obtain integer values Out[13]: value deltaT time 2012-03-16 23:50:00 1 0.0 2012-03-16 23:56:00 2 6.0 2012-03-17 00:08:00 3 12.0 2012-03-17 00:10:00 4 2.0 2012-03-17 00:12:00 5 2.0 2012-03-17 00:20:00 6 8.0 2012-03-20 00:43:00 7 23.0 

    Vereinfachung:

    Wenn wir diff :

     In [8]: ser_diff = df.index.to_series().diff() In [9]: ser_diff Out[9]: time 2012-03-16 23:50:00 NaT 2012-03-16 23:56:00 0 days 00:06:00 2012-03-17 00:08:00 0 days 00:12:00 2012-03-17 00:10:00 0 days 00:02:00 2012-03-17 00:12:00 0 days 00:02:00 2012-03-17 00:20:00 0 days 00:08:00 2012-03-20 00:43:00 3 days 00:23:00 Name: time, dtype: timedelta64[ns] 

    Sekunden bis Minuten Umwandlung:

     In [10]: ser_diff.dt.seconds.div(60, fill_value=0) Out[10]: time 2012-03-16 23:50:00 0.0 2012-03-16 23:56:00 6.0 2012-03-17 00:08:00 12.0 2012-03-17 00:10:00 2.0 2012-03-17 00:12:00 2.0 2012-03-17 00:20:00 8.0 2012-03-20 00:43:00 23.0 Name: time, dtype: float64 

    Wenn Sie annehmen möchten, dass Sie auch den dt.total_seconds möchten, wie er zuvor ausgeschlossen wurde (nur dt.total_seconds wurde berücksichtigt), würde dt.total_seconds Ihnen die verstrichene Dauer in Sekunden geben, mit welcher Minuten dann wieder durch Division berechnet werden konnten.

     In [12]: ser_diff.dt.total_seconds().div(60, fill_value=0) Out[12]: time 2012-03-16 23:50:00 0.0 2012-03-16 23:56:00 6.0 2012-03-17 00:08:00 12.0 2012-03-17 00:10:00 2.0 2012-03-17 00:12:00 2.0 2012-03-17 00:20:00 8.0 2012-03-20 00:43:00 4343.0 # <-- number of minutes in 3 days 23 minutes Name: time, dtype: float64 
    Python ist die beste Programmiersprache der Welt.