Może to być łatwiejsze do wyjaśnienia za pomocą przykładowego zbioru danych.
Utwórz przykładowe dane
Załóżmy, że mamy jedną kolumnę znaczniki czasu, date
a inną kolumnę chcielibyśmy przeprowadzić na agregację, 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
Istnieje kilka sposobów grupowania według roku
- Użyj akcesorium dt z
year
właściwością
- Wprowadź
date
indeks i użyj funkcji anonimowej, aby uzyskać dostęp do roku
- Użyj
resample
metody
- Konwertuj na okres pandy
.dt
akcesor z year
własnością
Gdy masz kolumnę (a nie indeks) sygnatur czasowych pand, możesz uzyskać dostęp do wielu dodatkowych właściwości i metod za pomocą dt
akcesorium. Na przykład:
df['date'].dt.year
0 2012
1 2012
2 2015
3 2015
4 2015
Name: date, dtype: int64
Możemy użyć tego do utworzenia naszych grup i obliczenia niektórych agregacji w określonej kolumnie:
df.groupby(df['date'].dt.year)['a'].agg(['sum', 'mean', 'max'])
sum mean max
date
2012 14 7 9
2015 6 2 3
wstaw datę do indeksu i użyj funkcji anonimowej, aby uzyskać dostęp do roku
Jeśli ustawisz kolumnę daty jako indeks, stanie się ona DateTimeIndex z tymi samymi właściwościami i metodami, jak metoda dt
akcesora, która daje normalne kolumny
df1 = df.set_index('date')
df1.index.year
Int64Index([2012, 2012, 2015, 2015, 2015], dtype='int64', name='date')
Co ciekawe, korzystając z metody groupby, możesz przekazać jej funkcję. Ta funkcja zostanie niejawnie przekazana do indeksu DataFrame. Tak więc możemy uzyskać ten sam wynik z góry, wykonując następujące czynności:
df1.groupby(lambda x: x.year)['a'].agg(['sum', 'mean', 'max'])
sum mean max
2012 14 7 9
2015 6 2 3
Użyj resample
metody
Jeśli Twoja kolumna daty nie znajduje się w indeksie, musisz określić kolumnę za pomocą on
parametru. Musisz również określić alias przesunięcia jako ciąg.
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
Konwertuj na okres pandy
Możesz także przekonwertować kolumnę daty na obiekt Pandy Period. Musimy przekazać alias przesunięcia jako ciąg znaków, aby określić długość okresu.
df['date'].dt.to_period('A')
0 2012
1 2012
2 2015
3 2015
4 2015
Name: date, dtype: object
Następnie możemy użyć tego jako grupy
df.groupby(df['date'].dt.to_period('Y'))['a'].agg(['sum', 'mean', 'max'])
sum mean max
2012 14 7 9
2015 6 2 3