如何在KDB中基于日期匹配两个列表并追加对应字段?
我来帮你搞定这个需求!其实核心就是按ticker+日期的组合做唯一匹配,把info列表里对应的shares和divisor字段追加到目标列表的对应条目里。下面用Python举个具体的实现例子,你可以直接参考:
步骤1:准备示例数据
先模拟你手里的两个列表结构:
# 需要追加字段的主数据列表 main_list = [ {"ticker": "AAPL", "date": "2023-01-01", "price": 150.0}, {"ticker": "MSFT", "date": "2023-01-01", "price": 280.0}, {"ticker": "AAPL", "date": "2023-01-02", "price": 152.0} ] # 包含shares和divisor的info数据源列表 info_list = [ {"ticker": "AAPL", "date": "2023-01-01", "shares": 1000000, "divisor": 0.8}, {"ticker": "MSFT", "date": "2023-01-01", "shares": 800000, "divisor": 0.9}, {"ticker": "AAPL", "date": "2023-01-02", "shares": 1050000, "divisor": 0.78} ]
步骤2:构建高效匹配的映射字典
为了避免每次遍历都循环查找info列表(效率太低),我们先把info列表转成以(ticker, date)为唯一键的字典:
# 用字典推导式快速构建映射 info_map = {(item["ticker"], item["date"]): { "shares": item["shares"], "divisor": item["divisor"] } for item in info_list}
步骤3:遍历主列表并追加字段
现在只需要遍历主列表,用(ticker, date)作为键去映射字典里找对应的值,直接追加到主列表的条目里:
for item in main_list: match_key = (item["ticker"], item["date"]) # 如果找到匹配项,就更新字段 if match_key in info_map: item.update(info_map[match_key])
最终效果
处理后的main_list就会包含对应的shares和divisor字段:
print(main_list) # 输出结果: # [ # {"ticker": "AAPL", "date": "2023-01-01", "price": 150.0, "shares": 1000000, "divisor": 0.8}, # {"ticker": "MSFT", "date": "2023-01-01", "price": 280.0, "shares": 800000, "divisor": 0.9}, # {"ticker": "AAPL", "date": "2023-01-02", "price": 152.0, "shares": 1050000, "divisor": 0.78} # ]
额外补充:处理不匹配的情况
如果主列表里存在(ticker, date)在info列表中找不到的情况,可以设置默认值避免报错:
# 定义默认值 default_fields = {"shares": 0, "divisor": 1.0} for item in main_list: match_key = (item["ticker"], item["date"]) # 找不到匹配项时用默认值 item.update(info_map.get(match_key, default_fields))
内容的提问来源于stack exchange,提问作者Fomalhaut -C
相关产品推荐
相关产品推荐

