非等距时间戳的Pandas DataFrame高效重采样需求
高效实现非等距传感器数据的等间隔重采样(保留原始采样)
针对非等距时间戳的传感器数据,要实现指定间隔补全、前值填充、保留原始采样的需求,无需逐行循环,用Pandas的矢量化操作就能高效完成,核心思路是合并原始时间戳与目标间隔时间戳,再通过前向填充补全数据。
步骤与代码示例
首先修正原始DataFrame的语法错误(原示例代码存在参数传递问题):
import pandas as pd # 原始非等距传感器数据 df = pd.DataFrame( columns=["Timestamp", "SensorA", "SensorB"], data=[ [pd.Timestamp("2022-10-01 10:30:01.500"), 1.5, 3.5], [pd.Timestamp("2022-10-01 10:30:01.800"), 2.0, 3.5], [pd.Timestamp("2022-10-01 10:30:01.900"), 2.0, 4.0] ] )
高效重采样实现:
# 1. 将时间列设为索引并排序(确保时间序列有序) df = df.set_index("Timestamp").sort_index() # 2. 定义目标重采样间隔(示例为200ms) resample_freq = "200ms" # 3. 生成覆盖原始数据时间范围的等间隔时间序列 start = df.index.min() end = df.index.max() target_ts = pd.date_range(start=start, end=end, freq=resample_freq) # 4. 合并原始时间戳与目标间隔时间戳,去重后排序得到完整索引 full_index = df.index.union(target_ts).sort_values() # 5. 重索引并前向填充,保留原始采样数据 result = df.reindex(full_index).ffill().reset_index(names="Timestamp")
关键逻辑说明
- 合并索引:通过
index.union()同时保留原始采样时间和目标间隔时间,自动去重(避免冲突时重复行),排序后保证时间序列有序。 - 前向填充:
ffill()用最近的前一个有效值填充间隔,完全符合"相邻测量值之间用前一次值填充"的需求。 - 矢量化操作:所有步骤都是Pandas底层优化的矢量化操作,相比逐行循环,性能提升显著(数据量越大,优势越明显)。
输出验证
运行上述代码后,result的输出与需求完全一致:
Timestamp SensorA SensorB 0 2022-10-01 10:30:01.500 1.5 3.5 1 2022-10-01 10:30:01.700 1.5 3.5 2 2022-10-01 10:30:01.800 2.0 3.5 3 2022-10-01 10:30:01.900 2.0 4.0
内容的提问来源于stack exchange,提问作者deniz
相关产品推荐
相关产品推荐

