Promedio de recuento diario de registros por mes en un DataFrame de Pandas

Tengo un DataFrame de pandas con una columna TIMESTAMP , que es del tipo de datos datetime64. Por favor, tenga en cuenta que inicialmente esta columna no está configurada como índice; el índice es solo enteros regulares, y las primeras filas se ven así:

  TIMESTAMP TYPE 0 2014-07-25 11:50:30.640 2 1 2014-07-25 11:50:46.160 3 2 2014-07-25 11:50:57.370 2 

Hay un número arbitrario de registros para cada día y puede haber días sin datos. Lo que estoy tratando de obtener es el número promedio de registros diarios por mes y luego graficarlo como un gráfico de barras con meses en el eje x (abril de 2014, mayo de 2014 … etc.). Logré calcular estos valores usando el siguiente código

 dfWIM.index = dfWIM.TIMESTAMP for i in range(dfWIM.TIMESTAMP.dt.year.min(),dfWIM.TIMESTAMP.dt.year.max()+1): for j in range(1,13): print dfWIM[(dfWIM.TIMESTAMP.dt.year == i) & (dfWIM.TIMESTAMP.dt.month == j)].resample('D', how='count').TIMESTAMP.mean() 

que da la siguiente salida:

 nan nan 3100.14285714 6746.7037037 9716.42857143 10318.5806452 9395.56666667 9883.64516129 8766.03225806 9297.78571429 10039.6774194 nan nan nan 

Esto está bien como está, y con un poco más de trabajo, puedo mapear los resultados para corregir los nombres de los meses y luego trazar el gráfico de barras. Sin embargo, no estoy seguro de si esta es la forma correcta / mejor, y sospecho que podría haber una manera más fácil de obtener los resultados utilizando Pandas.

Me encantaría escuchar lo que piensas. ¡Gracias!

NOTA: Si no configuro la columna TIMESTAMP como el índice, obtengo un error de “operación de reducción” significa “no permitido para este tipo de dtype”.

Creo que querrá hacer dos rondas de groupby , primero agrupar por día y contar las instancias, y luego agrupar por mes y calcular la media de los recuentos diarios. Podrías hacer algo como esto.

Primero generaré algunos datos falsos que se parecen a los suyos:

 import pandas as pd # make 1000 random times throughout the year N = 1000 times = pd.date_range('2014', '2015', freq='min') ind = np.random.permutation(np.arange(len(times)))[:N] data = pd.DataFrame({'TIMESTAMP': times[ind], 'TYPE': np.random.randint(0, 10, N)}) data.head() 

introduzca la descripción de la imagen aquí

Ahora haré los dos groupbys usando pd.TimeGrouper y pd.TimeGrouper los conteos promedio mensuales:

 import seaborn as sns # for nice plot styles (optional) daily = data.set_index('TIMESTAMP').groupby(pd.TimeGrouper(freq='D'))['TYPE'].count() monthly = daily.groupby(pd.TimeGrouper(freq='M')).mean() ax = monthly.plot(kind='bar') 

introduzca la descripción de la imagen aquí

El formato a lo largo del eje x deja mucho que desear, pero puede modificarlo si es necesario.