首页 游戏 软件 资讯 排行榜 专题
首页
编程语言
如何基于另一数据框时间戳中心对 Pandas 数据框进行时间窗口滚动均值计算

如何基于另一数据框时间戳中心对 Pandas 数据框进行时间窗口滚动均值计算

热心网友
92
转载
2026-05-05

如何基于另一数据框时间戳中心对 Pandas 数据框进行时间窗口滚动均值计算

免费影视、动漫、音乐、游戏、小说资源长期稳定更新! 👉 点此立即查看 👈

本文介绍如何将高频数据框(如每15秒采样)中以低频参考时间点(如每5分钟)为中心、按真实时间窗口(如±2.5分钟)计算滚动均值,并精准对齐到参考时间点。核心使用 rolling(..., on='time', center=True) 与 merge_asof 协同实现。

在时序数据分析中,我们常常会遇到一个经典难题:如何将高频采集的传感器数据(比如每15秒记录一次的车速),精准地聚合到另一组低频发生的事件时间点上(比如每5分钟的系统快照时间)?

这里的关键在于,我们需要的不是简单粗暴地按固定时间分桶。真正的需求是:以低频数据框df2中的每一个时间戳为“圆心”,在高频数据框df1中,划出一个前后对称的时间窗口(例如前后各2.5分钟,总宽度5分钟),然后计算这个窗口内所有样本的均值。这种“中心对齐的时间滑动窗口”操作,用常规的resample()groupby()很难直接实现,必须借助Pandas中时间感知的滚动操作与近似连接功能协同完成。

✅ 正确实现步骤

下面这套方法,可以说是处理这类问题的标准答案,兼顾了逻辑的严谨性和执行的效率。

  1. 打好基础:统一时间格式
    第一步永远是确保时间列的数据类型正确。将两个数据框的时间列都转换为Pandas可识别的datetime类型,这是后续所有时间操作的前提。

    df1['time'] = pd.to_datetime(df1['time'])
    df2['time'] = pd.to_datetime(df2['time'])
  2. 核心计算:在df1上生成中心滚动均值
    这是实现“中心对齐”窗口的关键一步。使用rolling(window="300s", on="time", center=True)方法:window="300s"定义了5分钟的总窗口宽度,而center=True这个参数至关重要,它确保了窗口是以当前行的时间戳为几何中心向两侧展开(即±150秒)。计算出的均值会自然地与原始时间戳对齐。

    df1_rolling = df1.rolling(window="300s", on="time", center=True).mean()
    df1 = df1.join(df1_rolling.add_suffix("_a vg"))  # 合并均值列,避免重复列名
  3. 精准匹配:用merge_asof进行时间近似连接
    现在,我们需要把df2中的每个参考时间点,与df1中计算好滚动均值的对应行匹配起来。这里就要请出merge_asof了。它的默认行为是向后查找,但为了获得真正意义上的“最近邻”匹配,有几个参数必须设置到位:首先确保两个表都按时间排序,然后设置direction='nearest'来寻找最近的时间点,再通过tolerance参数(例如15秒)控制匹配的最大允许误差。

    df1_sorted = df1.sort_values('time')
    df2_sorted = df2.sort_values('time')
    result = pd.merge_asof(
        df1_sorted,
        df2_sorted.rename(columns={'speed': 'speed_df2'}),
        on='time',
        tolerance=pd.Timedelta('15s'),
        allow_exact_matches=True,
        direction='nearest'  # 关键:改为 'nearest' 才能找最近时间点(而非仅向前/向后)
    )
  4. 清理结果:过滤未匹配成功的行(可选)
    匹配完成后,可能会存在一些未能成功找到对应时间窗口的行,其来自df2的列值为NaN。根据分析需求,可以选择将这些行过滤掉,保证结果集的整洁。

    result = result.dropna(subset=['speed_df2'])

