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天都是常见选择。

知识体系总览

Pandas时间序列工具栈 时间序列数据 DatetimeIndex resample shift rolling 时间索引创建与切片 频率转换与聚合 数据平移与差分 滑动窗口统计 数据清洗、对齐 降采样、升采样 滞后特征、变化率 平滑、异常检测 四大工具协同使用,覆盖时间序列 预处理、特征工程、统计分析全流程

这四个工具,说白了就是时间序列分析的四大金刚。DatetimeIndex管身份,resample管缩放,shift管平移,rolling管滑动。你想想看,有了这四样,大部分时间序列处理需求都能搞定。

我的建议:刚开始学的时候,别急着用高级模型。先把这四个工具练熟,用真实数据反复练习。我当年就是靠着一份股票数据,把resample和rolling玩得滚瓜烂熟,后来做项目时才能得心应手。

专注资料整理