Pandas时间序列精准索引问题:匹配对应索引值失败求解
解决Pandas时间序列精准匹配的问题
嘿,这个问题我之前踩过坑!核心原因是两个DataFrame的时间索引精度不匹配,咱们来拆解解决办法:
问题根源
你代码里的两个时间索引看起来都是2017-12-15 18:00相关,但实际存在精度差异:
df_lookup的索引中有'2017-12-15 18:00'(无秒数后缀),转成datetime后是精确到分钟的时间戳avg_30min的索引是'2017-12-15 18:00:00'(带秒数后缀),转成datetime后是精确到秒的时间戳
Pandas的时间索引是严格精确匹配的,哪怕时间数值看起来一致,只要精度级别不同,就会被判定为不同的标签,这就是你触发KeyError的原因。而iloc是按位置索引的,你传入时间戳自然会报类型错误。
解决方案
方法1:统一两个DataFrame的索引精度
这是最直接的方案,把两个索引都转换成相同的精度(比如统一到秒级):
# 将df_lookup的索引转换为秒级精度 df_lookup.index = df_lookup.index.floor('S') # 同步转换avg_30min的索引(确保精度完全一致) avg_30min.index = avg_30min.index.floor('S')
之后再用loc就能精准匹配:
for idx, row in avg_30min.iterrows(): value_in_lookup_df = df_lookup.loc[idx] # 后续绘图操作
方法2:查找时动态转换时间精度
如果不想修改原DataFrame的索引,可以在循环里把avg_30min的索引转换成和df_lookup一致的精度:
for idx, row in avg_30min.iterrows(): # 将当前索引转换为df_lookup索引的精度(这里是分钟级) matched_idx = idx.floor('min') # 先检查索引是否存在,避免触发KeyError if matched_idx in df_lookup.index: value_in_lookup_df = df_lookup.loc[matched_idx] # 你的后续操作 else: print(f"警告:索引{matched_idx}在df_lookup中不存在")
方法3:用merge批量匹配(更高效)
如果数据量较大,循环会比较慢,推荐用merge一次性完成匹配:
# 给两个DataFrame添加统一精度的匹配列 df_lookup['match_time'] = df_lookup.index.floor('S') avg_30min['match_time'] = avg_30min.index.floor('S') # 内连接获取所有匹配的行 matched_df = pd.merge(df_lookup, avg_30min, on='match_time', how='inner') # 直接从匹配结果中提取数据,无需循环 for _, row in matched_df.iterrows(): # row中包含两个DataFrame的匹配数据 pass
内容的提问来源于stack exchange,提问作者Alberto Chiusole
相关产品推荐
相关产品推荐

