使用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)
关键说明
- 起始日期修正:确保
startdate参数与你需要的时间范围匹配,这是解决当前仅返回3月数据的核心。 - 分页处理:通过
offset参数逐页请求数据,直到获取完所有条目或请求失败,避免因单页限制丢失数据。 - 错误检查:加入请求状态检查,防止因网络或API问题导致的死循环或数据丢失。
内容的提问来源于stack exchange,提问作者Zain Nazir
相关产品推荐
相关产品推荐

