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

基于工作日/周末分组计算过去n天的滚动均值与标准差

解决方案

1. 先把数据处理成时间序列格式

首先得把Date列转成datetime类型,并且按日期排序,这是时间窗口计算的基础:

import pandas as pd

# 你的示例数据
data = {
    'Date': ['01/02/2022', '01/03/2022', '01/04/2022', '01/05/2022'],
    'Day of Week': ['Sunday', 'Monday', 'Tuesday', 'Wednesday'],
    'Value': [35666, 38945, 39411, 40058]
}
df = pd.DataFrame(data)

# 转换日期格式,这里匹配你的月/日/年格式
df['Date'] = pd.to_datetime(df['Date'], format='%m/%d/%Y')
# 按日期排序,避免滚动窗口计算出错
df = df.sort_values('Date').reset_index(drop=True)

2. 给数据打工作日/周末标签

新增一列Group,把每条数据分到“工作日”或者“周末”组:

# 周六周日算周末,其余为工作日
weekend_days = ['Saturday', 'Sunday']
df['Group'] = df['Day of Week'].map(lambda x: '周末' if x in weekend_days else '工作日')

3. 按分组计算时间窗口内的均值和标准差

用groupby先按分组拆分数据,再用rolling指定时间窗口(比如过去90天≈3个月),直接计算均值和标准差:

# 设置时间窗口,可替换为'3M'(过去3个月)、'1Q'(过去1季度)等
time_window = '90D'

# 计算滚动统计量:closed='left'表示窗口不包含当前日期的数据,要包含就改成'both'
rolling_result = df.groupby('Group').rolling(
    window=time_window,
    on='Date',
    closed='left'
).agg(
    滚动均值=('Value', 'mean'),
    滚动标准差=('Value', 'std')
).reset_index()

# 把结果合并回原表,方便对应查看
final_df = pd.merge(df, rolling_result, on=['Group', 'Date'], how='left')

重要注意点

  • 必须指定on='Date',告诉pandas用日期列作为滚动窗口的基准,否则会按行号滚动,不是按时间范围
  • 时间窗口参数支持多种格式:'7D'=7天,'1M'=1个月,'1Q'=1季度
  • 如果数据存在缺失日期(比如某天无记录),可以先用df.resample('D', on='Date').ffill()补全数据,确保窗口计算覆盖完整时间范围
  • 序列开头的部分数据,因为窗口内没有足够历史数据,均值和标准差会显示为NaN,属于正常情况

内容的提问来源于stack exchange,提问作者officer_k_dash_9401

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 05:55:29