3. Python时间序列工具栈:Pandas时间序列基础
时间序列分析,说白了就是跟带时间戳的数据打交道。我刚开始接触这行时,总觉得处理时间数据不就是多一列日期嘛,有什么难的?直到有一次,我面对一个长达十年的传感器数据集,才发现时间序列处理的门道有多深。嗯,今天我们就来聊聊Python里最核心的时间序列工具——Pandas。
核心观点:Pandas的时间序列功能,是整个Python数据分析生态的基石。你想想看,没有它,我们连数据都读不进来,更别提后面的建模预测了。
3.1 DatetimeIndex:时间序列的“身份证”
在Pandas里,时间序列的核心就是DatetimeIndex。它就像每个时间点的身份证,让数据有了时间维度。
我个人习惯,拿到数据第一件事就是检查索引类型。如果是字符串,赶紧转成DatetimeIndex。为什么?因为只有转成时间索引,你才能用上Pandas那些强大的时间切片、重采样功能。
import pandas as pd
import numpy as np
# 创建一个时间序列
dates = pd.date_range('2023-01-01', periods=10, freq='D')
ts = pd.Series(np.random.randn(10), index=dates)
print(ts)
# 输出:
# 2023-01-01 0.1234
# 2023-01-02 -0.5678
# ...
小技巧:用pd.to_datetime()可以自动识别多种日期格式。我在项目中遇到过客户给的日期格式五花八门,这个函数基本都能搞定。
DatetimeIndex最爽的地方在于切片。你可以直接用年份、月份来筛选数据:
# 切片操作
ts['2023-01'] # 获取1月份所有数据
ts['2023-01-01':'2023-01-05'] # 获取前5天数据
3.2 resample:时间维度的“缩放镜”
重采样,说白了就是把数据从一个时间频率转换到另一个频率。比如把分钟数据聚合成小时数据,或者把日数据降采样到周数据。
我曾经处理过一个工业传感器数据,每秒采集一次,一个月下来数据量巨大。这时候resample就是救星——把秒级数据聚合成分钟级,既保留了趋势,又大幅压缩了数据量。
# 创建分钟级数据
minute_data = pd.Series(
np.random.randn(1000),
index=pd.date_range('2023-01-01', periods=1000, freq='T')
)
# 降采样到小时级别,取平均值
hourly_data = minute_data.resample('H').mean()
print(hourly_data.head())
| 重采样规则 | 含义 | 常用场景 |
|---|---|---|
| 'D' | 按天聚合 | 日频数据 |
| 'W' | 按周聚合 | 周报统计 |
| 'M' | 按月聚合 | 月度汇总 |
| 'Q' | 按季度聚合 | 季度分析 |
| 'Y' | 按年聚合 | 年度趋势 |
注意:重采样时,聚合函数的选择很关键。我曾经用mean处理异常值较多的数据,结果把异常也平均进去了。后来改用median,效果好了很多。
3.3 shift:时间序列的“时间机器”
shift函数可以让你把数据向前或向后移动。这在计算变化量、滞后特征时特别有用。
我记得做股票收益率分析时,shift就是我的得力助手。计算每日收益率,其实就是今天的价格除以前一天的价格再减1:
# 计算每日收益率
prices = pd.Series([100, 102, 101, 105, 108],
index=pd.date_range('2023-01-01', periods=5, freq='D'))
returns = prices / prices.shift(1) - 1
print(returns)
# 输出:
# 2023-01-01 NaN
# 2023-01-02 0.020000
# 2023-01-03 -0.009804
# ...
避坑指南:我曾经犯过一个低级错误——用shift时忘了处理NaN值。结果后续计算全乱了。记住,shift后第一行一定是NaN,记得用dropna()清理。
3.4 rolling:滑动窗口的“透视镜”
滚动窗口,说白了就是用一个固定大小的窗口在数据上滑动,计算窗口内的统计量。移动平均线就是最经典的例子。
我处理传感器数据时,经常用rolling来做平滑处理。原始数据噪声太大,一滚动平均,趋势就清晰了。
# 3日移动平均
data = pd.Series([1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
index=pd.date_range('2023-01-01', periods=10, freq='D'))
ma_3 = data.rolling(window=3).mean()
print(ma_3)
# 输出:
# 2023-01-01 NaN
# 2023-01-02 NaN
# 2023-01-03 2.0
# 2023-01-04 3.0
# ...
滚动窗口的常用函数:
mean()- 移动平均std()- 滚动标准差min()/max()- 滚动极值sum()- 滚动求和apply()- 自定义函数
实战经验:窗口大小的选择没有标准答案。我一般先用领域知识估算一个合理范围,然后通过交叉验证来调优。比如日频数据,7天、14天、30天都是常见选择。
知识体系总览
这四个工具,说白了就是时间序列分析的四大金刚。DatetimeIndex管身份,resample管缩放,shift管平移,rolling管滑动。你想想看,有了这四样,大部分时间序列处理需求都能搞定。
我的建议:刚开始学的时候,别急着用高级模型。先把这四个工具练熟,用真实数据反复练习。我当年就是靠着一份股票数据,把resample和rolling玩得滚瓜烂熟,后来做项目时才能得心应手。