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

使用R调用NOAA API获取气象数据仅返回单月数据的求助

排查NOAA API仅返回3月气象数据的问题

直接问题:起始日期设置错误

你的代码里startd参数写的是&startdate=2016-02-01,但你需要的是2016年1月1日至3月的数据,这是导致你拿不到1月数据的直接原因。先把起始日期修正为&startdate=2016-01-01。

潜在问题:API分页限制

即使修正了起始日期,如果1-3月的气象数据条目超过1000条,NOAA CDO API只会返回第一页的内容(你的limit=1000是单页最大返回量)。需要添加分页逻辑来获取所有数据。

修正后的完整代码

library(httr)
library(jsonlite)

base <- 'https://www.ncei.noaa.gov/cdo-web/api/v2/data?'
datasetid <- 'datasetid=GHCND'
stationid <- '&stationid=GHCND:ASN00087036'
startd <- '&startdate=2016-01-01'  # 修正起始日期为目标日期
endd <- '&enddate=2016-03-31'
tok <- 'xyz'  # 替换为你的真实API token

# 初始化容器存储所有结果
all_results <- list()
current_offset <- 1
per_page_limit <- 1000

repeat {
  # 拼接带分页参数的请求URL
  request_url <- paste0(base, datasetid, stationid, startd, endd, 
                       '&limit=', per_page_limit, '&offset=', current_offset)
  
  # 发送API请求
  response <- GET(request_url, add_headers("token" = tok))
  
  # 检查请求是否成功
  if (http_status(response)$category != "Success") {
    warning(paste("请求失败,状态码:", response$status_code))
    break
  }
  
  # 解析返回的JSON数据
  response_data <- fromJSON(rawToChar(response$content))
  
  # 如果当前页无数据,终止循环
  if (length(response_data$results) == 0) break
  
  # 将当前页数据加入结果容器
  all_results <- c(all_results, list(response_data$results))
  
  # 更新偏移量,准备请求下一页
  current_offset <- current_offset + per_page_limit
  
  # 检查是否已获取所有数据(通过元数据中的总条目数判断)
  if (current_offset > response_data$metadata$resultset$count) break
}

# 将所有结果合并为数据框
df <- do.call(rbind, all_results)

关键说明

  1. 起始日期修正:确保startdate参数与你需要的时间范围匹配,这是解决当前仅返回3月数据的核心。
  2. 分页处理:通过offset参数逐页请求数据,直到获取完所有条目或请求失败,避免因单页限制丢失数据。
  3. 错误检查:加入请求状态检查,防止因网络或API问题导致的死循环或数据丢失。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 17:20:36