如何循环合并两个字典中同键对应、按时间戳匹配的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
相关产品推荐
相关产品推荐

