Pandas中DatetimeIndex无index属性报错及日期转换问题求助
解决方法
你的核心问题是没搞清楚DataFrame的索引和列的区别:合并后的df没有名为Dates的列,日期信息存在于df的索引(DatetimeIndex类型)里,这是所有报错的根源。
1. 把索引转为日期列表
你报错的原因应该是误写了df.index.index(正确写法是df.index),要把索引转成列表用下面两种方法即可:
# 方法1:用tolist()方法 date_list = df.index.tolist() # 方法2:直接用list()转换 date_list = list(df.index)
如果只需要年份(你的变量名是years),可以提取年份后转列表:
years = df.index.year.tolist()
2. 把日期索引转为普通列(方便用列名访问)
如果想把日期变成可以用df.Dates或df['Dates']访问的列,先重置索引再重命名列:
# 重置索引,原索引会变成名为'Date'的列 df = df.reset_index() # 把列名改成'Dates' df.rename(columns={'Date': 'Dates'}, inplace=True)
现在就能正常用df['Dates']访问日期列了。
3. 把日期转为字符串
完成上面的步骤(将索引转为Dates列)后,再转换类型:
df['Dates'] = df['Dates'].astype(str) # 也可以自定义日期格式,比如转成'年-月-日'的字符串 df['Dates'] = df['Dates'].dt.strftime('%Y-%m-%d')
完整可运行代码
import pandas as pd import pandas_datareader as pdr startdate = '2022-01-01' enddate = '2022-12-31' stocks = pdr.DataReader('SPY','yahoo', startdate, enddate)[['Adj Close']] bonds = pdr.DataReader('TLT','yahoo', startdate, enddate)[['Adj Close']] oil = pdr.DataReader('USO','yahoo', startdate, enddate)[['Adj Close']] df = pd.concat([stocks, bonds, oil], axis=1, join='inner') df.columns = ['SPY','TLT','USO'] # 提取索引为日期列表 date_list = df.index.tolist() # 提取年份列表 year_list = df.index.year.tolist() # 将索引转为Dates列并转成字符串格式 df = df.reset_index().rename(columns={'Date': 'Dates'}) df['Dates'] = df['Dates'].dt.strftime('%Y-%m-%d')
内容的提问来源于stack exchange,提问作者Joshua Adeniji
相关产品推荐
相关产品推荐

