¿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 !!

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

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()

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()
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.