如何用Python处理时间序列数据?resample重采样

使用pandas的resample方法进行时间序列数据处理及聚合的核心步骤如下:1. 确保dataframe或series具有datetimeindex,这是resample操作的前提;2. 使用resample(‘freq’)指定目标频率,如’d’(日)、’w’(周)、’m’(月)等;3. 应用聚合函数如.mean()、.sum()、.ohlc()等对每个时间区间内的数据进行汇总;4. 可通过label和closed参数控制时间区间的标签位置和闭合端点;5. 对缺失值使用fillna()方法进行填充或保留nan;6. 结合apply()、agg()、pipe()实现自定义聚合、多列多函数聚合和后处理流程;7. 区分resample()与asfreq(),前者用于聚合降频,后者用于频率转换而不聚合。

如何用Python处理时间序列数据?resample重采样

用Python处理时间序列数据,特别是涉及频率转换和数据聚合时,Pandas库里的resample方法简直是神器。它能让你轻松地将数据从一个时间粒度转换到另一个,比如把每分钟的数据汇总成每日、每周甚至每月的数据,同时还能对这些新的时间段内的数据进行各种统计计算。

如何用Python处理时间序列数据?resample重采样

解决方案

要使用resample,你首先得确保你的DataFrame或Series有一个DatetimeIndex。这是基础,也是关键。一旦有了这个索引,resample方法就能像变魔术一样工作。

想象一下,你有一组高频的传感器数据,每秒记录一次,但你现在只想看每天的平均值。

立即学习“Python免费学习笔记(深入)”;

如何用Python处理时间序列数据?resample重采样

import pandas as pdimport numpy as np# 创建一个示例时间序列数据# 假设从2023年1月1日0点开始,每分钟一个数据点start_time = pd.to_datetime('2023-01-01 00:00:00')time_index = pd.date_range(start=start_time, periods=1000, freq='T') # 'T' for minute frequencydata = np.random.rand(1000) * 100df = pd.DataFrame({'value': data}, index=time_index)print("原始数据(前5行):")print(df.head())print("n原始数据信息:")df.info()# 将数据重采样为每日平均值daily_avg = df.resample('D').mean()print("n重采样为每日平均值(前5行):")print(daily_avg.head())# 重采样为每周总和weekly_sum = df.resample('W').sum()print("n重采样为每周总和(前5行):")print(weekly_sum.head())# 重采样为每月OHLC(开高低收)monthly_ohlc = df['value'].resample('M').ohlc()print("n重采样为每月OHLC(前5行):")print(monthly_ohlc.head())# 如果想指定标签的位置(比如用区间的结束时间作为标签)daily_avg_end_label = df.resample('D', label='right').mean()print("n重采样为每日平均值(标签为区间结束时间,前5行):")print(daily_avg_end_label.head())# 还可以用loffset来调整时间戳daily_avg_shifted = df.resample('D', loffset='-12H').mean() # 将标签向后移12小时print("n重采样并调整标签(前5行):")print(daily_avg_shifted.head())

resample的字符串参数非常灵活,支持各种频率,比如'D'(日)、'W'(周)、'M'(月)、'Q'(季度)、'A'(年)、'H'(小时)、'T''min'(分钟)、'S'(秒)等等。后面跟着的聚合函数(如.mean(), .sum(), .first(), .last(), .ohlc(), .count())决定了每个新时间段内的数据如何被汇总。

resample背后的数据聚合逻辑是什么?

在我看来,resample的核心逻辑,其实就是一种智能的“分箱”(binning)操作。它根据你指定的频率,在时间轴上划分出一个个连续的、互不重叠的时间区间。然后,它会把落在同一个时间区间内的所有原始数据点“收集”起来,形成一个临时的组。最后,你调用 .mean(), .sum() 或者其他聚合函数时,就是对这些组内的数据进行计算,得到每个新时间区间的最终结果。

如何用Python处理时间序列数据?resample重采样

举个例子,如果你把数据从分钟级别重采样到日级别(resample('D')),那么它会识别出所有属于1月1日的数据,把它们归到一起;再识别出所有属于1月2日的数据,又归到一起,以此类推。每个“日”就形成了一个独立的箱子。聚合函数就是对这些箱子里的数据进行操作。

这个过程很巧妙,因为它不仅仅是简单地选择数据,而是真正地重新组织数据。如果某个时间段内没有数据,resample默认会为这个时间段创建一个条目,并填充NaN,这在处理不连续或稀疏的时间序列时非常有用,因为它能帮你清晰地看到数据的缺失情况。我觉得这种“显式缺失”比隐式缺失要好得多,至少你知道哪里没数据。

