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

使用Pandas DataReader获取Yahoo数据时报TypeError错误求助

使用pandas DataReader从Yahoo获取金融数据时触发TypeError错误

几周前我用pandas的DataReader从Yahoo导入金融数据完全正常,但今天运行代码时却弹出了TypeError: string indices must be integers错误。

我运行的代码如下:

# 导入包
import numpy as np
import pandas as pd
import pandas_datareader.data as web
import matplotlib.pyplot as plt
%matplotlib inline 

# 读取数据
test = web.DataReader(['TSLA','FB'], 'yahoo', start='2018/01/01', end='2019/12/31')
test.head()

报错信息如下:

输出超出大小限制,请在文本编辑器中查看完整输出数据
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
~\AppData\Local\Temp/ipykernel_3456/2405099378.py in <module>
      1 # 读取数据
----> 2 test = web.DataReader(['TSLA','FB'], 'yahoo', start='2018/01/01', end='2019/12/31')
      3 test.head()

c:\Users\jclay\anaconda3\envs\blockchain_dev\lib\site-packages\pandas\util\_decorators.py in wrapper(*args, **kwargs)
    205                 else:
    206                     kwargs[new_arg_name] = new_arg_value
--> 207             return func(*args, **kwargs)
    208 
    209         return cast(F, wrapper)

c:\Users\jclay\anaconda3\envs\blockchain_dev\lib\site-packages\pandas_datareader\data.py in DataReader(name, data_source, start, end, retry_count, pause, session, api_key)
    376             retry_count=retry_count,
    377             pause=pause,
--> 378             session=session,
    379         ).read()
    380 

c:\Users\jclay\anaconda3\envs\blockchain_dev\lib\site-packages\pandas_datareader\base.py in read(self)
    256             df = self._dl_mult_symbols(self.symbols.index)
    257         else:
--> 258             df = self._dl_mult_symbols(self.symbols)
...
--> 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示例代码运行,也会报同样的错误:

In [39]: import pandas_datareader.data as web

In [40]: import pandas as pd

In [41]: import datetime as dt

In [42]: df = web.DataReader('GE', 'yahoo', start='2019-09-10', end='2019-10-09')

In [43]: df.head()

对应的报错信息:

输出超出大小限制,请在文本编辑器中查看完整输出数据
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
~\AppData\Local\Temp/ipykernel_3456/472188857.py in <module>
----> 1 df = web.DataReader('GE', 'yahoo', start='2019-09-10', end='2019-10-09')
      2 
      3 df.head()

c:\Users\jclay\anaconda3\envs\blockchain_dev\lib\site-packages\pandas\util\_decorators.py in wrapper(*args, **kwargs)
    205                 else:
    206                     kwargs[new_arg_name] = new_arg_value
--> 207             return func(*args, **kwargs)
    208 
    209         return cast(F, wrapper)

c:\Users\jclay\anaconda3\envs\blockchain_dev\lib\site-packages\pandas_datareader\data.py in DataReader(name, data_source, start, end, retry_count, pause, session, api_key)
    376             retry_count=retry_count,
    377             pause=pause,
--> 378             session=session,
    379         ).read()
    380 

c:\Users\jclay\anaconda3\envs\blockchain_dev\lib\site-packages\pandas_datareader\base.py in read(self)
    251         # 如果是单个标的(例如'GOOG')
    252         if isinstance(self.symbols, (string_types, int)):
--> 253             df = self._read_one_data(self.url, params=self._get_params(self.symbols))
...
--> 153             data = j["context"]["dispatcher"]["stores"]["HistoricalPriceStore"]
    154         except KeyError:
    155             msg = "No data fetched for symbol {} using {}"

TypeError: string indices must be integers

我猜是这个函数读取数据的方式更新了,但文档里找不到相关变更记录,有人解决过这个问题吗?


解决办法

这个问题是Yahoo的页面结构更新了,旧版pandas_datareader的Yahoo数据源解析逻辑失效,返回的不是预期的JSON格式而是字符串,所以才会触发“字符串索引必须是整数”的错误。给你两个可行方案:

  • 改用yfinance库替代
    yfinance是专门对接Yahoo金融的第三方库,维护更及时,用法和原DataReader接近:
    先安装库:

    pip install yfinance
    

    替换代码示例:

    import yfinance as yf
    # 读取多个标的
    test = yf.download(['TSLA','FB'], start='2018-01-01', end='2019-12-31')
    # 读取单个标的
    df = yf.download('GE', start='2019-09-10', end='2019-10-09')
    
  • 安装修复后的pandas_datareader分支
    如果一定要用pandas_datareader,可以安装社区修复的版本:

    pip install git+https://github.com/pydata/pandas-datareader.git@fix/yahoo
    

    不过这个方案稳定性不如yfinance,毕竟Yahoo的页面结构可能还会变动。

另外,官方pandas_datareader确实没同步更新文档,因为Yahoo数据源属于第三方维护,官方更新速度慢是正常情况。


内容的提问来源于stack exchange,提问作者Jordan Calyton

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 00:01:05