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

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和经纬度")
  • 参数规范:严格对照PVWatts API的参数文档,注意参数的适用场景(比如部分参数仅针对特定阵列类型)
  • 后续图表展示:
    • 若返回hourly数据,可提取data['outputs']['ac']数组,用matplotlib绘制小时发电量曲线
    • 若返回monthly数据,提取data['outputs']['ac_monthly'],绘制月度发电量柱状图

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 17:02:19