📊【Python时间序列全攻略】从入门到平稳性检验,一文搞定!
❝💡金融、经济、气象、物联网……只要涉及“随时间变化的数据”,就绕不开 时间序列分析。今天,我们就用 Python 带你系统掌握时间序列的核心技能!🔥
🕒 1. 日期与时间:一切的起点
在 Python 中,处理时间数据主要靠标准库 datetime 模块,它提供了几种关键类型:
| |
|---|
date | |
time | |
datetime | |
timedelta | |
tzinfo | |
✅ 小技巧:
- 用
timedelta(days=3) 轻松实现“三天后”或“一周前”
from datetime import datetime, timedeltanow = datetime.now()three_days_later = now + timedelta(days=3)
🔁 2. 字符串 ↔ 时间:格式转换是关键!
现实数据常以字符串形式存在(如 "2026/02/07"),我们需要转换为 datetime 才能分析。
✅ 字符串 → datetime
datetime.strptime("2026-02-07", "%Y-%m-%d")
✅ datetime → 字符串
stamp.strftime("%Y年%m月%d日") # 输出:2026年02月07日
📌 常用格式代码速查表:
❝⚡ 在 Pandas 中更简单:直接用 pd.to_datetime() 一键转换整列!
📈 3. Pandas 时间序列:让数据“活”起来!
Pandas 是时间序列分析的利器!它的 Series 或 DataFrame 若以时间作为索引,就是时间序列。
import pandas as pddates = pd.date_range('2026-01-01', periods=5, freq='D')ts = pd.Series([1, 2, 3, 4, 5], index=dates)
🔍 索引与切片超方便!
ts['2026-01-02'] # 单日查询ts['2026-01'] # 整月切片ts['2026'] # 整年数据
❝✨ 自动对齐:不同时间序列做运算时,Pandas 会自动按日期对齐,不怕错位!
🗓️ 4. 日期范围 & 频率:生成你的专属时间轴!
用 pd.date_range() 轻松创建固定频率的时间序列:
# 每月最后一天,共12个月pd.date_range('2026-01-01', periods=12, freq='M')# 每小时一次,从现在开始pd.date_range(start='2026-02-07 00:00', end='2026-02-08 00:00', freq='H')
🔄 常见频率别名(Frequency Aliases):
➡️ 5. 时间移位(Shift):预测与滞后分析必备!
shift(n) 可将数据整体向前或向后移动 n 步,不改变索引:
ts.shift(1) # 滞后一期(昨天的值放到今天)ts.shift(-1) # 超前一期(明天的值放到今天)
💡 若加上 freq 参数,则同时移动索引:
ts.shift(2, freq='D') # 数据+索引都往后移2天
❝这在构建“昨日销量 vs 今日销量”等特征时超级实用!
📅 6. 时期(Period):不只是时间点,更是时间段!
Period 表示一个时间区间,比如“2026年2月”、“2026年第1季度”。
p = pd.Period('2026-02', freq='M') # 代表整个2月
- 用
pd.period_range() 创建时期序列 - 用
to_period() 将时间戳索引转为时期索引
❝🌟 适用于财务报表、月度汇总等“区间型”分析场景!
📉📈 7. 重采样(Resample):降采样 & 升采样
重采样 = 改变时间频率,是时间序列预处理的核心操作!
🔽 降采样(高频 → 低频)
比如:日数据 → 月数据
daily_data.resample('M').mean() # 每月平均值
⚠️ 注意参数:
🔼 升采样(低频 → 高频)
比如:月数据 → 日数据
此时会出现缺失值,需插值填充:
monthly_data.resample('D').ffill() # 向前填充monthly_data.resample('D').interpolate() # 插值
🧪 8. 平稳性检验:建模前的关键一步!
大多数时间序列模型(如 ARIMA)要求数据平稳——即均值、方差不随时间变化。
三种检验方法:
1️⃣ 时序图检验 👀
data['Total'].plot(figsize=(12,6))
2️⃣ 自相关图(ACF)检验 📐
from statsmodels.graphics.tsaplots import plot_acfplot_acf(data['Total'])
3️⃣ ADF 检验(最严谨!)🧪
- 若 p-value < 0.05 → 拒绝 H₀ → 序列平稳!
from statsmodels.tsa.stattools import adfullerresult = adfuller(data['Total'])print(f"ADF Statistic: {result[0]:.4f}")print(f"p-value: {result[1]:.4f}")
❝✅ 实践建议:先看图,再跑 ADF,双保险!
🎯 总结:时间序列分析全景图
graph LRA[原始数据] --> B{是否为时间序列?}B -->|是| C[转换为 datetime 索引]C --> D[重采样/频率转换]D --> E[移位/滞后特征]E --> F[平稳性检验]F -->|平稳| G[建模预测 ARIMA/SARIMA]F -->|非平稳| H[差分/对数变换]H --> F
🔔 关注我们,不错过每一篇硬核又易懂的数据科学干货!💬 留言区互动:你在工作中遇到过哪些时间序列难题?欢迎分享!