Python数据分析:时间序列数据分析

📊【Python时间序列全攻略】从入门到平稳性检验,一文搞定!

💡金融、经济、气象、物联网......只要涉及"随时间变化的数据",就绕不开 时间序列分析

今天,我们就用 Python 带你系统掌握时间序列的核心技能!🔥


🕒 1. 日期与时间:一切的起点

在 Python 中,处理时间数据主要靠标准库 datetime 模块,它提供了几种关键类型:

类型 说明
date 年-月-日(如 2026-02-07)📅
time 时:分:秒(如 17:52:30)⏰
datetime 日期 + 时间(最常用!)🕒
timedelta 两个时间点之间的差值(用于加减计算)⏳
tzinfo 时区信息(高级用法)🌍

小技巧

  • datetime.now() 获取当前时间

  • timedelta(days=3) 轻松实现"三天后"或"一周前"

python 复制代码
from datetime import datetime, timedelta
now = datetime.now()
three_days_later = now + timedelta(days=3)

🔁 2. 字符串 ↔ 时间:格式转换是关键!

现实数据常以字符串形式存在(如 "2026/02/07"),我们需要转换为 datetime 才能分析。

✅ 字符串 → datetime

python 复制代码
datetime.strptime("2026-02-07", "%Y-%m-%d")

✅ datetime → 字符串

python 复制代码
stamp.strftime("%Y年%m月%d日")  # 输出:2026年02月07日

📌 常用格式代码速查表

代码 含义 示例
%Y 四位年份 2026
%m 两位月份 02
%d 两位日期 07
%H 24小时制 17
%M 分钟 52
%S 30
%F 等价于 %Y-%m-%d 2026-02-07

⚡ 在 Pandas 中更简单:直接用 pd.to_datetime() 一键转换整列!


📈 3. Pandas 时间序列:让数据"活"起来!

Pandas 是时间序列分析的利器!它的 SeriesDataFrame 若以时间作为索引,就是时间序列

python 复制代码
import pandas as pd
dates = pd.date_range('2026-01-01', periods=5, freq='D')
ts = pd.Series([1, 2, 3, 4, 5], index=dates)

🔍 索引与切片超方便!

python 复制代码
ts['2026-01-02']        # 单日查询
ts['2026-01']           # 整月切片
ts['2026']              # 整年数据

✨ 自动对齐:不同时间序列做运算时,Pandas 会自动按日期对齐,不怕错位!


🗓️ 4. 日期范围 & 频率:生成你的专属时间轴!

pd.date_range() 轻松创建固定频率的时间序列:

python 复制代码
# 每月最后一天,共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):

别名 含义
'D'
'M' 月末
'MS' 月初
'H' 小时
'T''min' 分钟
'S'

➡️ 5. 时间移位(Shift):预测与滞后分析必备!

shift(n) 可将数据整体向前或向后移动 n 步,不改变索引

python 复制代码
ts.shift(1)   # 滞后一期(昨天的值放到今天)
ts.shift(-1)  # 超前一期(明天的值放到今天)

💡 若加上 freq 参数,则同时移动索引

python 复制代码
ts.shift(2, freq='D')  # 数据+索引都往后移2天

这在构建"昨日销量 vs 今日销量"等特征时超级实用!


📅 6. 时期(Period):不只是时间点,更是时间段!

Period 表示一个时间区间,比如"2026年2月"、"2026年第1季度"。

python 复制代码
p = pd.Period('2026-02', freq='M')  # 代表整个2月
  • pd.period_range() 创建时期序列

  • asfreq() 转换频率(如月 → 季)

  • to_period() 将时间戳索引转为时期索引

🌟 适用于财务报表、月度汇总等"区间型"分析场景!


📉📈 7. 重采样(Resample):降采样 & 升采样

重采样 = 改变时间频率,是时间序列预处理的核心操作!

🔽 降采样(高频 → 低频)

比如:日数据 → 月数据

python 复制代码
daily_data.resample('M').mean()  # 每月平均值

⚠️ 注意参数:

  • closed='right':区间哪边闭合?

  • label='right':标签打在哪一端?

🔼 升采样(低频 → 高频)

比如:月数据 → 日数据

此时会出现缺失值,需插值填充:

python 复制代码
monthly_data.resample('D').ffill()  # 向前填充
monthly_data.resample('D').interpolate()  # 插值

🧪 8. 平稳性检验:建模前的关键一步!

大多数时间序列模型(如 ARIMA)要求数据平稳------即均值、方差不随时间变化。

三种检验方法:

1️⃣ 时序图检验 👀
  • 绘制时间序列图

  • 若无明显趋势或周期波动 → 可能平稳

python 复制代码
data['Total'].plot(figsize=(12,6))
2️⃣ 自相关图(ACF)检验 📐
  • 平稳序列:自相关系数快速衰减至0

  • 非平稳序列:缓慢衰减

python 复制代码
from statsmodels.graphics.tsaplots import plot_acf
plot_acf(data['Total'])
3️⃣ ADF 检验(最严谨!)🧪
  • 原假设 H₀:序列非平稳(有单位根)

  • 若 p-value < 0.05 → 拒绝 H₀ → 序列平稳!

python 复制代码
from statsmodels.tsa.stattools import adfuller
result = adfuller(data['Total'])
print(f"ADF Statistic: {result[0]:.4f}")
print(f"p-value: {result[1]:.4f}")

✅ 实践建议:先看图,再跑 ADF,双保险!


🎯 总结:时间序列分析全景图

python 复制代码
graph LR
A[原始数据] --> B{是否为时间序列?}
B -->|是| C[转换为 datetime 索引]
C --> D[重采样/频率转换]
D --> E[移位/滞后特征]
E --> F[平稳性检验]
F -->|平稳| G[建模预测 ARIMA/SARIMA]
F -->|非平稳| H[差分/对数变换]
H --> F

🔔 关注我们 ,不错过每一篇硬核又易懂的数据科学干货!

💬 留言区互动:你在工作中遇到过哪些时间序列难题?欢迎分享!


相关推荐
cpp_learners10 分钟前
银河麒麟V10+飞腾FT-2000/4处理器+QT源码静态编译5.14.2指南
开发语言·qt
野生技术架构师18 分钟前
1000道互联网大厂Java岗面试原题解析(八股原理+场景题)
java·开发语言·面试
YuanDaima204825 分钟前
[CrewAI] 第15课|构建一个多代理系统来实现自动化简历定制和面试准备
人工智能·python·面试·agent·crewai
qqty121738 分钟前
Java进阶学习之路
java·开发语言·学习
WHS-_-202239 分钟前
Python 算法题学习笔记一
python·学习·算法
gCode Teacher 格码致知1 小时前
Javascript提高:get和post等请求,对于汉字和空格信息进行编码的原则-由Deepseek产生
开发语言·前端·javascript·node.js·jquery
黑眼圈子1 小时前
总结一下用Java做算法的常用类和方法
java·开发语言·算法
码界筑梦坊1 小时前
353-基于Python的大湾区气候数据可视化分析系统
开发语言·python·信息可视化·数据分析·django·vue·毕业设计
如何原谅奋力过但无声1 小时前
【chap11-动态规划(上 - 基础题目&背包问题)】用Python3刷《代码随想录》
数据结构·python·算法·动态规划
云姜.2 小时前
JSON Schema使用
python·json