熊猫随时间变化的有效聚集

时间:2018-10-15 10:37:40

标签: python-3.x pandas datetime dataframe python-datetime

我有每周格式的数据,希望以有效的方式汇总到每月的水平。我目前正在做的是将DataFrame的索引从几周重新转换为几天,然后将每个月中几天的平均值作为平均值。这种方法很慢,尤其是在处理大数据时。我正在寻找一种更有效的方法。

简化示例

每周数据:

dates = ['2018-8-20','2018-8-27','2018-9-10']
values = [1,2,3]

df = pd.Series(values, index=pd.to_datetime(dates))
df.index.name = 'week'
df.name = 'val'

转为每天(请注意,我将继续填写空值):

date_list = [df.index.min() + datetime.timedelta(days=x) for x in range(0, (df.index.max()-df.index.min()).days+1)]
dfDaily = df.reindex(date_list)
dfDaily=  dfDaily.fillna(method='ffill')

dfDaily = pd.DataFrame(dfDaily)
dfDaily['month'] = dfDaily.index.month
dfDaily['year'] = dfDaily.index.year

给出:

            val  month  year
week                        
2018-08-20  1.0      8  2018
2018-08-21  1.0      8  2018
2018-08-22  1.0      8  2018
2018-08-23  1.0      8  2018
2018-08-24  1.0      8  2018
2018-08-25  1.0      8  2018
2018-08-26  1.0      8  2018
2018-08-27  2.0      8  2018
2018-08-28  2.0      8  2018
2018-08-29  2.0      8  2018
2018-08-30  2.0      8  2018
2018-08-31  2.0      8  2018
2018-09-01  2.0      9  2018
2018-09-02  2.0      9  2018
2018-09-03  2.0      9  2018
2018-09-04  2.0      9  2018
2018-09-05  2.0      9  2018
2018-09-06  2.0      9  2018
2018-09-07  2.0      9  2018
2018-09-08  2.0      9  2018
2018-09-09  2.0      9  2018
2018-09-10  3.0      9  2018    

汇总到每月水平:

dfMonthly = dfDaily.groupby(['year', 'month']).val.mean().reset_index()

产生所需的DataFrame:;

   year  month       val
0  2018      8  1.416667
1  2018      9  2.100000

1 个答案:

答案 0 :(得分:1)

您可以简化您的解决方案,但是不确定性能是否可以大幅度改善:

date_list = pd.date_range(df.index.min(), df.index.max(), freq='d')
s = df.reindex(date_list, method='ffill')

dfDaily = s.groupby([s.index.year.rename('year'),
                     s.index.month.rename('month')]).mean().reset_index()
print (dfDaily)
   year  month       val
0  2018      8  1.416667
1  2018      9  2.100000