pandas时间序列分析核心是“时间索引→对齐→重采样→滚动计算”主线:需用to_datetime+set_index设时间索引,resample精准按周期重采样,rolling('7d')配合closed参数控制时点对齐,时区处理须先localize再convert。

处理时间序列数据是 Pandas 最核心也最常用的能力之一。关键不在于记住所有函数,而在于理清“时间索引→对齐→重采样→滚动计算”这条主线,再配合合理的时区与频率设置。
让 DataFrame 拥有真正的时间索引
用 pd.to_datetime() 转换列后,必须用 set_index() 显式设为索引,否则无法触发 Pandas 的时间序列智能操作:
- 避免直接写
df['date'] = pd.to_datetime(df['date'])就停住——这仅是普通列 - 正确做法:
df = df.assign(date=pd.to_datetime(df['date'])).set_index('date') - 设好后检查:
df.index.dtype应为datetime64[ns],且df.index.freq可能自动推断出频率(如 'D'、'H')
按自然周期重采样(resample)比 groupby 更精准
resample() 是专为时间索引设计的分组工具,会自动对齐边界、填充缺失区间,比基于字符串或截取日期的 groupby() 更可靠:
- 日频数据转月频均值:
df.resample('M').mean()—— 自动按月末对齐 - 保留首/末值:
df.resample('W-MON').first()或.last() - 聚合多个指标不同方式:
df.resample('D').agg({'price': 'ohlc', 'volume': 'sum'})
滚动窗口计算要留意 closed 参数和时点对齐
rolling() 默认按行数滚动(如 rolling(7)),但时间序列更常用时间窗口(如 rolling('7D')),此时 closed 参数决定是否包含当前时刻:
立即学习“Python免费学习笔记(深入)”;
-
df.rolling('7D', closed='right').mean():包含当前行,向前找7天(最常用) -
closed='left':不包含当前行,只看过去7天(适合避免数据泄露) - 注意:若原始数据非等频(如中间缺某天),
'7D'窗口仍严格按时间跨度算,不是固定7行
时区处理:先本地化,再转换,别跳步
带时区的时间序列必须分两步走,否则会报 Cannot localize tz-aware datetime 错误:
- 无时区索引 → 添加本地时区:
df.index = df.index.tz_localize('Asia/Shanghai') - 已有本地时区 → 转目标时区:
df.index = df.index.tz_convert('UTC') - 读 CSV 时就带时区?用
parse_dates+date_parser配合 dateutil.tz 提前解析,比后续转换更稳妥
不复杂但容易忽略。把索引设对、频率理清、重采样用准、滚动窗闭合方向选好,时序分析就稳了一大半。










