Pandas:按星期几和小时计算移动平均值
Pandas:按星期几和小时计算移动平均值
嗨,这个需求我太熟悉了!要高效实现按星期几+对应小时的4周移动平均,咱们用Pandas的分组+滚动窗口就能搞定,全是向量化操作,处理超长数据集也毫无压力。一步步来:
核心思路
我们的目标是把同一星期几、同一小时的所有数据点归为一组,然后在每个组内取过去4个连续的点(正好对应过去4周的同一时间点)计算平均值。这样既精准匹配需求,又能利用Pandas的内置优化保证效率。
代码实现(附详解)
假设你的原始数据是一个名为raw_series的Pandas Series,索引是Datetime类型(如果还不是,先转一下:raw_series = raw_series.rename_axis('Datetime').rename('Value').sort_index())。
1. 补全缺失小时并填充0
原始数据有不少缺失的小时段(比如2023-01-01 15:00、16:00),我们先把时间序列补成完整的小时级,缺失的位置填充0:
import pandas as pd # 生成从数据最早到最晚时间的完整小时索引 full_time_index = pd.date_range( start=raw_series.index.min(), end=raw_series.index.max(), freq='H' ) # 重新索引,缺失的小时填充0 full_series = raw_series.reindex(full_time_index, fill_value=0).reset_index().rename( columns={'index': 'Datetime', 0: 'Value'} )
2. 创建「星期几-小时」分组键
给每个时间点打上唯一的分组标识,把每周同一天同一小时的点归为一组:
# 用(星期几, 小时)的元组作为分组键,0=周一,6=周日 full_series['group_key'] = list(zip( full_series['Datetime'].dt.weekday, full_series['Datetime'].dt.hour ))
3. 分组计算4周滚动平均
在每个组内,用滚动窗口为4的平均值——因为每个组里的点是按时间顺序排列的,每4个连续点正好对应过去4周的同一星期几+小时的数据:
# 分组后计算滚动平均,transform会把结果映射回原数据行 full_series['4week_ma'] = full_series.groupby('group_key')['Value'].transform( lambda x: x.rolling(window=4, min_periods=1).mean() )
- 这里的
min_periods=1是说,如果某个组的前几个点不足4个(比如数据开头的前3周),也会用现有数据计算平均;如果要求必须凑够4周数据才计算,把min_periods改成4就行。
4. (可选)回到原始数据的时间索引
如果只需要保留原始数据中存在的时间点的结果,重新索引回去即可:
# 回到原始时间点,得到最终的移动平均结果 final_result = full_series.set_index('Datetime').loc[raw_series.index, '4week_ma']
为什么高效?
所有操作都是Pandas的内置向量化运算,groupby和rolling都是经过C优化的,完全避免了Python循环,处理百万级别的时间序列也能快速完成,完美适配你的长数据需求。
备注:内容来源于stack exchange,提问作者lpounng
相关产品推荐
相关产品推荐

