You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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结合数据筛选实现,具体步骤如下:

  1. 分离A和B两类数据流
  2. 用merge_asof将每个A数据匹配到时间戳小于等于它的最后一个B数据
  3. 计算时间偏移并整理输出结果

代码实现

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 18:04:51