基于工作日/周末分组计算过去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
相关产品推荐
相关产品推荐

