首页 > 解决方案 > Pandas 中随时间推移的高效聚合索引

问题描述

我有每周格式的数据,我想以有效的方式汇总到每月级别。我目前正在做的是将 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

标签: python-3.xpandasdatetimedataframepython-datetime

解决方案


您可以简化您的解决方案,但不确定性能是否有很大提高:

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

推荐阅读