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() 每小时补齐并前向填充

按每季度采样并处理缺失值

✅ 示例目标

  • 假设原始数据是天级别的时间序列,其中一些日期缺失;

  • 任务是:

    1. 按季度 ('Q') 进行重采样(求和/均值/任意聚合);
    2. 对缺失值进行处理(填充、插值、丢弃等)。

✅ 示例代码(含注释)

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' 等自定义起始月。
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