¿Cómo calcular los promedios diarios del mediodía al mediodía con los pandas?

8

Soy bastante nuevo en python y pandas, así que me disculpo por cualquier malentendido futuro.

Tengo un DataFrame de pandas con valores por hora, que se parece a esto:

2014-04-01 09:00:00 52.9    41.1    36.3

2014-04-01 10:00:00 56.4    41.6    70.8

2014-04-01 11:00:00 53.3    41.2    49.6

2014-04-01 12:00:00 50.4    39.5    36.6

2014-04-01 13:00:00 51.1    39.2    33.3

2016-11-30 16:00:00 16.0    13.5    36.6

2016-11-30 17:00:00 19.6    17.4    44.3

Ahora necesito calcular los valores promedio de 24 horas para cada columna a partir del 1 de abril de 2014 a las 12:00 a 2 de abril de 2014, así que quiero promedios diarios de mediodía a mediodía.

Lamentablemente, no tengo idea de cómo hacerlo. He leído algunas sugerencias para usar groupby, pero realmente no sé cómo ...

¡Muchas gracias por adelantado! Cualquier ayuda es apreciada !!

Necesitas ayuda
fuente

Respuestas:

7

El baseargumento

Un día es de 24 horas, por lo que una base de 12 comenzaría la agrupación de mediodía a mediodía. La nueva muestra le brinda todos los días intermedios, por lo que podría .dropna(how='all')hacerlo si no necesita la base completa. (Supongo que tiene un DatetimeIndex, si no puede usar el onargumento de remuestreo para especificar su columna de fecha y hora).

df.resample('24H', base=12).mean()
#df.groupby(pd.Grouper(level=0, base=12, freq='24H')).mean() # Equivalent 

                         1      2          3
0                                           
2014-03-31 12:00:00  54.20  41.30  52.233333
2014-04-01 12:00:00  50.75  39.35  34.950000
2014-04-02 12:00:00    NaN    NaN        NaN
2014-04-03 12:00:00    NaN    NaN        NaN
2014-04-04 12:00:00    NaN    NaN        NaN
...                    ...    ...        ...
2016-11-26 12:00:00    NaN    NaN        NaN
2016-11-27 12:00:00    NaN    NaN        NaN
2016-11-28 12:00:00    NaN    NaN        NaN
2016-11-29 12:00:00    NaN    NaN        NaN
2016-11-30 12:00:00  17.80  15.45  40.450000
ALollz
fuente
nunca exploró el argumento base, gracias por eso :)
anky
Definitivamente uno de los argumentos subutilizados. Probablemente porque a menudo es más simple / más obvio hacer la manipulación usted mismo: D
ALollz
¡¡Muchas gracias!! ¡Funciona perfectamente!
NeedHelp
3

Puedes restar tu tiempo y grupo por:

df.groupby((df.index - pd.to_timedelta('12:00:00')).normalize()).mean()
Quang Hoang
fuente
0

Puede cambiar las horas en 12 horas y volver a muestrear a nivel de día.

from io import StringIO
import pandas as pd

data = """
2014-04-01 09:00:00,52.9,41.1,36.3
2014-04-01 10:00:00,56.4,41.6,70.8
2014-04-01 11:00:00,53.3,41.2,49.6
2014-04-01 12:00:00,50.4,39.5,36.6
2014-04-01 13:00:00,51.1,39.2,33.3
2016-11-30 16:00:00,16.0,13.5,36.6
2016-11-30 17:00:00,19.6,17.4,44.3
"""

df = pd.read_csv(StringIO(data), sep=',', header=None, index_col=0)

df.index = pd.to_datetime(df.index)
# shift by 12 hours
df.index = df.index - pd.Timedelta(hours=12)
# resample and drop na rows
df.resample('D').mean().dropna()
mjspier
fuente