# 4.7.3 时间序列数据重采样
重采样是按指定时间频率重新组织时间序列数据。Pandas 用 `resample()` 完成重采样：可根据指定频率对数据进行聚合、填充、插值等操作。时间序列数据指按时间顺序排列的数据，通常用于金融市场、传感器、气象等场景，数据框常以时间作为行标签保存。重采样前行标签必须是日期时间索引，可在创建数据框时把 `pd.date_range()` 的结果作为 `index`，也可对字符串日期列先 `pd.to_datetime()` 再 `set_index()`。本章学习目标把重采样列为时间序列处理的优势之一；教案将“理解并应用时间序列的重采样”列为教学难点。

常用频率字符串为 `'D'`（天）、`'W'`（周）、`'M'`（月）等。在频率前面加上整数可指定采样周期，如 `'3D'` 表示每 3 天采样一次。按方向分为两类：降采样是将高频率的时间序列数据降低到更低的频率，例如把每日数据降为每周数据；升采样是将低频率的时间序列数据提升到更高的频率，例如把每月数据扩展为每日数据，通常需要插值。

课程示例属于按周降采样并取最大值。先生成 14 天的日期索引，再构造温度列，然后按周聚合：

```python
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 天采样。
- 降采样：高频→低频（如每日→每周）；升采样：低频→高频（如每月→每日，通常需插值）。
- 课程示例：14 天温度，`resample('W').max()` 得到 1 月 7 日 32、1 月 14 日 31。
- 周标签是该周结束日；`resample()` 须再接聚合；行标签须为日期时间索引。
- 不要把 `resample()` 与 `rolling()` 当成同一操作。
