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

为何获取雅虎财经股票数据时出现TypeError: string indices must be integers, not 'str'?

解决pandas_datareader获取雅虎财经数据的TypeError问题

问题重现

尝试从雅虎财经获取VOO和QQQ近三年至今的股价数据,运行代码时触发大量错误,最终报错:TypeError: string indices must be integers, not 'str'
涉事代码:

import datetime as dt
import matplotlib.pyplot as plt
import pandas as pd
import pandas_datareader as pdr

start = dt.datetime.now() - dt.timedelta(days = 365*3)
end = dt.datetime.now()

stocks = ['VOO', 'QQQ']

df = pdr.get_data_yahoo(stocks, start, end)
df.head()

错误原因

雅虎财经的公开API接口已更新,pandas_datareader原生的get_data_yahoo方法未适配新接口,返回结果是HTML文本而非预期的结构化JSON数据,后续解析时因尝试用字符串索引访问文本内容触发类型错误。

解决方案

方案1:使用yfinance替代(推荐)

yfinance是专门针对雅虎财经数据维护的第三方库,兼容性和稳定性更强:

  • 安装依赖:
    pip install yfinance
    
  • 修改后代码:
    import datetime as dt
    import matplotlib.pyplot as plt
    import pandas as pd
    import yfinance as yf
    
    start = dt.datetime.now() - dt.timedelta(days=365*3)
    end = dt.datetime.now()
    
    stocks = ['VOO', 'QQQ']
    
    df = yf.download(stocks, start=start, end=end)
    print(df.head())
    

方案2:升级并调整pandas_datareader参数

若坚持使用pandas_datareader,可尝试适配新接口:

  • 升级到最新版本:
    pip install --upgrade pandas_datareader
    
  • 修改数据获取语句:
    # 替换原df = pdr.get_data_yahoo(...)行
    df = pdr.data.get_data_yahoo(stocks, start=start, end=end)
    
    注:此方式依赖pandas_datareader对雅虎接口的适配程度,稳定性不及方案1。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 14:22:34