You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 12:38:03