时间序列分解:如何从日度数据中提取月度季节性
提取日度数据中的月度季节性解决方案
你的核心问题是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
相关产品推荐
相关产品推荐