⚠️ 几个必须留意的细节:

  • direction='nearest'参数是灵魂:这个参数在Pandas较新版本(≥1.1.0)中引入,是实现“寻找最近时间戳”功能的关键。如果使用旧版本,就需要手动实现复杂逻辑,非常不推荐。
  • 边界处的NaN是正常的:使用center=True进行滚动计算时,在数据序列的开头和结尾,由于无法构成完整的对称窗口,结果会是NaN。这是预期行为。如果一定要填充,可以用前向/后向填充,但需警惕这会引入数据偏差。
  • 时间类型是硬性要求:时间列必须是datetime64[ns]类型,否则rolling(on=...)会报错。用pd.to_datetime()进行转换是稳妥的做法。
  • 注意数据覆盖范围:如果df1的时间范围不足以覆盖df2中某个时间点所需的±2.5分钟窗口,那么该点的滚动均值就会是NaN,但merge_asof仍可能根据directiontolerance的设置匹配到最近的行。

✅ 完整可运行示例(精简版)

理论说再多,不如一段可运行的代码来得实在。下面是一个精简但完整的示例,涵盖了从数据构建到最终输出的全过程:

import pandas as pd
import numpy as np

# 示例数据构建(略去冗长原始数据,此处用前几行示意)
df1 = pd.DataFrame({
    'time': pd.date_range('2022-10-04 00:00:24', periods=80, freq='15S'),
    'speed': np.random.uniform(3.0, 4.6, 80)
})
df2 = pd.DataFrame({
    'time': pd.to_datetime(['2022-10-04 00:03:28', '2022-10-04 00:08:34',
                            '2022-10-04 00:13:25', '2022-10-04 00:18:27']),
    'speed': [4.646, 5.328, 5.895, 5.665]
})

# 步骤1:计算 df1 的中心滚动均值(5分钟窗)
df1['speed_a vg'] = df1.rolling(window='300s', on='time', center=True)['speed'].mean()

# 步骤2:近似时间对齐(关键:direction='nearest')
merged = pd.merge_asof(
    df1.sort_values('time'),
    df2.sort_values('time').rename(columns={'speed': 'speed_df2'}),
    on='time',
    direction='nearest',
    tolerance=pd.Timedelta('15s')
)

# 步骤3:保留匹配成功的行
final = merged.dropna(subset=['speed_df2']).reset_index(drop=True)
print(final[['time', 'speed', 'speed_a vg', 'speed_df2']])

这套方案经过大量实践检验,在保证计算精度的同时,也拥有出色的性能,即使面对百万级别的时间序列对齐任务也能从容应对,可以说是工业级时序特征工程中的一项标准实践了。

来源:https://www.php.cn/faq/2345382.html
免责声明: 游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

相关攻略

防火标语口号大全短(78句)
职业与学业
防火标语口号大全短(78句)

在现代社会,口号不仅是简单的标语,更是凝聚共识、引导行为的有力工具。一句有深度的口号,往往能潜移默化地促进团队和谐,推动积极行动。那么,如何打造既个性鲜明又直击人心的口号呢?今天,我们就聚焦于一个至关重要的安全领域——防火,为大家整理了一份精炼实用的标语合集。这些口号经过精心筛选,言简意赅,希望能为

热心网友
05.05
农村防火标语锦集30条
职业与学业
农村防火标语锦集30条

农村防火标语(1--15条) 一句好的防火标语,就像社区编织的一张无形安全网,守护的是千家万户长久的安宁与幸福。 1、社区编织防火网,幸福生活万年长。 2、防火这事儿,人人有责。大家都上心,日子才能越过越红火。 3、数据不说谎:森林火灾,十有八九是人为因素引发的。 4、可别小看隐患。千里之堤,溃于蚁

热心网友
05.05
防火标语口号大全短锦集
职业与学业
防火标语口号大全短锦集

防火标语口号大全:让安全警句深入人心 一句响亮、易懂的防火宣传口号,是传递安全意识最直接、最有效的工具。它能在瞬间抓住人们的注意力,将“预防为主、生命至上”的理念深植于心,并在日常工作和生活中形成强大的行为约束力。本文系统梳理了适用于家庭、森林、工地、企业、农田等不同场景的防火标语与安全警句,旨在为

