Ciclo para promedio con pandas

publicado por: Anonymous

introducir la descripción de la imagen aquí

Buenas tengo el siguiente df, la cuestión es que necesito filtrar las velocidades por hora y con estas sacar un promedio, estoy utlizando el siguiente código:

import pandas as pd
import numpy as np
df = pd.read_csv('df.csv')
b = df[(df['Fecha'] >= '2010-04-01') & (df['Fecha'] 
<= '2010-04-30') & (df['Hora'] == '22:00:00')]
c = b['Velocidad (m/s)']
d = np.nanmean(c)

Y quisiera saber si hay forma de poder hacer un for o algo similar que recorra todas las horas y no tener que estar cambiandolas manualmente.

Gracias de antemano.

solución

Ten cuidado cuando realizes comparaciones con cadenas que representan fechas como si lo fueran. La comparación se hace mediante orden lexicográfico, según que formato tenga la fecha podemos encontrarnos con resultados no deseados. Independientemente de lo anterior, parsear la fecha a datetime o Datetimeindex te va a permitir usar muchos métodos asociados, por ejemplo agrupar por horas, meses, etc de forma simple, resampling…

Vamos a partir del siguiente DataFrame que es un ejemplo basado en el que muestras:

import pandas as pd
from io import StringIO

csv = StringIO('''
Fecha,Hora,Velocidad (m/s)
2010-01-01,00:00:00,3.9
2010-01-01,01:00:00,4.2
2010-01-01,02:00:00,3.5
2010-01-02,00:00:00,2.5
2010-01-02,01:00:00,2.8
2010-01-02,01:00:00,3.4
2010-02-01,00:00:00,2.1
2010-02-01,01:00:00,1.6
2010-02-01,02:00:00,4.2
2010-02-02,00:00:00,2.5
2010-02-02,01:00:00,3.7
2010-02-02,02:00:00,3.2
''')


df = pd.read_csv(csv, dayfirst=True, index_col=0,
                 parse_dates = {'Fecha_': ['Fecha','Hora']}
                 )

Parseamos las columnas Fecha y Hora para agrupar ambas en un DatetimeIndex, el DataFrame que obtenemos es:

>>> df
                     Velocidad (m/s)
Fecha_                             
2010-01-01 00:00:00             3.9
2010-01-01 01:00:00             4.2
2010-01-01 02:00:00             3.5
2010-01-02 00:00:00             2.5
2010-01-02 01:00:00             2.8
2010-01-02 01:00:00             3.4
2010-02-01 00:00:00             2.1
2010-02-01 01:00:00             1.6
2010-02-01 02:00:00             4.2
2010-02-02 00:00:00             2.5
2010-02-02 01:00:00             3.7
2010-02-02 02:00:00             3.2

Una vez que tenemos esto, dado que quieres obtener la media de cada hora por meses basta con usar groupby, agrupar por mes y por hora y aplicar mean:

medias = df.groupby([df.index.year,
                     df.index.month,
                     df.index.hour])['Velocidad (m/s)'].mean()

medias.index.names = ["Año", "Mes", "Hora"]

Con esto ya tenemos una Serie con las medias por hora de cada mes:

>>> medias

Año   Mes  Hora
2010  1    0       3.200000
           1       3.466667
           2       3.500000
      2    0       2.300000
           1       2.650000
           2       3.700000
Name: Velocidad (m/s), dtype: float64
Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *