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
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
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 )
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':年末 closed 和 label 控制时间区间的划分方式;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() 是非常强大且灵活的工具,是时间序列分析中的核心方法之一。