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

免费影视、动漫、音乐、游戏、小说资源长期稳定更新! 👉 点此立即查看 👈
本文介绍如何将高频数据框(如每15秒采样)中以低频参考时间点(如每5分钟)为中心、按真实时间窗口(如±2.5分钟)计算滚动均值,并精准对齐到参考时间点。核心使用 rolling(..., on='time', center=True) 与 merge_asof 协同实现。
在时序数据分析中,我们常常会遇到一个经典难题:如何将高频采集的传感器数据(比如每15秒记录一次的车速),精准地聚合到另一组低频发生的事件时间点上(比如每5分钟的系统快照时间)?
这里的关键在于,我们需要的不是简单粗暴地按固定时间分桶。真正的需求是:以低频数据框df2中的每一个时间戳为“圆心”,在高频数据框df1中,划出一个前后对称的时间窗口(例如前后各2.5分钟,总宽度5分钟),然后计算这个窗口内所有样本的均值。这种“中心对齐的时间滑动窗口”操作,用常规的resample()或groupby()很难直接实现,必须借助Pandas中时间感知的滚动操作与近似连接功能协同完成。
✅ 正确实现步骤
下面这套方法,可以说是处理这类问题的标准答案,兼顾了逻辑的严谨性和执行的效率。
-
打好基础:统一时间格式
第一步永远是确保时间列的数据类型正确。将两个数据框的时间列都转换为Pandas可识别的datetime类型,这是后续所有时间操作的前提。df1['time'] = pd.to_datetime(df1['time']) df2['time'] = pd.to_datetime(df2['time'])
-
核心计算:在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")) # 合并均值列,避免重复列名 -
精准匹配:用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' 才能找最近时间点(而非仅向前/向后) ) -
清理结果:过滤未匹配成功的行(可选)
匹配完成后,可能会存在一些未能成功找到对应时间窗口的行,其来自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仍可能根据direction和tolerance的设置匹配到最近的行。
✅ 完整可运行示例(精简版)
理论说再多,不如一段可运行的代码来得实在。下面是一个精简但完整的示例,涵盖了从数据构建到最终输出的全过程:
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']])
这套方案经过大量实践检验,在保证计算精度的同时,也拥有出色的性能,即使面对百万级别的时间序列对齐任务也能从容应对,可以说是工业级时序特征工程中的一项标准实践了。
相关攻略
在现代社会,口号不仅是简单的标语,更是凝聚共识、引导行为的有力工具。一句有深度的口号,往往能潜移默化地促进团队和谐,推动积极行动。那么,如何打造既个性鲜明又直击人心的口号呢?今天,我们就聚焦于一个至关重要的安全领域——防火,为大家整理了一份精炼实用的标语合集。这些口号经过精心筛选,言简意赅,希望能为
农村防火标语(1--15条) 一句好的防火标语,就像社区编织的一张无形安全网,守护的是千家万户长久的安宁与幸福。 1、社区编织防火网,幸福生活万年长。 2、防火这事儿,人人有责。大家都上心,日子才能越过越红火。 3、数据不说谎:森林火灾,十有八九是人为因素引发的。 4、可别小看隐患。千里之堤,溃于蚁
防火标语口号大全:让安全警句深入人心 一句响亮、易懂的防火宣传口号,是传递安全意识最直接、最有效的工具。它能在瞬间抓住人们的注意力,将“预防为主、生命至上”的理念深植于心,并在日常工作和生活中形成强大的行为约束力。本文系统梳理了适用于家庭、森林、工地、企业、农田等不同场景的防火标语与安全警句,旨在为
防火宣传标语(1-20) 1 全民总动员,防火保安全。 2 全民护林、人人防火。 3 一人把关一处安,众人防火稳如山。 4 时时注意森林防火、人人重视森林防火。 5 森林防火记心上,人人护林理应当。 6 山田年年耕、防火天天讲。 7 保护消防设施,维护消防安全。 8 入山不带烟、野外
森林防火标语手抄报图片文案 “坚持生态效益、经济效益、社会效益相结合,突出生态效益。”这句话点明了现代林业发展的核心。如今信息传播触手可及,我们每天都能接触到海量内容,其中那些简洁有力、直击人心的句子,往往最能留下深刻印象。你是否也有收集和分享精彩语句的习惯?下面整理的这份森林防火标语集锦,或许能为
热门专题
热门推荐
青奥会口号中英文全览 提及青年奥林匹克运动会(青奥会),许多人会联想到2014年盛夏的南京。这项专为青少年设计的国际体育盛事,不仅聚焦高水平竞技,更深度融合教育、文化与社区活动,旨在倡导健康积极的生活方式。本文将带您回顾历届青奥会的经典口号,解读其背后的青春理念与时代精神。 【青奥会口号英文对照】
亚青会:亚洲青年体育盛典与南京2026 提到亚洲大型体育赛事,除了广为人知的亚运会,还有一项专为青少年设立的综合性运动会——亚洲青年运动会,简称亚青会。首届赛事于2009年在新加坡成功举办。本文将深入解读亚青会的英文口号、发展历程,并重点介绍2026年南京亚青会的核心信息。 英文口号 亚青会的官方英
运动会英语口号大全:精选助威语与团队激励短句 本文为您精心整理了一份实用的《运动会英语口号》合集,旨在为您的体育盛会注入国际化活力与磅礴气势,助力团队展现风采。 为同伴加油鼓劲,简洁有力首选:Come on buddy, everybody! (伙伴们,一起加油!) 决胜时刻,一句Hold on!(
稳定币:数字资产世界的“定海神针” 在波动剧烈的加密货币市场中,稳定币扮演着至关重要的角色。它像一座稳固的桥梁,连接着传统金融的确定性与区块链世界的创新活力。凭借其相对稳定的价格,稳定币在交易对冲、跨境支付及资产管理等场景中应用广泛,已成为数字资产组合中不可或缺的配置。接下来,我们将厘清稳定币的核心
班级跑操口号押韵:点燃团队魂,喊出青春劲 “十班十班,与我同行;前进前进,激情澎湃;十班不败,斗志昂扬;十班最强!”在校园生活的集体韵律中,一句句响亮有力的跑操口号,远不止是简单的词句排列。它们凝聚着班级的团队之魂,点燃着青春的拼搏之劲,是校园晨光中不可或缺的活力乐章。那些充满力量、朗朗上口的押韵口





