如何用Pandas计算指定日期前30天非节假日流量指数均值并合并到DataFrame
Pandas 实现同地点前30天非节假日流量均值计算
实现步骤
- 预处理数据:将日期列转为datetime格式,按地点和日期排序保证时序正确
- 标记非节假日流量:将节假日/周末的流量值置为空,方便均值计算时自动过滤
- 分组滚动计算:按地点分组后使用时间窗口滚动计算30天均值,排除当前日期
- 结果直接映射到原表:计算结果索引与原表对齐,直接作为新列赋值即可
完整代码
import pandas as pd # 读取本地数据集 df = pd.read_csv("你的本地数据集路径.csv") # 日期列转datetime格式 df["date"] = pd.to_datetime(df["date"]) # 按地点+日期升序排序,确保时序正确 df = df.sort_values(by=["location", "date"], ignore_index=True) # 提取非节假日流量,节假日位置为NaN,计算均值时会自动忽略 df["non_holiday_flow"] = df["flow_index"].where(df["weekend_holiday"] == 0) # 按地点分组,滚动计算前30天非节假日流量均值 df["30d_non_holiday_avg_flow"] = ( df.groupby("location", group_keys=False) .apply( lambda x: x.set_index("date")["non_holiday_flow"] .rolling(window="30D", closed="left") # closed='left'表示不包含当前日期,仅统计往前30天 .mean() ) .reset_index(drop=True) ) # 可选:删除中间生成的辅助列 df = df.drop(columns=["non_holiday_flow"])
参数说明
rolling(window="30D"):指定滚动窗口长度为30天,比固定行数的窗口更适配日期不连续的场景closed="left":指定窗口仅包含左边界、不包含右边界(右边界为当前行日期),刚好匹配「当前日期往前恰好30天」的需求,若需要包含当前日期可删除该参数- 若同一地点同一天存在多条数据,可在排序前先按
location和date聚合流量数据,聚合逻辑根据业务需求选择求和/均值即可
内容的提问来源于stack exchange,提问作者skwolvie
相关产品推荐
相关产品推荐

