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

如何解决CSV重新导入DataFrame后的索引访问KeyError问题?

解决CSV重新加载后索引访问的KeyError问题

这个问题我之前处理过,核心原因是CSV保存与加载时,索引的类型处理不一致导致的。咱们一步步拆解:

问题根源

从Yahoo Finance下载的DataFrame默认把日期设为Timestamp类型的索引,但当你把DataFrame保存为CSV时,这个Timestamp索引会被序列化为字符串格式的日期(比如"2006-01-04")。

默认用pd.read_csv()加载时,pandas不会自动把这个字符串日期列还原成Timestamp索引:要么生成新的整数索引,把原日期列当成普通字符串列;要么即使你指定了索引列,也不会自动解析为Timestamp类型。这时候你再用ms[ms.index[0]]访问,本质是在找名为Timestamp('2006-01-04 00:00:00')(或字符串版本)的列,而你的DataFrame根本没有这个列,自然抛出KeyError。

另外补充一句:其实原始DataFrame里用msft[msft.index[0]]访问本身是个误区——df[col_name]是用来访问列的,如果你想访问某一行数据,正确写法应该是df.loc[df.index[0]],可能你之前是误打误撞能运行?

解决方案

要让加载后的DataFrame和原始数据保持一致的索引类型,只需要在加载CSV时做两个关键设置:

  1. 指定index_col=0:把CSV的第一列(也就是原来的索引列)设为DataFrame的索引
  2. 指定parse_dates=True:让pandas自动把这个索引列解析为Timestamp类型

可复现代码片段

错误示例(会触发KeyError)

import yfinance as yf
import pandas as pd

# 下载MSFT数据
msft = yf.download("MSFT", start="2006-01-01", end="2006-01-10")
print(f"原始数据索引类型: {type(msft.index[0])}")  # 输出:<class 'pandas._libs.tslibs.timestamps.Timestamp'>

# 保存为CSV
msft.to_csv("msft_data.csv")

# 错误的加载方式:未指定索引列和日期解析
ms = pd.read_csv("msft_data.csv")
print(f"错误加载后的索引类型: {type(ms.index[0])}")  # 输出:<class 'int'>(整数索引)

# 执行这行会抛出KeyError: Timestamp('2006-01-04 00:00:00')
# ms[ms.index[0]]

修正后的正确代码

import yfinance as yf
import pandas as pd

# 下载MSFT数据
msft = yf.download("MSFT", start="2006-01-01", end="2006-01-10")
print(f"原始数据索引类型: {type(msft.index[0])}")
# 正确访问第一行数据的方式
print("原始数据第一行:\n", msft.loc[msft.index[0]])

# 保存CSV(index=True默认开启,可省略)
msft.to_csv("msft_data.csv", index=True)

# 正确加载:指定索引列并解析日期
ms = pd.read_csv("msft_data.csv", index_col=0, parse_dates=True)
print(f"正确加载后的索引类型: {type(ms.index[0])}")  # 输出:<class 'pandas._libs.tslibs.timestamps.Timestamp'>

# 现在可以和原始数据一样访问行
print("加载后第一行:\n", ms.loc[ms.index[0]])

这样处理后,加载后的DataFrame索引类型和原始数据完全一致,不管是行访问还是其他索引操作都能正常运行。

内容的提问来源于stack exchange,提问作者battilanast

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:04:18