如何处理resample操作中的缺失值和边界情况?

缺失值和边界情况在实际数据处理中是常态,resample也提供了参数来应对。

缺失值处理:正如前面提到的,如果某个重采样后的时间区间内没有原始数据点,resample会填充NaN。处理这些NaN,你可以在resample之后链式调用Pandas的缺失值处理方法:

# 假设我们有一个稀疏的时间序列sparse_time_index = pd.to_datetime(['2023-01-01', '2023-01-03', '2023-01-06'])sparse_data = [10, 20, 30]sparse_df = pd.DataFrame({'value': sparse_data}, index=sparse_time_index)# 重采样为每日,会有NaNdaily_sparse = sparse_df.resample('D').mean()print("n稀疏数据重采样为每日(含NaN):")print(daily_sparse)# 填充缺失值daily_filled_ffill = daily_sparse.fillna(method='ffill') # 用前一个有效值填充print("n缺失值前向填充:")print(daily_filled_ffill)daily_filled_bfill = daily_sparse.fillna(method='bfill') # 用后一个有效值填充print("n缺失值后向填充:")print(daily_filled_bfill)daily_filled_zero = daily_sparse.fillna(0) # 填充0print("n缺失值填充0:")print(daily_filled_zero)

选择哪种填充方式取决于你的业务逻辑和数据特性。有时候,NaN本身就是一种信息,表示那个时间点确实没有数据,不需要填充。

边界情况(closedlabel):resample默认情况下,区间的左边界是包含的,右边界是不包含的(closed='left'),并且新生成的时间戳标签是区间的左边界(label='left')。但你可以在特定场景下调整它们:

closed: 决定区间的哪一端是闭合的(包含)。'left' (默认): [start, end)'right': (start, end]label: 决定新时间段的标签是使用区间的开始时间还是结束时间。'left' (默认): 使用区间的开始时间作为标签。'right': 使用区间的结束时间作为标签。

# 原始数据,方便观察边界data_for_boundary = pd.DataFrame({'value': range(5)}, index=pd.to_datetime(['2023-01-01 00:00', '2023-01-01 23:59', '2023-01-02 00:00', '2023-01-02 23:59', '2023-01-03 00:00']))print("n原始数据用于边界观察:")print(data_for_boundary)# 默认行为:closed='left', label='left'# 2023-01-01的数据包括00:00到23:59# 2023-01-02的数据包括00:00到23:59default_resample = data_for_boundary.resample('D').sum()print("n默认重采样(closed='left', label='left'):")print(default_resample)# closed='right', label='right'# 2023-01-01的数据包括(2022-12-31 23:59, 2023-01-01 23:59]# 标签是结束时间right_closed_right_label = data_for_boundary.resample('D', closed='right', label='right').sum()print("n重采样(closed='right', label='right'):")print(right_closed_right_label)

理解这些参数对于确保数据聚合的准确性至关重要,特别是当你的业务对时间边界有严格要求时。

除了简单的聚合,resample还能做哪些高级操作?

resample的强大之处远不止于简单的聚合函数。它能与Pandas的其他功能结合,实现更复杂的分析。

自定义聚合函数 (apply):如果内置的mean, sum等不能满足你的需求,你可以传入一个自定义函数到apply方法中。这个函数会接收每个重采样区间的Series数据。

# 计算每个月数据的范围 (max - min)monthly_range = df['value'].resample('M').apply(lambda x: x.max() - x.min())print("n每月数据范围(自定义聚合):")print(monthly_range.head())# 甚至可以返回多个值,但需要确保返回的是Series或DataFrame,或者每个区间返回一个标量# 比如返回每个月的Q1和Q3def get_quantiles(x):    return pd.Series({'Q1': x.quantile(0.25), 'Q3': x.quantile(0.75)})monthly_quantiles = df['value'].resample('M').apply(get_quantiles)print("n每月Q1和Q3(自定义聚合返回多值):")print(monthly_quantiles.head())

这给了你极大的灵活性,可以根据业务需求实现任何复杂的聚合逻辑。

多列聚合:如果你DataFrame有多列,并且想对不同的列应用不同的聚合函数,可以使用agg方法。

df_multi_col = df.copy()df_multi_col['another_value'] = np.random.rand(len(df)) * 50# 对'value'列求平均,对'another_value'列求和daily_agg_multi = df_multi_col.resample('D').agg({    'value': 'mean',    'another_value': 'sum'})print("n多列聚合(不同函数):")print(daily_agg_multi.head())# 对所有数值列应用多个聚合函数daily_agg_all_cols = df_multi_col.resample('D').agg(['mean', 'sum', 'std'])print("n所有数值列应用多个聚合函数:")print(daily_agg_all_cols.head())

