Функция Python Pandas groupby с динамическими параметрами для ежемесячного, ежечасного

В течение нескольких лет у меня есть часовой блок данных в следующем формате:

Date/Time Value 01.03.2010 00:00:00 60 01.03.2010 01:00:00 50 01.03.2010 02:00:00 52 01.03.2010 03:00:00 49 . . . 31.12.2013 23:00:00 77 

и я использую следующий код, чтобы получить среднее значение каждого часа за каждый год в данных:

 In [11]: year_hour_means = df1.groupby(lambda x: (x.year, x.hour)).mean() In [12]: year_hour_means Out[12]: Value (2010, 0) 60 (2010, 1) 50 (2010, 2) 52 (2010, 3) 49 

Теперь я хочу включить этот код в функцию, поэтому я могу динамически выбирать группировку часов по кварталам, годам или месяцам, а также делать это для определенного количества данных.

Я написал следующую функцию:

 def datameans(df, avggrouper1, avggrouper2, startdate, enddate): import pandas as pd df_hour_means = df[startdate:enddate] df_hour_means = df_hour_means.groupby(lambda x: (avggrouper1, avggrouper2)).mean() print df_hour_means.to_string() df_hour_means.plot() pass 

Я вызываю функцию как это

 datameans(dataframe, 'x.quarter', 'x.hour' , '2010-01-01 00:00:00', '2012-12-31 23:00:00') 

К сожалению, это не работает. Может ли кто-нибудь помочь мне, как я мог бы годами, кварталами, месяцами и днями использовать разные параметры для расчета средств?

Я думаю, что вы ищете getattr :

 def datameans(df, avggrouper1, avggrouper2, startdate, enddate): df_hour_means = df[startdate:enddate] df_hour_means = df_hour_means.groupby( lambda x: (getattr(x,avggrouper1), getattr(x,avggrouper2))).mean() print df_hour_means.to_string() df_hour_means.plot() 

и (как ответ Матти Джона), вы вызывали бы datameans с

 datameans(dataframe, 'quarter', 'hour' , '2010-01-01 00:00:00', '2012-12-31 23:00:00') 

Кроме того, используйте operator.attrgetter :

 import operator keyfunc = operator.attrgetter(avggrouper1, avggrouper2) df_hour_means = df_hour_means.groupby(keyfunc).mean() 
Interesting Posts