使用Python调用EIA API获取数据时出现报错,请求排查解决
问题排查与解决
核心问题分析
报错出现在eia库的data_by_series方法中,日期解析环节触发异常,主要可能原因有三点:
- 无效API密钥:代码里的
abcxyz是占位符,必须替换为EIA官网申请的真实有效密钥。 - Series ID不匹配:你要抓取的是布伦特原油日度数据(对应页面),但代码中使用的
PET.RWTC.D是WTI原油的Series ID,正确的布伦特原油日度Series ID应为PET.RBRTE.D。 - 第三方库兼容性问题:该
eia库的日期解析逻辑未适配EIA API的最新返回格式,导致字符串处理失败。
解决方案
方案1:修正参数后继续使用eia库
- 替换API密钥:将
api_key = "abcxyz"改为你在EIA官网申请的真实密钥。 - 修正Series ID:把
series_ID='PET.RWTC.D'替换为series_ID='PET.RBRTE.D'。 - (可选)更新库版本:执行
pip install --upgrade eia确保使用最新兼容版本。
修正后的代码:
import pandas as pd import eia def retrieve_data(): # 替换为你的真实EIA API密钥 api_key = "你的真实API密钥" api = eia.API(api_key) # 布伦特原油日度数据的正确Series ID series_ID='PET.RBRTE.D' series_search = api.data_by_series(series=series_ID) df = pd.DataFrame(series_search) df.index.names = ['Date'] df.columns=[ "Price"] df.index = df.index.str.replace('^([\d]{4})\s([\d]{2})([\d]{2})\s[\d]{2}', r'\1-\2-\3',regex=True) df.index = pd.to_datetime(df.index) return df data = retrieve_data() data.to_csv('Brent_Spot_Price_FOB.csv',index=True)
方案2:直接调用EIA API(规避第三方库依赖)
如果第三方库仍报错,可直接用requests发送请求,手动解析数据:
import pandas as pd import requests def retrieve_data(): api_key = "你的真实API密钥" series_id = "PET.RBRTE.D" url = f"https://api.eia.gov/series/?api_key={api_key}&series_id={series_id}" response = requests.get(url) data = response.json() # 提取日期和价格数据 rows = data['series'][0]['data'] df = pd.DataFrame(rows, columns=['Date', 'Price']) # 转换日期格式(EIA返回的是YYYYMMDD格式) df['Date'] = pd.to_datetime(df['Date'], format='%Y%m%d') df.set_index('Date', inplace=True) # 转换价格为数值类型 df['Price'] = pd.to_numeric(df['Price']) return df data = retrieve_data() data.to_csv('Brent_Spot_Price_FOB.csv', index=True)
验证步骤
- 确认API密钥有效:可在EIA API官方测试页面验证密钥权限。
- 核对Series ID:目标数据页面的「Data Series」板块可查看正确的Series ID。
内容的提问来源于stack exchange,提问作者Ninja
相关产品推荐
相关产品推荐

