Considere un archivo csv:
string,date,number
a string,2/5/11 9:16am,1.0
a string,3/5/11 10:44pm,2.0
a string,4/22/11 12:07pm,3.0
a string,4/22/11 12:10pm,4.0
a string,4/29/11 11:59am,1.0
a string,5/2/11 1:41pm,2.0
a string,5/2/11 2:02pm,3.0
a string,5/2/11 2:56pm,4.0
a string,5/2/11 3:00pm,5.0
a string,5/2/14 3:02pm,6.0
a string,5/2/14 3:18pm,7.0
Puedo leer esto y reformatear la columna de fecha en formato de fecha y hora:
b=pd.read_csv('b.dat')
b['date']=pd.to_datetime(b['date'],format='%m/%d/%y %I:%M%p')
He intentado agrupar los datos por mes. Parece que debería haber una forma obvia de acceder al mes y agrupar por eso. Pero parece que no puedo hacerlo. ¿Alguien sabe cómo?
Lo que estoy intentando actualmente es volver a indexar por la fecha:
b.index=b['date']
Puedo acceder al mes así:
b.index.month
Sin embargo, parece que no puedo encontrar una función para agrupar por mes.
python
pandas
datetime
pandas-groupby
atomh33ls
fuente
fuente
resample
(cuando proporciona la funcionalidad que necesita) o usarTimeGrouper
:df.groupby(pd.TimeGrouper(freq='M'))
df.groupby(pd.TimeGrouper(freq='M')).sum()
odf.groupby(pd.TimeGrouper(freq='M')).mean()
pd.TimeGrouper
ha quedado en desuso en favor depd.Grouper
, que es un poco más flexible, pero todavía tomafreq
ylevel
argumentos.to_datetime
.b
se le da un índice después de leerse desde CSV. Agregueb.index = pd.to_datetime(b['date'],format='%m/%d/%y %I:%M%p')
después de la líneab = pd.read_csv('b.dat')
. [Acabo de editar la respuesta también.](actualización: 2018)
Tenga en cuenta que
pd.Timegrouper
está depreciado y se eliminará. Utilice en su lugar:df.groupby(pd.Grouper(freq='M'))
fuente
freq=...
) aquí . Algunos ejemplos sonfreq=D
para el día ,freq=B
para días laborables ,freq=W
de semanas o inclusofreq=Q
de trimestres .Una solución que evita MultiIndex es crear una nueva
datetime
configuración de columna día = 1. Luego agrupe por esta columna. Ejemplo trivial a continuación.df = pd.DataFrame({'Date': pd.to_datetime(['2017-10-05', '2017-10-20']), 'Values': [5, 10]}) # normalize day to beginning of month df['YearMonth'] = df['Date'] - pd.offsets.MonthBegin(1) # two alternative methods df['YearMonth'] = df['Date'] - pd.to_timedelta(df['Date'].dt.day-1, unit='D') df['YearMonth'] = df['Date'].map(lambda dt: dt.replace(day=1)) g = df.groupby('YearMonth') res = g['Values'].sum() # YearMonth # 2017-10-01 15 # Name: Values, dtype: int64
El beneficio sutil de esta solución es, a diferencia de que
pd.Grouper
el índice de agrupamiento se normaliza al comienzo de cada mes en lugar de al final y, por lo tanto, puede extraer grupos fácilmente a través deget_group
:some_group = g.get_group('2017-10-01')
Calcular el último día de octubre es un poco más engorroso.
pd.Grouper
, a partir de la versión 0.23, admite unconvention
parámetro, pero esto solo se aplica a unPeriodIndex
agrupador.fuente
Solución ligeramente alternativa a @ jpp's pero generando una
YearMonth
cadena:df['YearMonth'] = pd.to_datetime(df['Date']).apply(lambda x: '{year}-{month}'.format(year=x.year, month=x.month)) res = df.groupby('YearMonth')['Values'].sum()
fuente