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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 10:30:42