【Pandas】pandas DataFrame resample

Pandas2.2 DataFrame

Time Series-related

方法 描述
DataFrame.asfreq(freq[, method, how, …]) 用于**将时间序列数据转换为指定频率(resample to frequency)**的方法
DataFrame.asof(where[, subset]) 用于查找时间序列中最接近指定时间点的非 NaN 值的方法
DataFrame.shift([periods, freq, axis, …]) 用于**将 DataFrame 的数据沿着指定轴移动(平移)**的方法
DataFrame.first_valid_index() 用于获取 DataFrame 中第一个非空(非 NaN)值所在的行索引的方法
DataFrame.last_valid_index() 用于获取 DataFrame 中最后一个非空(非 NaN)值所在的行索引的方法
DataFrame.resample(rule[, axis, closed, …]) 用于**对时间序列数据进行重采样(resampling)**的核心方法

pandas.DataFrame.resample()

pandas.DataFrame.resample() 是 Pandas 中用于**对时间序列数据进行重采样(resampling)**的核心方法。它类似于 SQL 中的“GROUP BY 时间窗口”操作,常用于将高频时间序列数据聚合为低频(如从分钟级到小时级、日级等),也支持升采样(插值填充)。


方法签名
DataFrame.resample(
    rule,
    axis=0,
    closed=None,
    label=None,
    convention='start',
    kind=None,
    on=None,
    level=None,
    origin='start_day',
    offset=None,
    group_keys=False
)

参数说明:
参数 说明
rule 时间频率字符串,如 'D'(天)、'W'(周)、'M'(月)、'Q'(季度)、'A'(年)等
axis 操作轴方向,默认为 0(行方向)
closed 区间闭合方式,可选 'left''right',表示区间端点是否包含
label 聚合后标签的位置,可选 'left''right'
convention 升采样时的时间点对齐方式,如 'start', 'end'(默认 'start'
kind 返回类型,可选 'period''timestamp'
on 对非索引的时间列进行 resample(适用于普通列而非 DatetimeIndex)
level 多级索引中指定某一级作为时间索引
origin 起始时间对齐方式,可选 'epoch''start_day'(默认)
offset 时间偏移量,如 '1D' 表示起始时间向后偏移一天
group_keys 是否在分组键中显示时间标签(一般不需修改)

✅ 返回值
  • 返回一个 Resampler 对象,需要配合 .mean(), .sum(), .max() 等聚合函数使用;
  • 原始数据不会被修改;

示例代码及结果
示例 1:基本用法(按天聚合)
import pandas as pd
import numpy as np

# 创建带时间索引的 DataFrame
index = pd.date_range('2025-01-01', periods=6, freq='H')
df = pd.DataFrame({
    'value': [10, 20, 30, 40, 50, 60]
}, index=index)

print("Original DataFrame:")
print(df)
输出:
                     value
2025-01-01 00:00:00     10
2025-01-01 01:00:00     20
2025-01-01 02:00:00     30
2025-01-01 03:00:00     40
2025-01-01 04:00:00     50
2025-01-01 05:00:00     60
# 按每 2 小时聚合,取平均值
resampled = df.resample('2H').mean()
print("\nAfter resample('2H').mean():")
print(resampled)
输出:
                     value
2025-01-01 00:00:00   15.0
2025-01-01 02:00:00   35.0
2025-01-01 04:00:00   55.0

示例 2:按天聚合并求和
# 按天聚合,求和
resampled = df.resample('D').sum()
print("\nAfter resample('D').sum():")
print(resampled)
输出:
            value
2025-01-01    210

示例 3:自定义闭合方式与标签位置
# 每两小时一组,右闭合,标签放在右边
resampled = df.resample('2H', closed='right', label='right').mean()
print("\nresample('2H', closed='right', label='right'):")
print(resampled)
输出:
                     value
2025-01-01 02:00:00   15.0
2025-01-01 04:00:00   35.0
2025-01-01 06:00:00   55.0

示例 4:升采样 + 插值填充(ffill
# 按半小时升采样,并向前填充
resampled = df.resample('30T').ffill()
print("\nresample('30T').ffill():")
print(resampled)
输出(部分):
                     value
2025-01-01 00:00:00     10
2025-01-01 00:30:00     10
2025-01-01 01:00:00     20
2025-01-01 01:30:00     20
2025-01-01 02:00:00     30
...

示例 5:使用 on= 指定时间列进行 resample
# 如果时间不是索引而是列
df_reset = df.reset_index()
df_reset.rename(columns={'index': 'timestamp'}, inplace=True)

# 使用 on='timestamp' 进行 resample
resampled = df_reset.resample('2H', on='timestamp').mean()
print("\nresample(..., on='timestamp').mean():")
print(resampled)
输出:
                     value
timestamp                 
2025-01-01 00:00:00   15.0
2025-01-01 02:00:00   35.0
2025-01-01 04:00:00   55.0

示例 6:使用 kind='period' 返回 Period 类型
resampled = df.resample('2H', kind='period').mean()
print("\nresample(..., kind='period').mean():")
print(resampled)
输出:
         value
timestamp      
2025-01-01 00:00   15.0
2025-01-01 02:00   35.0
2025-01-01 04:00   55.0

应用场景
场景 说明
时间序列聚合 如计算每日/每周/每月的均值、总和等
降采样(Downsampling) 将高频率数据转换为低频率(如秒级 → 分钟级)
升采样(Upsampling) 将低频率数据转换为高频率(如日级 → 小时级),通常结合 .interpolate().ffill()
缺失值处理 在升采样后填充缺失值
可视化准备 统一时间粒度便于绘图分析

⚠️ 注意事项
  • 必须确保索引或指定列为 DatetimeIndex 类型;
  • resample() 不会直接返回结果,必须配合聚合函数(如 .mean(), .sum());
  • 支持多种频率规则,如:
    • 'T' / 'min':分钟
    • 'H':小时
    • 'D':天
    • 'W':周
    • 'M':月末
    • 'Q':季度末
    • 'A':年末
  • closedlabel 控制时间区间的划分方式;
  • origin 可控制时间窗口起点;
  • offset 可设置时间窗口偏移(如从 1:30 开始);
  • on= 可用于对非索引的时间列进行 resample。

✅ 总结对比
方法 是否聚合 是否支持升采样 是否支持降采样 是否支持非索引时间列
.resample() ✅(通过 on=
.asfreq()
.rolling()
.groupby(pd.Grouper(freq='D'))

频率规则参考表(常用)
规则 含义
'T' / 'min' 每分钟
'H' 每小时
'D' 每天
'W' 每周(默认周日为一周开始)
'M' 每月最后一天
'Q' 每季度最后一天
'A' 每年最后一天
'MS' 每月初第一天
'QS' 每季度初第一天
'AS' 每年初第一天

✅ 推荐组合使用方式
# 常见降采样 + 聚合
df.resample('D').mean()

# 常见升采样 + 填充
df.resample('T').ffill()  # 每分钟向前填充
df.resample('T').interpolate('linear')  # 线性插值

如果你希望对时间序列进行降采样统计、升采样插值、或统一时间粒度resample() 是非常强大且灵活的工具,是时间序列分析中的核心方法之一。

你可能感兴趣的:(DataFrame,pandas)