如何取消yf.pdr_override()?恢复pandas_datareader原有功能
解决yfinance覆盖pandas_datareader后无法读取FRED数据的问题
核心原因
yf.pdr_override()本质是替换了pandas_datareader.data.get_data_yahoo函数,但这个全局替换会意外干扰DataReader对非Yahoo数据源(比如FRED)的处理逻辑,导致它错误地将数据源标识(如'fred')当成日期格式解析,从而抛出ValueError: time data 'fred' does not match format '%Y-%m-%d'。
无需重启内核的解决方法
方法1:提前备份原函数,按需切换
在第一次调用yf.pdr_override()前,先备份pandas_datareader原生的get_data_yahoo函数,后续需要读取FRED数据时还原,用完Yahoo数据后可重新覆盖:
import pandas_datareader.data as pdr import yfinance as yf # 备份原生函数 orig_get_data_yahoo = pdr.get_data_yahoo # 启用yfinance覆盖,获取Yahoo股票数据 yf.pdr_override() df_stock = pdr.get_data_yahoo("AAPL", start="2023-01-01") # 还原原生函数,读取FRED数据 pdr.get_data_yahoo = orig_get_data_yahoo df_fred = pdr.DataReader("CSUSHPINSA", "fred", start="2020-01-01") # 后续若需再次获取Yahoo数据,重新执行覆盖即可 yf.pdr_override()
方法2:直接用yfinance原生函数,避免全局覆盖
放弃全局覆盖操作,直接用yfinance的download函数获取股票数据,完全不干扰pandas_datareader的原生逻辑:
import pandas_datareader.data as pdr import yfinance as yf # 用yfinance原生方法拉取股票数据 df_stock = yf.download("AAPL", start="2023-01-01") # 直接读取FRED数据,无任何冲突 df_fred = pdr.DataReader("CSUSHPINSA", "fred", start="2020-01-01")
方法3:手动恢复FRED数据源映射(进阶)
如果前两种方法无效,可直接恢复DataReader内部的数据源处理映射,确保FRED请求被正确路由:
from pandas_datareader.fred import FredReader import pandas_datareader.data as pdr # 恢复FRED对应的Reader类映射 pdr._READERS['fred'] = FredReader # 正常读取FRED数据 df_fred = pdr.DataReader("CSUSHPINSA", "fred", start="2020-01-01")
注意事项
- 方法1兼顾了原有使用习惯和多数据源需求,是最通用的方案;
- 方法2更简洁,推荐长期使用以避免全局修改带来的潜在冲突。
内容的提问来源于stack exchange,提问作者roudan
相关产品推荐
相关产品推荐

