📆 DatetimeIndex
- pd.to_datetime() 灵活解析
- pd.date_range() 生成连续日期
- 作为索引 → 时间序列基石
- 属性:.year, .month, .day, .weekday
📂 数据读取
- read_csv(parse_dates=True)
- index_col='date' 直接索引
- 处理缺失时间戳
- 时区处理 (tz_localize)
🔄 重采样 resample
- 降采样:.resample('M').mean()
- 升采样:插值 / 填充
- 聚合函数:sum, ohlc, asfreq
- 标签:'D','W','Q','Y'
⏩ 时间偏移 shift
- .shift(1) 滞后一期
- .shift(-1) 超前一期
- 配合差分:
ts - ts.shift(1)
- freq 参数:
shift(3, freq='D')
🌀 滚动窗口 rolling
- .rolling(window=7).mean()
- 支持 min_periods, center
- 滚动标准差、相关系数
- 适用于平滑与特征工程
Pandas 时间序列核心方法
| 方法 | 说明 | 常用参数 | 示例 |
pd.date_range() | 创建日期范围 | start, end, periods, freq | pd.date_range('2024-01-01', periods=5, freq='D') |
pd.to_datetime() | 转换字符串/列表为时间 | format, errors | pd.to_datetime(['2024-01-01', '2024-02-01']) |
df.resample() | 重采样 (聚合) | rule, closed, label | df.resample('W').sum() |
Series.shift() | 时间偏移 (滞后/超前) | periods, freq, fill_value | sales.shift(1) |
Series.rolling() | 滚动窗口计算 | window, min_periods, center | temp.rolling(7).mean() |
时间序列处理管线 (Pandas)
🐍 Python 代码 · 时间序列处理实战
import pandas as pd
import numpy as np
# 1. 创建 DatetimeIndex
dates = pd.date_range(start='2024-01-01', periods=10, freq='D')
ts = pd.Series(np.random.randn(10), index=dates)
print(ts.index) # DatetimeIndex
# 2. 读取时间序列数据 (模拟)
df = pd.read_csv('sales.csv', parse_dates=['date'], index_col='date')
# 3. 重采样:按周求和
weekly = df['sales'].resample('W').sum()
# 4. 时间偏移:滞后1天
df['sales_lag1'] = df['sales'].shift(1)
# 5. 滚动窗口:7日移动平均
df['sales_ma7'] = df['sales'].rolling(window=7, min_periods=3).mean()
# 6. 差分 (一阶)
df['diff'] = df['sales'] - df['sales'].shift(1)
print(df.head())
🌀 滚动窗口 (rolling) 小贴士
- window 可以是整数 (观测数) 或时间偏移量 (如 '7D')
- min_periods 控制最少非NaN值,避免早期数据缺失
- center=True 使窗口标签居中
- 支持 .mean(), .std(), .corr(), .apply() 自定义函数
⏱️ 常用频率别名
D — 日
W — 周
M — 月
Q — 季
Y — 年
H — 小时
T/min — 分钟
S — 秒
📌 偏移与滚动对比
| shift | 移动整个序列 (滞后/超前) |
| rolling | 滑动窗口聚合 (局部统计) |
| resample | 改变时间频率 (降/升采样) |