如何在Pandas中无迭代计算A数据与前序B数据的时间差
Pandas非迭代实现不同数据流时间偏移计算
问题说明
存在两个不同速率的数据流(A和B),时间戳存在抖动(非固定步长),示例输入数据如下:
src,idx,ts B,1,20 A,1,100 A,2,200 A,3,300 B,2,320 A,4,400 A,5,500 A,6,600 B,3,620
需要为每个A数据计算其与前序最近的B数据的时间偏移,最终得到如下结果:
src,idx,ts A,1,80 A,2,180 A,3,280 A,4,80 A,5,180 A,6,280
要求在Pandas中不使用迭代完成该需求。
解决方案
可以通过merge_asof结合数据筛选实现,具体步骤如下:
- 分离
A和B两类数据流 - 用
merge_asof将每个A数据匹配到时间戳小于等于它的最后一个B数据 - 计算时间偏移并整理输出结果
代码实现
import pandas as pd # 构造示例数据(实际场景可替换为你的数据源) df = pd.DataFrame([ ["B",1,20], ["A",1,100], ["A",2,200], ["A",3,300], ["B",2,320], ["A",4,400], ["A",5,500], ["A",6,600], ["B",3,620] ], columns=["src", "idx", "ts"]) # 拆分A、B数据 df_a = df[df["src"] == "A"].reset_index(drop=True) df_b = df[df["src"] == "B"].reset_index(drop=True) # 用merge_asof匹配每个A对应的前序B数据 # 注意:df_b需要按ts排序,示例中已满足,实际使用时可先执行df_b.sort_values("ts", inplace=True) merged = pd.merge_asof(df_a, df_b, on="ts", direction="backward") # 计算时间偏移并整理结果格式 result = merged[["src_x", "idx_x", "ts_x"]].rename(columns={ "src_x": "src", "idx_x": "idx", "ts_x": "ts" }) result["ts"] = merged["ts_x"] - merged["ts_y"] print(result)
merge_asof的direction="backward"参数会确保每个A数据匹配到时间戳不大于它的最后一个B数据,完全符合需求,且全程无需迭代,处理效率较高。
内容的提问来源于stack exchange,提问作者Matt
相关产品推荐
相关产品推荐

