Como calcular as médias diárias do meio-dia ao meio-dia com os pandas?

8

Eu sou bastante novo em python e pandas, então peço desculpas por quaisquer futuros mal-entendidos.

Eu tenho um DataFrame pandas com valores horários, parecido com isto:

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

Agora, preciso calcular os valores médios de 24h para cada coluna, começando de 01/04/2014 a 02/04/2014 11:00 Portanto, quero médias diárias de meio-dia a meio-dia.

Infelizmente, não tenho ideia de como fazer isso. Li algumas sugestões para usar o groupby, mas não sei como ...

Muito obrigado antecipadamente! Qualquer ajuda é apreciada !!

Preciso de ajuda
fonte

Respostas:

7

O baseargumento.

Como o dia é 24 horas, uma base de 12 iniciaria o agrupamento do meio-dia ao meio-dia. A reamostragem fornece todos os dias intermediários, para que você possa, .dropna(how='all')se não precisar da base completa. (Presumo que você tenha um DatetimeIndex, caso contrário, você pode usar o onargumento resample para especificar sua coluna datetime.)

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
fonte
Nunca explorou o arg base, obrigado por isso :)
anky
Definitivamente, um dos argumentos subutilizados. Provavelmente porque muitas vezes é mais simples / mais óbvio fazer a manipulação você mesmo: D
ALollz 14/11/19
Muito obrigado!! Funciona perfeitamente!
needhelp
3

Você pode subtrair seu tempo e grupo por:

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

Você pode mudar as horas por 12 horas e reamostrar no nível do dia.

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
fonte