回测策略类能否传入多个DataFrame?合并DataFrame遇阻求助
解决日期不对齐的DataFrame合并问题
问题分析
你遇到的核心问题是两个DataFrame的日期索引格式不匹配:first的索引带时分秒及时区,second的索引只有日期,且两者没有重叠的日期值,直接赋值或合并自然无效。要将first的indi列合并到second中,需要先统一日期格式,再选择合适的合并方式。
解决方案
方法1:统一日期到“日”级别后合并
先将first的日期索引截断到日(移除时分秒和时区),再与second按日期合并:
import pandas as pd # 处理first的日期索引:移除时区、截断到日,只保留indi列 first_clean = first.reset_index() first_clean['date'] = first_clean['date'].dt.tz_localize(None).dt.floor('D') first_clean = first_clean.set_index('date')[['indi']] # 将indi列合并到second中,保留second的所有行,匹配不到的indi值设为NaN second_with_indi = second.join(first_clean, how='left')
方法2:匹配最近日期(非严格日期对齐)
如果需要为second的每个日期匹配first中最近的(早于该日期)indi值,可以用merge_asof:
# 重置索引并按日期排序 first_reset = first.reset_index().sort_values('date') second_reset = second.reset_index().sort_values('date') # 将second的日期转换为datetime类型(原索引是日期对象) second_reset['date'] = pd.to_datetime(second_reset['date']) # 匹配最近的早于second日期的indi值 merged_asof = pd.merge_asof(second_reset, first_reset[['date', 'indi']], on='date', direction='backward') # 重新设置索引 merged_asof = merged_asof.set_index('date')
为什么之前的方法无效
second['nlp'] = first['indi']:两个DataFrame的索引完全不匹配,直接赋值会导致所有nlp值为NaN,因为没有能对应上的索引。first.merge(second, on=first.index):merge的on参数需要指定列名,且默认是内连接(inner),由于两者没有相同日期,合并后会得到空DataFrame。如果需要保留second的所有行,必须用左连接(how='left')并正确指定合并键。
内容的提问来源于stack exchange,提问作者MateMalte
相关产品推荐
相关产品推荐