agg方法让多维度分析变得异常便捷。

pipe结合:pipe方法允许你将resample的结果直接传递给一个函数或一系列函数,实现更流畅的工作流。

def process_resampled_data(resampled_df):    # 假设这里有一些后处理逻辑,比如填充缺失值并计算一个新列    processed_df = resampled_df.fillna(0)    processed_df['value_ratio'] = processed_df['value'] / processed_df['another_value']    return processed_df# 将resample的结果通过pipe传递给自定义处理函数processed_output = df_multi_col.resample('D').mean().pipe(process_resampled_data)print("n使用pipe进行后处理:")print(processed_output.head())

这有助于构建清晰、可读的数据处理管道。

asfreq()resample()区别虽然不是resample本身的高级操作,但理解asfreq()resample()的区别对于时间序列处理至关重要。resample()是聚合操作,它会改变数据点的数量,并对每个区间进行聚合。而asfreq()仅仅是改变频率,它不会进行聚合,如果新的频率点上没有数据,它会填充NaN,或者直接取最近的一个点(取决于参数)。

# df是原始分钟级数据# resample到每小时,取平均hourly_resample = df.resample('H').mean()print("nresample到每小时(平均):")print(hourly_resample.head())# asfreq到每小时,不聚合,直接取对应时间点的值,没有则NaN# 注意:asfreq通常用于升采样,或在降采样时仅取特定点hourly_asfreq = df.asfreq('H')print("nasfreq到每小时(不聚合):")print(hourly_asfreq.head())

asfreq在需要保持原始数据点结构,只是改变观察频率时非常有用,比如从日数据变为月数据,但只关心每个月的第一天。

这些高级用法让resample不仅仅是一个简单的聚合工具,更是时间序列分析中不可或缺的利器。通过灵活运用,你可以解决各种复杂的时间序列数据挑战。

以上就是如何用Python处理时间序列数据?resample重采样的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1363704.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
Python怎样处理文本数据?字符串操作完整指南
上一篇 2025年12月14日 03:34:28
Python如何分析数据相关性—热力图与相关系数矩阵
下一篇 2025年12月14日 03:34:38

