You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

执行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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 02:25:16