为何获取雅虎财经股票数据时出现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 - 修改数据获取语句:
注:此方式依赖pandas_datareader对雅虎接口的适配程度,稳定性不及方案1。# 替换原df = pdr.get_data_yahoo(...)行 df = pdr.data.get_data_yahoo(stocks, start=start, end=end)
内容的提问来源于stack exchange,提问作者Thomas Atkinson
相关产品推荐
相关产品推荐

