python-3.x - 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
解决方案
您可以简化您的解决方案,但不确定性能是否有很大提高:
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
推荐阅读
- .htaccess - 拒绝访问具有特定扩展名的文件
- github - Github Actions 在部署前替换字符串
- c++ - 为什么正方形的第二列没有打印在它的例外位置?
- mysql - MySQL 8.0.x 中令人困惑的 SELECT FOR UPDATE 行为
- javascript - 想要将元素的最小值和最大值存储到对象
- tensorflow - 绘制测试和训练集的损失与历元历史
- outlook - Outlook 日历会议邀请的深层链接(如 Mailto),如何设置提醒?
- typescript - 使用 native-base 和 react-native-web 的 React Native App 无法在 Web 上编译
- linux - 如何从wsl调用powershell来使用语音合成器
- javascript - 将值传递给函数返回 null - vanilla javascript