重采样是按指定时间频率重新组织时间序列数据。Pandas 用 resample() 完成重采样:可根据指定频率对数据进行聚合、填充、插值等操作。时间序列数据指按时间顺序排列的数据,通常用于金融市场、传感器、气象等场景,数据框常以时间作为行标签保存。重采样前行标签必须是日期时间索引,可在创建数据框时把 pd.date_range() 的结果作为 index,也可对字符串日期列先 pd.to_datetime() 再 set_index()。本章学习目标把重采样列为时间序列处理的优势之一;教案将“理解并应用时间序列的重采样”列为教学难点。
常用频率字符串为 'D'(天)、'W'(周)、'M'(月)等。在频率前面加上整数可指定采样周期,如 '3D' 表示每 3 天采样一次。按方向分为两类:降采样是将高频率的时间序列数据降低到更低的频率,例如把每日数据降为每周数据;升采样是将低频率的时间序列数据提升到更高的频率,例如把每月数据扩展为每日数据,通常需要插值。
课程示例属于按周降采样并取最大值。先生成 14 天的日期索引,再构造温度列,然后按周聚合:
import pandas as pd
dates = pd.date_range('2024-01-01', periods=14, freq='D')
df = pd.DataFrame({'温度': [30, 32, 31, 29, 28, 27, 26, 25, 24, 23, 31, 29, 28, 27]}, index=dates)
weekly_max_temp = df.resample('W').max()
结果只有两行:2024-01-07 对应最高温度 32,2024-01-14 对应 31,语料注释为“每7天统计一次最高温度”。行标签是该周的结束日期,不是当天的原始观测(1 月 7 日当天温度是 26,不是 32)。resample('W') 返回重采样器,必须再接 .max()、.mean()、.sum() 等聚合,才能得到数据框。
易错点:索引仍是默认整数或未转换的字符串日期时,resample() 无法按频率分箱,须先完成 4.7.1 的索引设置;只写 df.resample('W') 不接聚合,得不到温度统计;把每日到每周误当成升采样——本例是降采样,升采样才通常需要插值;不要与下一节 rolling() 混淆:resample() 按日历频率重新分箱,rolling() 按固定窗口长度滑动。作业要求创建时间序列数据集,进行索引设置与重采样。
resample() 按指定频率对时间序列做聚合、填充、插值。'D' 天、'W' 周、'M' 月;'3D' 表示每 3 天采样。resample('W').max() 得到 1 月 7 日 32、1 月 14 日 31。resample() 须再接聚合;行标签须为日期时间索引。resample() 与 rolling() 当成同一操作。