热心网友
05.05
防火宣传标语(80条)
职业与学业
防火宣传标语(80条)

防火宣传标语(1-20) 1 全民总动员,防火保安全。 2 全民护林、人人防火。 3 一人把关一处安,众人防火稳如山。 4 时时注意森林防火、人人重视森林防火。 5 森林防火记心上,人人护林理应当。 6 山田年年耕、防火天天讲。 7 保护消防设施,维护消防安全。 8 入山不带烟、野外

热心网友
05.05
森林防火标语手抄报图片文案
职业与学业
森林防火标语手抄报图片文案

森林防火标语手抄报图片文案 “坚持生态效益、经济效益、社会效益相结合,突出生态效益。”这句话点明了现代林业发展的核心。如今信息传播触手可及,我们每天都能接触到海量内容,其中那些简洁有力、直击人心的句子,往往最能留下深刻印象。你是否也有收集和分享精彩语句的习惯?下面整理的这份森林防火标语集锦,或许能为

热心网友
05.05

最新APP

宝宝过生日
宝宝过生日
应用辅助 04-07
台球世界
台球世界
体育竞技 04-07
解绳子
解绳子
休闲益智 04-07
骑兵冲突
骑兵冲突
棋牌策略 04-07
三国真龙传
三国真龙传
角色扮演 04-07

热门推荐

青奥会口号英文
职业与学业
青奥会口号英文

青奥会口号中英文全览 提及青年奥林匹克运动会(青奥会),许多人会联想到2014年盛夏的南京。这项专为青少年设计的国际体育盛事,不仅聚焦高水平竞技,更深度融合教育、文化与社区活动,旨在倡导健康积极的生活方式。本文将带您回顾历届青奥会的经典口号,解读其背后的青春理念与时代精神。 【青奥会口号英文对照】

热心网友
05.05
亚青会口号英文
职业与学业
亚青会口号英文

亚青会:亚洲青年体育盛典与南京2026 提到亚洲大型体育赛事,除了广为人知的亚运会,还有一项专为青少年设立的综合性运动会——亚洲青年运动会,简称亚青会。首届赛事于2009年在新加坡成功举办。本文将深入解读亚青会的英文口号、发展历程,并重点介绍2026年南京亚青会的核心信息。 英文口号 亚青会的官方英

热心网友
05.05
运动会英语口号
职业与学业
运动会英语口号

运动会英语口号大全:精选助威语与团队激励短句 本文为您精心整理了一份实用的《运动会英语口号》合集,旨在为您的体育盛会注入国际化活力与磅礴气势,助力团队展现风采。 为同伴加油鼓劲,简洁有力首选:Come on buddy, everybody! (伙伴们,一起加油!) 决胜时刻,一句Hold on!(

热心网友
05.05
稳定币是什么?2025年值得持有的十大稳定币推荐
web3.0
稳定币是什么?2025年值得持有的十大稳定币推荐

稳定币:数字资产世界的“定海神针” 在波动剧烈的加密货币市场中,稳定币扮演着至关重要的角色。它像一座稳固的桥梁,连接着传统金融的确定性与区块链世界的创新活力。凭借其相对稳定的价格,稳定币在交易对冲、跨境支付及资产管理等场景中应用广泛,已成为数字资产组合中不可或缺的配置。接下来,我们将厘清稳定币的核心

热心网友
05.05
班级跑操口号押韵摘录
职业与学业
班级跑操口号押韵摘录

班级跑操口号押韵:点燃团队魂,喊出青春劲 “十班十班,与我同行;前进前进,激情澎湃;十班不败,斗志昂扬;十班最强!”在校园生活的集体韵律中,一句句响亮有力的跑操口号,远不止是简单的词句排列。它们凝聚着班级的团队之魂,点燃着青春的拼搏之劲,是校园晨光中不可或缺的活力乐章。那些充满力量、朗朗上口的押韵口

热心网友
05.05