it-swarm.com.de

Python Pandas: Gruppiert die Datetime-Spalte in Stunden- und Minutenaggregationen

Dies scheint ziemlich einfach zu sein, aber nach fast einem ganzen Tag habe ich die Lösung nicht gefunden. Ich habe meinen Datenrahmen mit read_csv geladen und habe eine Datums- und eine Zeitspalte einfach analysiert, kombiniert und indiziert. Jetzt möchte ich in der Lage sein, die Form zu ändern und Berechnungen basierend auf Stunden- und Minutengruppierungen durchzuführen, die denen ähneln, in denen Sie vorgehen können Excel-Pivot.

Ich weiß, wie eine Neuabtastung auf Stunde oder Minute durchgeführt wird, aber es wird der mit jeder Stunde/Minute verknüpfte Datumsanteil beibehalten, während ich den Datensatz NUR auf Stunde und Minute aggregieren möchte, ähnlich wie beim Gruppieren in Excel-Pivots und Auswählen von "Stunde" und "Minute", aber nichts anderes auswählen.

Jede Hilfe wäre sehr dankbar.

48
horatio1701d

Kannst du nicht, wo df dein DataFrame ist:

times = pd.to_datetime(df.timestamp_col)
df.groupby([times.hour, times.minute]).value_col.sum()
45
Wes McKinney

Wes 'Code hat bei mir nicht funktioniert. Die DatetimeIndex-Funktion ( docs ) hat jedoch Folgendes ausgeführt:

times = pd.DatetimeIndex(data.datetime_col)
grouped = df.groupby([times.hour, times.minute])

Das DatetimeIndex-Objekt ist eine Darstellung der Zeiten in Pandas. Die erste Zeile erstellt ein Array der Datumsangaben. Die zweite Zeile verwendet dieses Array, um die Stunden- und Minutendaten für alle Zeilen abzurufen, sodass die Daten nach diesen Werten gruppiert werden können ( docs ).

34
Nix G-D

Kam über dieses, als ich nach dieser Art von groupby suchte. Der obige Code von Wes hat bei mir nicht funktioniert. Ich bin mir nicht sicher, ob es daran liegt, dass sich pandas im Laufe der Zeit geändert hat.

Im pandas 0.16.2, was ich am Ende gemacht habe war:

grp = data.groupby(by=[data.datetime_col.map(lambda x : (x.hour, x.minute))])
grp.count()

Sie hätten (Stunde, Minute) Tupel als gruppierten Index. Wenn Sie einen Multi-Index wünschen:

grp = data.groupby(by=[data.datetime_col.map(lambda x : x.hour),
                       data.datetime_col.map(lambda x : x.minute)])
15
WillZ