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

时间序列分解:如何从日度数据中提取月度季节性

提取日度数据中的月度季节性解决方案

你的核心问题是seasonal_decompose默认会自动推断日度数据的周期(通常是周度7天或年度365天),而非你需要的月度内日度重复模式,导致分解结果不符合预期。要提取月度季节性,需要明确指定周期或使用更灵活的分解方法。


步骤1:数据预处理(必做)

首先确保时间序列索引正确,且无缺失日期:

import pandas as pd
import numpy as np
from statsmodels.tsa.seasonal import seasonal_decompose

# 读取并处理数据(假设你的数据已存入df)
df['Date'] = pd.to_datetime(df['Date'])
df = df.set_index('Date')
# 填充缺失的日度日期
df = df.asfreq('D')
# 用前向填充补全日度数据的缺失值
df['Total'] = df['Total'].ffill()

方法一:修正seasonal_decompose的周期参数

指定period为月度周期(取数据中月份天数的中位数,适配不同月份的天数差异):

# 获取数据中所有月份的天数,取中位数作为周期
month_days = df.index.daysinmonth.unique()
period = int(np.median(month_days))  # 通常为30或31

# 执行分解,指定周期
result = seasonal_decompose(df['Total'], model='additive', period=period)

# 查看分解结果
result.plot()

方法二:使用STL分解(更推荐)

STL分解无需固定周期,更适合处理月度这种天数可变的季节性,同时能让趋势成分更平滑:

from statsmodels.tsa.seasonal import STL

# STL分解:seasonal设为月度天数(如31),trend设为更长窗口(如151,约5个月)以平滑趋势
stl = STL(df['Total'], seasonal=31, trend=151)
result = stl.fit()

# 查看分解结果
result.plot()

关键说明

  • seasonal_decompose的period必须是固定值,因此用月份天数的中位数适配多数情况;
  • STL的seasonal参数控制季节性成分的平滑窗口,设置为月度天数可精准捕捉月初到月末的增长-重置模式;
  • 更长的trend窗口(如151天)会让趋势成分更平滑,将月度内的波动完全归入季节性成分,符合你的预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 15:17:26