使用Pandas DataReader获取Yahoo Finance加密货币数据遇TypeError求助
问题:使用pandas_datareader获取Yahoo加密货币数据时出现
TypeError: string indices must be integers 我正在创建一个加密货币价格预测模型,运行以下代码时遇到错误:
crypto = "SAND-USD" df = yf.download(crypto, start="2021-01-01", end="2022-08-01") def get_data(start_date, end_date): return pandas_datareader.DataReader(crypto, 'yahoo', start=start_date, end=end_date) start_date = datetime.datetime(2022, 1, 2) end_date = datetime.datetime(2022, 1, 21) get_data(start_date, end_date)
运行后抛出的错误信息:
TypeError Traceback (most recent call last) <ipython-input-28-7e8d38c27ffe> in <cell line: 3>() 1 start_date = datetime.datetime(2022, 1, 2) 2 end_date = datetime.datetime(2022, 1, 21) ----> 3 get_data(start_date, end_date) /usr/local/lib/python3.10/dist-packages/pandas_datareader/yahoo/daily.py in _read_one_data(self, url, params) 151 try: 152 j = json.loads(re.search(ptrn, resp.text, re.DOTALL).group(1)) ---> 153 data = j["context"]["dispatcher"]["stores"]["HistoricalPriceStore"] 154 except KeyError: 155 msg = "No data fetched for symbol {} using {}" TypeError: string indices must be integers
我不清楚错误中提到的字符串索引指的是什么,希望得到帮助。
问题解析
这个错误的核心原因是**pandas_datareader的Yahoo官方数据源接口已失效**:Yahoo Finance修改了页面结构和数据返回格式,导致pandas_datareader无法正确解析响应文本。代码中json.loads解析后得到的不是预期的字典对象,而是一个普通字符串,当尝试用字典的字符串索引(比如j["context"])去访问时,自然会抛出"string indices must be integers"的错误——因为字符串只能用整数下标访问字符。
另外你代码里已经用到了yf.download()(来自yfinance库),这个库正是为替代失效的pandas_datareader Yahoo接口而生的,完全可以直接用它来实现需求。
修复方案
直接使用yfinance库的接口替代pandas_datareader.DataReader,修改后的代码如下:
import yfinance as yf import datetime crypto = "SAND-USD" df = yf.download(crypto, start="2021-01-01", end="2022-08-01") def get_data(start_date, end_date): # yfinance支持直接传入datetime类型的起止日期 return yf.download(crypto, start=start_date, end=end_date) start_date = datetime.datetime(2022, 1, 2) end_date = datetime.datetime(2022, 1, 21) data = get_data(start_date, end_date) print(data.head())
额外说明
- yfinance对Yahoo Finance数据的兼容性更好,支持加密货币、股票等多种资产类型的数据获取
- 若坚持使用pandas_datareader,可尝试安装第三方修复补丁,但稳定性远不如yfinance,不推荐
内容的提问来源于stack exchange,提问作者Vatsal
相关产品推荐
相关产品推荐

