Dies ist möglicherweise einfacher mit einem Beispieldatensatz zu erklären.
Beispieldaten erstellen
Nehmen wir an, wir haben eine einzelne Spalte mit Zeitstempeln date
und eine weitere Spalte, für die wir eine Aggregation durchführen möchten a
.
df = pd.DataFrame({'date':pd.DatetimeIndex(['2012-1-1', '2012-6-1', '2015-1-1', '2015-2-1', '2015-3-1']),
'a':[9,5,1,2,3]}, columns=['date', 'a'])
df
date a
0 2012-01-01 9
1 2012-06-01 5
2 2015-01-01 1
3 2015-02-01 2
4 2015-03-01 3
Es gibt verschiedene Möglichkeiten, nach Jahr zu gruppieren
- Verwenden Sie den dt-Accessor mit
year
Eigenschaft
- Geben Sie einen
date
Index ein und verwenden Sie die anonyme Funktion, um auf das Jahr zuzugreifen
- Verwenden Sie die
resample
Methode
- In Pandas konvertieren Periode
.dt
Accessor mit year
Eigentum
Wenn Sie eine Spalte (und keinen Index) von Pandas-Zeitstempeln haben, können Sie mit dem dt
Accessor auf viele weitere Eigenschaften und Methoden zugreifen . Zum Beispiel:
df['date'].dt.year
0 2012
1 2012
2 2015
3 2015
4 2015
Name: date, dtype: int64
Wir können dies verwenden, um unsere Gruppen zu bilden und einige Aggregationen für eine bestimmte Spalte zu berechnen:
df.groupby(df['date'].dt.year)['a'].agg(['sum', 'mean', 'max'])
sum mean max
date
2012 14 7 9
2015 6 2 3
Setzen Sie das Datum in den Index und verwenden Sie die anonyme Funktion, um auf das Jahr zuzugreifen
Wenn Sie die Datumsspalte als Index festlegen, wird sie zu einem DateTimeIndex mit denselben Eigenschaften und Methoden wie der dt
Accessor normale Spalten
df1 = df.set_index('date')
df1.index.year
Int64Index([2012, 2012, 2015, 2015, 2015], dtype='int64', name='date')
Interessanterweise können Sie bei Verwendung der groupby-Methode eine Funktion übergeben. Diese Funktion wird implizit an den DataFrame-Index übergeben. So können wir das gleiche Ergebnis von oben mit folgendem erhalten:
df1.groupby(lambda x: x.year)['a'].agg(['sum', 'mean', 'max'])
sum mean max
2012 14 7 9
2015 6 2 3
Verwenden Sie die resample
Methode
Wenn sich Ihre Datumsspalte nicht im Index befindet, müssen Sie die Spalte mit dem on
Parameter angeben . Sie müssen auch den Offset-Alias als Zeichenfolge angeben .
df.resample('AS', on='date')['a'].agg(['sum', 'mean', 'max'])
sum mean max
date
2012-01-01 14.0 7.0 9.0
2013-01-01 NaN NaN NaN
2014-01-01 NaN NaN NaN
2015-01-01 6.0 2.0 3.0
In Pandas konvertieren Periode
Sie können die Datumsspalte auch in ein Pandas Period-Objekt konvertieren. Wir müssen den Offset-Alias als Zeichenfolge übergeben, um die Länge der Periode zu bestimmen.
df['date'].dt.to_period('A')
0 2012
1 2012
2 2015
3 2015
4 2015
Name: date, dtype: object
Wir können dies dann als Gruppe verwenden
df.groupby(df['date'].dt.to_period('Y'))['a'].agg(['sum', 'mean', 'max'])
sum mean max
2012 14 7 9
2015 6 2 3