Python调用NREL PVWatts API返回422错误求助
解决PVWatts API返回422状态码的问题
问题排查与修正步骤
1. 修复Python语法错误
你的代码中存在明显语法错误:
'dc_ac_ratio': 1.2, / # DC/AC ratio
该行末尾的/是多余字符,会导致参数字典构造失败,直接删除即可。
2. 解决地理位置参数冲突
PVWatts API不允许同时传递address和lat/lon参数,二者只能选其一。网页版会自动处理优先级,但API接口要求明确指定一种地理位置方式,建议保留lat和lon(精度更高),删除address参数。
3. 移除无效参数
gcr(地面覆盖率)参数仅针对跟踪式阵列(array_type为2、3、4)生效,你的阵列类型是1(固定屋顶安装),不需要传递该参数,多余参数会触发API的参数校验失败。
修正后的完整代码
import requests # PVWatts API V8 接口地址 url = 'https://developer.nrel.gov/api/pvwatts/v8.json' # 替换为你的有效API密钥 api_key = 'xoxoxoxoxoxoxoxo' # 构造符合要求的请求参数 params = { 'format': 'json', 'api_key': api_key, 'system_capacity': 12, # 系统容量(kW) 'module_type': 0, # 组件类型:0=标准型,1= premium 'losses': 14, # 系统损耗率(百分比) 'array_type': 1, # 阵列类型:1=固定屋顶安装 'tilt': 15, # 倾斜角度(度) 'azimuth': 0, # 方位角(度,0=正北) 'lat': -6.1833, # 纬度 'lon': 106.9499, # 经度 'dataset': 'nsrdb', # 气候数据集 'timeframe': 'hourly', # 返回数据粒度:hourly/ monthly 'dc_ac_ratio': 1.2, # DC/AC 比值 } # 发送GET请求 response = requests.get(url, params=params) # 处理响应 if response.status_code == 200: data = response.json() # 提取年度AC发电量 ac_annual = data['outputs']['ac_annual'] print(f"预估年度AC发电量: {ac_annual} kWh") # 如需查看完整响应数据,可取消注释 # print(data) else: # 打印API返回的错误详情,便于调试 print(f"请求失败,状态码: {response.status_code}") print("错误详情:", response.text)
关键学习要点
- 422状态码含义:表示服务器能解析请求格式,但参数存在语义错误(比如冲突、无效组合),这是API接口常见的参数校验失败反馈。
- 调试技巧:
- 打印实际请求URL:
print(response.url),检查参数是否正确拼接 - 打印响应文本:
print(response.text),API通常会返回具体的错误原因(比如"不能同时提供address和经纬度")
- 打印实际请求URL:
- 参数规范:严格对照PVWatts API的参数文档,注意参数的适用场景(比如部分参数仅针对特定阵列类型)
- 后续图表展示:
- 若返回hourly数据,可提取
data['outputs']['ac']数组,用matplotlib绘制小时发电量曲线 - 若返回monthly数据,提取
data['outputs']['ac_monthly'],绘制月度发电量柱状图
- 若返回hourly数据,可提取
内容的提问来源于stack exchange,提问作者viviane02
相关产品推荐
相关产品推荐