相关推荐

  • 超越思维链?深度循环隐式推理引爆AI圈,LLM扩展有了新维度

    超越思维链?深度循环隐式推理引爆AI圈,LLM扩展有了新维度超越思维链?深度循环隐式推理引爆AI圈,LLM扩展有了新维度超越思维链?深度循环隐式推理引爆AI圈,LLM扩展有了新维度超越思维链?深度循环隐式推理引爆AI圈,LLM扩展有了新维度

    突破性语言模型架构:无需额外训练数据,35亿参数媲美500亿参数模型! 一项来自马里兰大学的最新研究,在人工智能领域掀起了波澜。该研究提出了一种全新的语言模型架构,它能够在无需特殊训练数据的情况下,通过迭代循环块在潜在空间中进行隐式推理,从而显著提升模型的计算效率,尤其是在需要复杂推理的任务上实现3…

    2026年9月2日 用户投稿
    300
  • win11怎么打开控制面板_win11快速打开控制面板的几种方式

    Windows 11中访问控制面板的五种方法:一、点击任务栏搜索图标输入“控制面板”打开;二、按Win+R输入“control”命令启动;三、在设置应用中搜索“控制面板”跳转;四、使用Win+X快捷菜单选择“控制面板”;五、通过个性化设置创建桌面快捷方式。 如果您需要访问系统设置,但发现传统入口位置…

    2026年9月2日
    000
  • PS取消显示变换控件步骤

    PS取消显示变换控件步骤PS取消显示变换控件步骤PS取消显示变换控件步骤PS取消显示变换控件步骤

    启动Photoshop程序,进入主界面。 在工具栏顶部选择“直接选择工具”。 此时可观察到图像周围出现了带有操作按钮的变换控制框。 取消勾选“显示变换控件”选项,即可隐藏该控制框。 以上就是PS取消显示变换控件步骤的详细内容,更多请关注创想鸟其它相关文章!

    2026年9月2日 用户投稿
    000
  • 指纹浏览器ip购买网站是什么 优质代理IP购买渠道推荐

    为指纹浏览器配置合适的代理ip需从专业服务商处购买住宅代理、数据中心代理或isp代理ip,而非通过所谓“指纹浏览器ip购买网站”直接获取;2. 住宅代理ip因来源于真实家庭网络,具备高匿名性和真实性,适合社交媒体运营、电商抢购等需模拟真实用户行为的场景,但成本较高;3. 数据中心代理ip速度快、价格…

    2026年9月2日
    000
  • 微信小程序复制功能失效?即使配置了权限仍然报错怎么办

    微信小程序复制功能故障排除指南 在微信小程序开发中,复制功能失效是一个常见问题。本文针对“setClipboardData:fail api scope is not declared in the privacy agreement”错误进行详细分析和解决方案。此错误通常发生在开发者已在公众号后台…

    2026年9月2日
    000
  • win10剪切文件后粘贴选项是灰色的怎么办_Win10文件剪切后无法粘贴问题修复

    1、重启Windows资源管理器可解决因进程异常导致的粘贴不可用问题;2、清空剪贴板缓存能修复数据损坏引起的粘贴功能失效;3、检查注册表中NoViewContextMenu键值,确保其未禁用上下文菜单;4、运行SFC扫描可修复系统文件损坏对剪贴板功能的影响;5、通过干净启动排除第三方程序或服务冲突。…

    2026年9月2日
    000
  • 微软应用商店中国区首届开发者大会举办,今年开启商业化进程

    7 月 1 日消息,以“生态赋能,增长共振”为主题的微软应用商店中国区首届开发者大会于 6 月 25 日在深圳举办。大会现场,微软应用商店发布《中国市场 pc 应用开发者白皮书》。 据官方介绍,微软应用商店是 Windows 系统生态的核心组成部分,在全球拥有超 14 亿活跃设备,覆盖 200 多个…

    2026年9月2日
    000
  • Yandex季节性推广策略:怎样用节日热点引爆全年销售高峰?

    yandex季节性推广的核心是通过数据分析驱动全年销售增长。首先,基于yandex年度推广日历规划节日节点,结合yandex.metrica和audience进行用户洞察,精准识别高价值群体与行为模式;其次,利用历史数据预测趋势,实时数据优化投放,用户行为数据提升转化,实现广告创意与节日氛围的深度结…

    2026年9月2日
    000
  • PDF转Word电脑上怎么操作_PDF在电脑上转Word的详细教程

    PDF转Word电脑上怎么操作_PDF在电脑上转Word的详细教程PDF转Word电脑上怎么操作_PDF在电脑上转Word的详细教程PDF转Word电脑上怎么操作_PDF在电脑上转Word的详细教程PDF转Word电脑上怎么操作_PDF在电脑上转Word的详细教程

    使用专业工具、在线网站、Word或WPS可将PDF转为Word。先选择合适方法,再按步骤转换并保存文件。 如果您需要编辑PDF文件中的内容,但原始文档无法直接修改,可以将PDF转换为Word格式以方便操作。以下是几种在电脑上完成PDF转Word的常用方法: 一、使用专业PDF转换工具 通过专业的PD…

    2026年9月2日 用户投稿
    100
  • 中国、法国、印度、日本等61个国家签署巴黎人工智能宣言

    ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ 2月10日,人工智能行动峰会在法国巴黎举行。来自全球30多个国家的高层领导人和国际组织负责人齐聚一堂,共同发布了《关于发展包容、可持续的人工智能造福人类与地球的声明》。 此次峰会取得了重要成果:…

    2026年9月2日
    000
  • 为什么iPhone5S系统更新后屏幕无响应如何强制重启?长按电源键和主页键重启

    首先尝试强制重启,若无效则通过电脑使用iTunes恢复模式修复,同时检查充电状态与硬件连接问题。具体为:一、同时按住Home键和电源键10-15秒直至出现苹果Logo;二、连接电脑后进入恢复模式,待iTunes提示后恢复设备;三、确保充电至少30分钟并清理接口,排除电源问题。 如果您的 iPhone…

    2026年9月2日
    000
  • VSCode怎么侧边显示函数_VSCode大纲视图侧边栏函数列表教程

    最直接的方式是启用VSCode的“大纲视图”功能,它能清晰列出文件中的函数、类等符号,支持快速导航与筛选,提升代码阅读与重构效率。 VSCode中想要在侧边栏看到函数列表,最直接、也是我个人觉得效率最高的方式,就是利用它的“大纲视图”(Outline View)。这个功能就像给你的代码文件画了一张清…

    2026年9月2日
    000
  • win10系统PIN码无法使用怎么办_win10系统PIN码不可用解决方法

    1、可通过账户设置重置PIN码,进入系统后删除并重新添加PIN;2、登录界面可点击“我忘记了PIN”通过微软账户验证重置;3、组策略限制时需修改注册表allowdomainpinlogon值为1;4、系统文件损坏可用命令提示符执行sfc和dism命令修复;5、安全模式下通过命令提示符替换utilma…

    2026年9月2日
    100
  • Yandex广告创意秘籍:怎样用A/B测试找到最佳投放方案?

    yandex广告a/b测试的核心是通过对比不同广告版本,找出能最大化点击率和转化率的创意方案。首先明确测试目标,如提升点击率或转化率,并在yandex.direct中创建至少两个广告版本,每次仅改变一个变量,如标题、描述、附加链接或受众群体。利用平台内置工具在广告组层面设置展示比例,监控ctr、转化…

    2026年9月2日
    000
  • 放大招!文心一言「全面免费」,同时开启「深度搜索」,抢鲜实测!

    放大招!文心一言「全面免费」,同时开启「深度搜索」,抢鲜实测!放大招!文心一言「全面免费」,同时开启「深度搜索」,抢鲜实测!放大招!文心一言「全面免费」,同时开启「深度搜索」,抢鲜实测!放大招!文心一言「全面免费」,同时开启「深度搜索」,抢鲜实测!

    2025年伊始,大模型技术再创新高!百度文心一言宣布,自4月1日零时起,pc端和app端全面免费开放,用户可体验文心系列最新模型,以及超长文档处理、专业检索增强、高级ai绘画、多语种对话等功能。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜…

    2026年9月2日 用户投稿
    200
  • b站24小时直播入口快速通道-b站24小时直播入口实时弹幕互动

    b站没有专门的24小时直播入口,但可通过首页推荐、分区浏览、搜索关键词、关注主播或使用第三方聚合平台快速找到正在直播的内容,进入直播间并登录账号后即可在输入框发送弹幕参与实时互动,还可使用彩色或高级弹幕增强趣味性,需注意文明发言,b站直播涵盖游戏、娱乐、知识、生活及虚拟主播等多种类型,若找不到想看的…

    2026年9月2日
    000
  • App视频播放如何添加全屏不遮挡文字水印?

    App视频播放全屏水印的挑战与解决方案 为App视频播放添加全屏显示且不遮挡视频内容的文字水印,是许多开发者面临的难题,尤其是在保证iOS和Android系统兼容性的前提下。本文将探讨如何解决“如何在App前端为video视频播放添加全屏不遮挡文字水印,并兼容iOS和Android”这一问题。 直接…

    2026年9月2日
    000
  • 从复杂到简洁:如何用 Composer 轻松安装 Ibexa Commerce

    可以通过以下地址学习 composer:学习地址 在开发一个电商平台时,选择一个合适的框架和工具集是至关重要的。我最初尝试了多种开源和商业解决方案,但它们要么功能不全,要么安装过程过于复杂。直到我找到了 Ibexa Commerce,这是一个基于 Symfony 的全栈解决方案,提供了丰富的功能和灵…

    用户投稿 2026年9月2日
    000
  • 学而思发布全新“随时问”APP,DeepSeek随便用

    全教育行业拥抱deepseek的浪潮还在继续,在产品层面的落地和结合也开始带来惊喜。 学而思今天正式发布接入DeepSeek的全新“随时问”APP。该产品深度融合DeepSeek R1智能推理,依托学而思22年教研沉淀,现面向全国中小学生免费开放,提供苏格拉底式启发学习模式,支持题目分步解析、无限追…

    2026年9月2日
    000
  • 封神:开天曹宝全解析:法力永动机与阵容搭配终极指南

    封神:开天曹宝全解析:法力永动机与阵容搭配终极指南封神:开天曹宝全解析:法力永动机与阵容搭配终极指南封神:开天曹宝全解析:法力永动机与阵容搭配终极指南封神:开天曹宝全解析:法力永动机与阵容搭配终极指南

    还在为队伍法力耗尽而苦恼?《封神:开天》xp1赛季的强力辅助曹宝,正是你扭转战局的关键人物!这位表面低调的仙家角色,凭借其颠覆战场的回蓝技能与战略级灵宝,成功登顶当前版本最强辅助! 法力源泉:曹宝核心机制深度剖析【借灵献宝】——群体回蓝利器! 只需消耗5点法力值,曹宝便能发动这一逆天技能。技能满级时…

    2026年9月2日 用户投稿
    000

发表回复

登录后才能评论
关注微信