Це може бути простіше пояснити на прикладі набору даних.
Створення зразкових даних
Давайте припустимо , що у нас є один стовпець позначки часу, date
і ще один стовпець , ми хотіли б виконати агрегацію на, 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
Існує кілька способів групування за роками
- Використовуйте аксесуар dt із
year
властивістю
- Вставте
date
індекс та використовуйте анонімну функцію для доступу до року
- Використовуйте
resample
метод
- Перетворити на панди Період
.dt
аксесуар з year
майном
Коли у вас є стовпець (а не індекс) панд Timestamps, ви можете отримати доступ до багатьох додаткових властивостей та методів за допомогою dt
засобу доступу. Наприклад:
df['date'].dt.year
0 2012
1 2012
2 2015
3 2015
4 2015
Name: date, dtype: int64
Ми можемо використовувати це для формування наших груп та обчислення деяких агрегатів у певному стовпці:
df.groupby(df['date'].dt.year)['a'].agg(['sum', 'mean', 'max'])
sum mean max
date
2012 14 7 9
2015 6 2 3
помістіть дату в індекс та використовуйте анонімну функцію для доступу до року
Якщо стовпець дати встановити як індекс, він стає DateTimeIndex з тими ж властивостями та методами, що і доступ, який dt
надає звичайні стовпці
df1 = df.set_index('date')
df1.index.year
Int64Index([2012, 2012, 2015, 2015, 2015], dtype='int64', name='date')
Цікаво, що, використовуючи метод groupby, ви можете передати йому функцію. Ця функція буде неявно передана індексу DataFrame. Отже, ми можемо отримати той самий результат згори із наступним:
df1.groupby(lambda x: x.year)['a'].agg(['sum', 'mean', 'max'])
sum mean max
2012 14 7 9
2015 6 2 3
Використовуйте resample
метод
Якщо стовпця дати немає в індексі, необхідно вказати стовпець із on
параметром. Вам також потрібно вказати псевдонім зміщення як рядок.
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
Перетворити на панди Період
Ви також можете перетворити стовпець дати в об'єкт Pandas Period. Ми повинні передати псевдонім зміщення як рядок, щоб визначити довжину Періоду.
df['date'].dt.to_period('A')
0 2012
1 2012
2 2015
3 2015
4 2015
Name: date, dtype: object
Потім ми можемо використовувати це як групу
df.groupby(df['date'].dt.to_period('Y'))['a'].agg(['sum', 'mean', 'max'])
sum mean max
2012 14 7 9
2015 6 2 3