当前位置: 首页 > news >正文

【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() 是非常强大且灵活的工具,是时间序列分析中的核心方法之一。

http://www.lqws.cn/news/547741.html

相关文章:

  • 疲劳检测与行为分析:工厂智能化实践
  • 解剖智能运维三基石:Metrics/Logs/Traces
  • 广东广电U点-创维E900-S-海思MV310芯片-海兔线刷烧录固件包
  • 香港 8C 站群服务器买来可以做哪些业务?
  • TCP/IP协议简要概述
  • linux初阶---一些指令
  • day49-硬件学习之I2C(续)
  • Tomcat Maven 插件
  • 第六章 STM32内存管理
  • 黑马JVM解析笔记(五):深入理解Java字节码执行机制
  • SpringBoot自动配置原理详解
  • 修复opensuse 风滚草rabbitmq的Error: :plugins_dir_does_not_exist问题
  • 关于前端npm install安装依赖和打包的一些问题记录
  • Django实战:自定义中间件实现全链路操作日志记录
  • 设计模式 | 桥接模式
  • K8s port、targetPort和nodePort区别
  • 使用Puppeteer提取页面内容的技巧
  • 小米路由器 AX3000T 解锁 SSH
  • TCP四层模型:网络协议核心解密
  • 鸿蒙HarmonyOS 关于图片、视频的选择详解
  • Veo 3 视频生成大模型完整操作教程(2025)
  • 《Effective Python》第十章 健壮性——始终将资源传递给生成器,并在外部由调用者清理它们
  • 【RAG面试题】如何获取准确的语义表示
  • ​​Git提交代码Commit消息企业级规范
  • algorithm ——————》双指针(移动0 复写0 快乐数 装水问题 以及数组中找几个数和为指定的元组)
  • 链表两数相加深度解析【进位】【边界条件】【迭代】【递归】
  • Spring Boot 应用开发实战指南:从入门到实战(内含实用技巧+项目案例)
  • 人工智能-基础篇-2-什么是机器学习?(ML,监督学习,半监督学习,零监督学习,强化学习,深度学习,机器学习步骤等)
  • Windows的xshell连接VW里的centos系统里的mysql失败解决方法
  • PostgreSQL 主从集群搭建