使用Pandas Datareader获取Yahoo特斯拉股票数据时遇AttributeError
解决pandas_datareader拉取Yahoo股票数据的AttributeError问题
问题场景
尝试用pandas_datareader从Yahoo Finance拉取特斯拉(TSLA)2000-2016年的股票价格数据,执行代码后触发以下错误:AttributeError: 'NoneType' object has no attribute 'group'
原代码
import numpy as np import datetime as dt import matplotlib.pyplot as plt from matplotlib import style import pandas as pd import pandas_datareader.data as web style.use ('ggplot') start= dt.datetime(2000, 1, 1) end= dt.datetime(2016,12,31) df= web.DataReader('TSLA', 'yahoo', start, end)
完整报错信息
>>> df= web.DataReader('TSLA', 'yahoo', start, end) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/Users/name/Python learning/Data visualisation and graphing/.venv/lib/python3.12/site-packages/pandas/util/_decorators.py", line 213, in wrapper return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ File "/Users/name/Python learning/Data visualisation and graphing/.venv/lib/python3.12/site-packages/pandas_datareader/data.py", line 379, in DataReader ).read() ^^^^^^ File "/Users/name/Python learning/Data visualisation and graphing/.venv/lib/python3.12/site-packages/pandas_datareader/base.py", line 253, in read df = self._read_one_data(self.url, params=self._get_params(self.symbols)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/Users/name/Python learning/Data visualisation and graphing/.venv/lib/python3.12/site-packages/pandas_datareader/yahoo/daily.py", line 152, in _read_one_data j = json.loads(re.search(ptrn, resp.text, re.DOTALL).group(1)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ AttributeError: 'NoneType' object has no attribute 'group'
原因分析
- 核心原因:pandas_datareader的Yahoo数据源已停止维护,Yahoo Finance的页面结构和数据接口发生了变化,导致库内的正则匹配逻辑无法找到目标内容,返回
None后调用group()方法触发错误。 - Python 3.12不是直接诱因,但新版本与旧版pandas_datareader的兼容性问题可能加剧了该错误。
解决方法
方案1:改用yfinance库(推荐)
yfinance是目前专门维护、兼容Yahoo Finance的第三方库,稳定性和兼容性都远优于pandas_datareader的Yahoo模块。
- 安装yfinance:
pip install yfinance
- 修改后的代码:
import numpy as np import datetime as dt import matplotlib.pyplot as plt from matplotlib import style import pandas as pd import yfinance as yf style.use('ggplot') start = dt.datetime(2000, 1, 1) end = dt.datetime(2016, 12, 31) # 拉取TSLA股票数据 df = yf.download('TSLA', start=start, end=end) # 查看数据前5行 print(df.head())
说明:返回的数据格式与pandas_datareader完全兼容,后续的数据处理、可视化代码无需修改。
方案2:切换到其他支持的数据源(如Alpha Vantage)
若坚持使用pandas_datareader,可替换为仍在维护的数据源,比如Alpha Vantage(需免费API密钥):
- 前往Alpha Vantage官网申请免费API密钥
- 安装依赖(若未安装):
pip install pandas-datareader
- 代码示例:
import pandas_datareader.data as web import datetime as dt start = dt.datetime(2000, 1, 1) end = dt.datetime(2016, 12, 31) # 替换为你的Alpha Vantage API密钥 API_KEY = "你的API密钥" df = web.DataReader('TSLA', 'av-daily', start=start, end=end, api_key=API_KEY)
说明:Alpha Vantage免费版有调用次数限制,适合小批量数据拉取。
方案3:降级Python和pandas_datareader(不推荐)
如果必须使用原技术栈,可尝试降级到兼容版本,但长期来看不稳定:
- 降级Python到3.11或更低版本
- 安装旧版pandas_datareader:
pip install pandas-datareader==0.10.0
说明:该方法仅能临时解决问题,Yahoo接口若继续更新,旧库仍会失效。
内容的提问来源于stack exchange,提问作者dog lover
相关产品推荐
相关产品推荐

