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

从Tiingo API取数绘制Plotly蜡烛图时Date列识别失败问题

解决Tiingo数据导入后Plotly蜡烛图KeyError: 'date'的问题

我一眼就看出问题所在了——Tiingo通过pandas_datareader返回的DataFrame用了['symbol', 'date']的多级索引(MultiIndex),而你在调用go.Candlestick的时候试图把date当作普通列来取,这自然会触发KeyError。

下面给你两种简单的解决方案:

方案1:重置索引,将date转为普通列

这是最直观的处理方式,直接把多级索引里的date提取成单独的列,后续调用就和普通DataFrame一样:

import os
import pandas_datareader as dr
import pandas as pd
import plotly.graph_objects as go
from datetime import datetime

start = datetime(2019, 11, 1)
end = datetime(2020, 10, 31)
my_api_key = os.environ.get("TIINGO_API_KEY")

# 获取数据后立刻重置索引,把date从索引转为列
stock_df = dr.get_data_tiingo('TTWO', start=start, end=end, api_key=my_api_key).reset_index()

# 现在可以直接用stock_df['date']作为X轴了
fig = go.Figure(data=[go.Candlestick(
    x=stock_df['date'], 
    open=stock_df['open'], 
    high=stock_df['high'], 
    low=stock_df['low'], 
    close=stock_df['close']
)])
fig.show()

方案2:直接调用多级索引中的date值

如果你不想修改原始DataFrame的结构,可以直接从多级索引里提取date部分:

import os
import pandas_datareader as dr
import pandas as pd
import plotly.graph_objects as go
from datetime import datetime

start = datetime(2019, 11, 1)
end = datetime(2020, 10, 31)
my_api_key = os.environ.get("TIINGO_API_KEY")

stock_df = dr.get_data_tiingo('TTWO', start=start, end=end, api_key=my_api_key)

# 从MultiIndex中直接提取date索引值
fig = go.Figure(data=[go.Candlestick(
    x=stock_df.index.get_level_values('date'), 
    open=stock_df['open'], 
    high=stock_df['high'], 
    low=stock_df['low'], 
    close=stock_df['close']
)])
fig.show()

补充说明

Tiingo默认用多级索引是为了方便处理多只股票的批量请求——当你同时拉取多个标的数据时,symbol和date的组合索引能清晰区分不同股票的记录。但单只股票的场景下,这个设计就容易让人误以为date是普通列,以后遇到类似API返回的结构,可以先通过print(stock_df.index)确认索引类型哦。

内容的提问来源于stack exchange,提问作者joao-pestana

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:28:26