Pandas DataFrame遇AttributeError与KeyError的问题求解
先还原下你的操作场景:
你执行了以下代码读取数据并将Date设为索引:
import pandas as pd df= pd.read_csv("RELIANCE.csv",parse_dates=['Date'], index_col=['Date']) df.head(2)
得到的输出显示Date已经成为了DataFrame的行索引,而不再是普通列:
Open High Low Close Adj Close Volume
Date
2019-08-19 1281.050049 1296.800049 1280.000000 1292.599976 1287.764648 7459859.0
2019-08-20 1289.800049 1292.599976 1272.599976 1275.949951 1271.176880 6843460.0
接下来你遇到了两个错误,我逐一给你解释和解决:
1. 解决AttributeError: 'DataFrame' object has no attribute 'Date'
这个错误的核心原因是:你已经通过index_col=['Date']把Date列设置成了DataFrame的行索引,它不再是DataFrame的普通列,自然不能用df.Date或者df['Date']来访问。
要查看索引中第一个元素的类型,你需要直接访问索引对象:
# 查看索引第一个元素的类型 type(df.index[0])
这样就能得到正确的pandas._libs.tslibs.timestamps.Timestamp类型(本质是datetime64的封装)。如果之后你需要把Date重新变回普通列,可以用:
# 将索引还原为普通列 df = df.reset_index() # 此时就能正常访问Date列了 type(df.Date[0])
2. 解决KeyError: '2019-08-19'
当Date是DatetimeIndex时,直接用df['2019-08-19']会被Pandas理解为查找列名是'2019-08-19'的列,但你的列是Open、High这些,所以会抛出KeyError。
要选择指定日期的行,你需要用.loc索引器(专门用于标签索引):
# 选择2019-08-19这一行 df.loc['2019-08-19']
如果需要选择日期范围,还可以用切片:
# 选择2019-08-19到2019-08-20的所有行 df.loc['2019-08-19':'2019-08-20']
另外,如果你想确保精确匹配日期,也可以传入Timestamp对象:
df.loc[pd.Timestamp('2019-08-19')]
内容的提问来源于stack exchange,提问作者Ankit Shivhare

