Python df.resample
·
df.resample() 是 Pandas 中用于 按时间频率重采样(resampling)时间序列数据 的方法,常用于时间聚合,比如按天/周/月/年求和、平均等。
它只能用于 以时间索引(DatetimeIndex/PeriodIndex)为索引的 DataFrame 或 Series。
✅ 基本语法
df.resample(rule, how/agg, other_params)
df.resample('D').sum() # 按天求和
df.resample('M').mean() # 按月求平均
df.resample('W').max() # 按周取最大值
📌 常用 rule 时间频率
| 字符 | 含义 | 示例 |
|---|---|---|
'D' |
日 | 每天 |
'W' |
周 | 每周 |
'M' |
月(末日) | 每月最后一天 |
'MS' |
月初 | 每月第 1 天 |
'Q' |
季度 | 每季最后一天 |
'Y' |
年末 | 每年12月31 |
'H' |
小时 | 每小时 |
'T' 或 'min' |
分钟 | 每分钟 |
'S' |
秒 | 每秒钟 |
✅ 示例:按月重采样
import pandas as pd
# 创建时间序列 DataFrame
rng = pd.date_range('2024-01-01', periods=90, freq='D')
df = pd.DataFrame({'value': range(90)}, index=rng)
# 按月求和
monthly = df.resample('M').sum()
print(monthly)
🎯 常用聚合函数搭配
df.resample('W').agg(['mean', 'max', 'min']) # 多个聚合
df.resample('M').first() # 每月第一条记录
df.resample('H').asfreq() # 指定频率但不做聚合(填充 NaN)
❗ 注意事项
- 重采样操作作用在 时间索引 上,
df.index必须是DatetimeIndex,否则会报错。 - 默认 label 为右闭区间,如
M表示月末,W表示周日(可通过label='left',closed='left'调整)。 - 对于 缺失时间段,结果会自动插入空值(NaN)或 0(视聚合函数而定)。
🧪 时间索引示例检测
if not isinstance(df.index, pd.DatetimeIndex):
df['date'] = pd.to_datetime(df['date'])
df.set_index('date', inplace=True)
🧠 小结
| 用法示例 | 说明 |
|---|---|
df.resample('D').sum() |
按天聚合 |
df.resample('M').mean() |
按月平均 |
df.resample('W-MON') |
每周一为周期起点 |
df.resample('H').ffill() |
每小时补齐并前向填充 |
按每季度采样并处理缺失值
✅ 示例目标
-
假设原始数据是天级别的时间序列,其中一些日期缺失;
-
任务是:
- 按季度 (
'Q') 进行重采样(求和/均值/任意聚合); - 对缺失值进行处理(填充、插值、丢弃等)。
- 按季度 (
✅ 示例代码(含注释)
import pandas as pd
import numpy as np
# 1. 构造示例时间序列(有缺失)
date_rng = pd.date_range(start='2023-01-01', end='2024-12-31', freq='7D') # 每 7 天记录一次
np.random.seed(42)
df = pd.DataFrame({'value': np.random.randint(10, 100, size=len(date_rng))}, index=date_rng)
# 2. 模拟随机缺失数据
df.loc[df.sample(frac=0.2).index, 'value'] = np.nan
# 3. 按季度重采样(聚合为平均值)
df_q = df.resample('Q').mean()
# 4. 填补缺失值(可选方式见下)
df_q_ffill = df_q.ffill() # 前向填充
df_q_bfill = df_q.bfill() # 后向填充
df_q_interp = df_q.interpolate() # 插值填充(线性)
df_q_dropna = df_q.dropna() # 丢弃缺失值
# 5. 输出展示
print("原始季度数据(含NaN):\n", df_q.head(), '\n')
print("填充后数据(线性插值):\n", df_q_interp.head())
🧠 可选的缺失值处理方法
| 方法名 | 说明 |
|---|---|
.ffill() |
前向填充(用上一个季度值) |
.bfill() |
后向填充(用下一个季度值) |
.interpolate() |
线性插值 |
.fillna(value) |
填充固定值 |
.dropna() |
直接删除含 NaN 的季度行 |
📈 示例图(可选)
import matplotlib.pyplot as plt
df_q_interp.plot(title='Quarterly Mean (Interpolated)', marker='o')
plt.grid(True)
plt.show()
🧾 拓展说明
- 你也可以使用
resample('Q')['value'].agg(['sum', 'mean'])获取多个指标。 - 如果你希望按**财年季度(如3月、6月、9月、12月)**进行采样,可以用
'Q-MAR'、'Q-SEP'等自定义起始月。
更多推荐



所有评论(0)