使用Python requests获取NOAA数据时无法拉取1-2月数据的问题
NOAA API数据拉取问题排查与解答
问题描述
- 使用Python
requests调用NOAA CDO API v2获取GHCND数据集的TMAX数据已有数年,核心代码如下:
url = 'https://www.ncdc.noaa.gov/cdo-web/api/v2/data?datasetid=GHCND&datatypeid=TMAX&limit=1000&stationid=GHCND:{StationID}&startdate={'2020-01-01'}&enddate={'2020-12-31'} dates_temp, temps = [], [] r = requests.get(url, headers={'token': 'My_token'}) d = json.loads(r.text) try: data_temps = [item for item in d['results'] if item['datatype'] == 'TMAX'] dates_temp += [item['date'] for item in data_temps] temps += [item['value'] for item in data_temps]
- 当前问题:无论选择哪个站点或年份,都无法拉取1-2月的数据,返回的第一条数据始终是2月28日或3月1日;但NOAA官方界面可下载对应时段的数据,测试站点确认有1-2月数据。
- 疑问:NOAA API是否有更新?是否存在v3版本?不愿重写代码改用SDK(现有代码此前稳定,且R语言RNOAA库返回数据量远少于直接用
requests获取的)
排查与解答
1. API版本情况
NOAA CDO API目前仍以v2为稳定版本,暂未推出官方正式的v3版本。近期核心接口逻辑未发生大变更,但部分参数处理规则可能有微调。
2. 1-2月数据缺失的修复方案
(1)修复日期参数格式错误
你的URL中startdate和enddate用{'2020-01-01'}这种大括号包裹的写法存在语法错误,会导致API无法正确识别起始日期,进而返回默认的后续时段数据。
修正后URL示例(建议用f-string拼接站点ID):
url = f'https://www.ncdc.noaa.gov/cdo-web/api/v2/data?datasetid=GHCND&datatypeid=TMAX&limit=1000&stationid=GHCND:{StationID}&startdate=2020-01-01&enddate=2020-12-31'
(2)处理分页数据
limit=1000是单页最大返回量,如果1-2月数据在更早的分页中,当前代码只请求第一页会导致遗漏。需检查返回结果的metadata字段判断是否有多页数据,循环请求后续分页:
offset = 0 total_count = 1 while offset < total_count: url = f'https://www.ncdc.noaa.gov/cdo-web/api/v2/data?datasetid=GHCND&datatypeid=TMAX&limit=1000&offset={offset}&stationid=GHCND:{StationID}&startdate=2020-01-01&enddate=2020-12-31' r = requests.get(url, headers={'token': 'My_token'}) d = r.json() total_count = d['metadata']['resultset']['count'] data_temps = [item for item in d['results'] if item['datatype'] == 'TMAX'] dates_temp += [item['date'] for item in data_temps] temps += [item['value'] for item in data_temps] offset += 1000
(3)显式指定排序规则
NOAA API默认按日期升序返回数据,但参数异常可能导致排序失效。可在URL中添加sortfield=date和sortorder=asc参数,确保数据按日期正序返回:
url = f'https://www.ncdc.noaa.gov/cdo-web/api/v2/data?datasetid=GHCND&datatypeid=TMAX&limit=1000&sortfield=date&sortorder=asc&stationid=GHCND:{StationID}&startdate=2020-01-01&enddate=2020-12-31'
3. SDK相关说明
NOAA官方Python SDK(如noaa-sdk)确实存在数据返回量受限的情况,这是因为SDK内部封装了参数过滤逻辑,直接用requests调用API能获取更完整的原始数据,优先修改现有代码的方案合理。
内容的提问来源于stack exchange,提问作者Litmon
相关产品推荐
相关产品推荐

