Esto podría ser más fácil de explicar con un conjunto de datos de muestra.
Crear datos de muestra
Asumamos que tenemos una sola columna de marcas de tiempo, datey la otra columna nos gustaría realizar una agregación en, 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
Hay varias formas de agrupar por año
- Utilice el descriptor de acceso dt con
yearpropiedad
- Ponga
dateen índice y use la función anónima para acceder al año
resampleMétodo de uso
- Convertir a período pandas
.dtaccesor con yearpropiedad
Cuando tiene una columna (y no un índice) de marcas de tiempo de pandas, puede acceder a muchas más propiedades y métodos adicionales con el dtdescriptor de acceso. Por ejemplo:
df['date'].dt.year
0 2012
1 2012
2 2015
3 2015
4 2015
Name: date, dtype: int64
Podemos usar esto para formar nuestros grupos y calcular algunas agregaciones en una columna en particular:
df.groupby(df['date'].dt.year)['a'].agg(['sum', 'mean', 'max'])
sum mean max
date
2012 14 7 9
2015 6 2 3
poner la fecha en el índice y usar la función anónima para acceder al año
Si establece la columna de fecha como índice, se convierte en un DateTimeIndex con las mismas propiedades y métodos que el dtdescriptor de acceso proporciona a las columnas normales
df1 = df.set_index('date')
df1.index.year
Int64Index([2012, 2012, 2015, 2015, 2015], dtype='int64', name='date')
Curiosamente, al usar el método groupby, puede pasarle una función. Esta función se pasará implícitamente al índice del DataFrame. Entonces, podemos obtener el mismo resultado de arriba con lo siguiente:
df1.groupby(lambda x: x.year)['a'].agg(['sum', 'mean', 'max'])
sum mean max
2012 14 7 9
2015 6 2 3
Usa el resamplemétodo
Si su columna de fecha no está en el índice, debe especificar la columna con el onparámetro. También debe especificar el alias de desplazamiento como una cadena.
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
Convertir a período pandas
También puede convertir la columna de fecha en un objeto Pandas Period. Debemos pasar el alias de desplazamiento como una cadena para determinar la duración del período.
df['date'].dt.to_period('A')
0 2012
1 2012
2 2015
3 2015
4 2015
Name: date, dtype: object
Entonces podemos usar esto como un grupo
df.groupby(df['date'].dt.to_period('Y'))['a'].agg(['sum', 'mean', 'max'])
sum mean max
2012 14 7 9
2015 6 2 3