我有每周格式的数据,希望以有效的方式汇总到每月的水平。我目前正在做的是将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
答案 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