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

如何循环合并两个字典中同键对应、按时间戳匹配的DataFrame?

正确实现同键DataFrame的merge_asof合并

核心问题分析

你之前用嵌套循环遍历两个字典的所有键组合,所以会生成9个结果(3×3)。哪怕加了键相等判断,本质还是做了不必要的循环,而且可能因为存储逻辑问题没得到正确的3个结果。正确的思路是直接遍历两个字典的共同键,对每个键单独取对应DataFrame合并。

实现步骤与代码

1. 预处理:确保时间戳列格式正确并排序

pd.merge_asof要求用于匹配的时间列必须是datetime类型,且右表(价格DataFrame)必须按时间戳列排序,否则会报错。先统一处理两个字典里的DataFrame:

import pandas as pd

# 处理交易数据的时间列并排序
for pair in trades_dict:
    trades_dict[pair]['timestamp'] = pd.to_datetime(trades_dict[pair]['timestamp'])
    trades_dict[pair] = trades_dict[pair].sort_values('timestamp')

# 处理价格数据的时间列并排序
for pair in prices_dict:
    prices_dict[pair]['timestamp'] = pd.to_datetime(prices_dict[pair]['timestamp'])
    prices_dict[pair] = prices_dict[pair].sort_values('timestamp')

2. 遍历共同键执行合并

创建新字典存储合并结果,遍历每个货币对键,取对应交易和价格DataFrame执行merge_asof:

merged_results = {}

# 遍历两个字典的共同键(因为键完全一致,直接遍历其中一个的键即可)
for pair in trades_dict:
    # 获取同键的交易和价格DataFrame
    trades_df = trades_dict[pair]
    prices_df = prices_dict[pair]
    
    # 按最近时间戳反向匹配合并
    merged_df = pd.merge_asof(
        left=trades_df,
        right=prices_df,
        on='timestamp',
        direction='backward'  # 取交易时间戳之前最近的价格
    )
    
    merged_results[pair] = merged_df

关键注意事项

  • 如果你的DataFrame里有其他需要分组匹配的列(比如不同账户、品种细分),可以添加by参数,比如by='account_id',确保分组内匹配时间戳。
  • 若两个DataFrame的时间列名称不同,可分别用left_on和right_on指定,比如left_on='trade_time', right_on='price_time'。
  • 避免嵌套循环:嵌套循环会遍历所有键组合,既浪费性能又容易出错,直接遍历共同键是最简洁高效的方式。

内容的提问来源于stack exchange,提问作者cscarlet

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 17:46:08