执行pandas左连接后出现NaN值的问题排查
问题诊断与解决方案
核心问题分析
左连接出现NaN、连接结果日期不匹配的问题,根源是两个关键错误:
- 循环变量名误用:连接逻辑里引用了未定义的
symbol变量,导致读取文件错误 - 时区索引不兼容:
df_final的索引是UTC时区,但从CSV读取的df_temp索引丢失了时区信息,导致索引无法对齐
分步修复方案
1. 修正循环变量错误
循环中你使用了未定义的symbol变量,应该替换为循环迭代的ticket变量,否则会读取错误文件或抛出未定义异常:
# 原错误代码 for ticket in tickets: file_path = symbol_to_path(symbol) # 修正后代码 for ticket in tickets: file_path = symbol_to_path(ticket)
2. 统一索引时区
yfinance下载的数据索引带UTC时区,但保存为CSV时会丢失时区信息。读取CSV后需要重新为df_temp的索引设置UTC时区,确保和df_final的索引完全匹配:
df_temp = pd.read_csv(file_path, parse_dates=True, index_col="Date", usecols=["Date", "Close"], na_values=["nan"]) # 为df_temp索引添加UTC时区,和df_final对齐 df_temp.index = df_temp.index.tz_localize('UTC') # 同时修正列名重命名的变量,用ticket替代未定义的symbol df_temp = df_temp.rename(columns={"Close": ticket})
3. 完整修正后的连接代码
# 创建指定日期范围的空DataFrame,直接指定UTC时区 start_date = "2022-01-01" end_date = "2023-01-01" dates = pd.date_range(start_date, end_date, tz='UTC') df_final = pd.DataFrame(index=dates) # 循环合并所有股票数据 for ticket in tickets: file_path = symbol_to_path(ticket) df_temp = pd.read_csv(file_path, parse_dates=True, index_col="Date", usecols=["Date", "Close"], na_values=["nan"]) df_temp.index = df_temp.index.tz_localize('UTC') df_temp = df_temp.rename(columns={"Close": ticket}) df_final = df_final.join(df_temp, how="left") print(df_temp.head()) print(df_final.head()) return df_final
额外验证步骤
- 检查下载的CSV文件,确认
Date列格式无异常值 - 连接前可打印索引时区信息,确保两者均为UTC:
print(df_final.index.tz) print(df_temp.index.tz)
内容的提问来源于stack exchange,提问作者Blob
相关产品推荐
相关产品推荐

