下载 NOAA 数据

Posted

技术标签:

【中文标题】下载 NOAA 数据【英文标题】:Downloading NOAA data 【发布时间】:2021-06-13 19:13:24 【问题描述】:

我正在尝试使用 rnoaa 包,但遇到了一些麻烦。

我从数据帧中获取了一个向量,它看起来像这样:

df <- dataframe$ghcnd

抓取必要的列

这给了我这样的输出:

[1] "GHCND:US1AKAB0058" "GHCND:US1AKAB0015" "GHCND:US1AKAB0021" "GHCND:US1AKAB0061"
 [5] "GHCND:US1AKAB0055" "GHCND:US1AKAB0038" "GHCND:US1AKAB0051" "GHCND:US1AKAB0052"
 [9] "GHCND:US1AKAB0060" "GHCND:US1AKAB0065" "GHCND:US1AKAB0062" "GHCND:US1AKFN0016"
[13] "GHCND:US1AKFN0018" "GHCND:US1AKFN0015" "GHCND:US1AKFN0011" "GHCND:US1AKFN0013"
[17] "GHCND:US1AKFN0030" "GHCND:US1AKJB0011" "GHCND:US1AKJB0014" "GHCND:US1AKKP0005"
[21] "GHCND:US1AKMS0011" "GHCND:US1AKMS0019" "GHCND:US1AKMS0012" "GHCND:US1AKMS0020"
[25] "GHCND:US1AKMS0018" "GHCND:US1AKMS0014" "GHCND:US1AKPW0001" "GHCND:US1AKSH0002"
[29] "GHCND:US1AKVC0006" "GHCND:US1AKWH0012" "GHCND:US1AKWP0001" "GHCND:US1AKWP0002"
[33] "GHCND:US1ALAT0014" "GHCND:US1ALAT0013" "GHCND:US1ALBW0095" "GHCND:US1ALBW0087"
[37] "GHCND:US1ALBW0020" "GHCND:US1ALBW0066" "GHCND:US1ALBW0031" "GHCND:US1ALBW0082"
[41] "GHCND:US1ALBW0099" "GHCND:US1ALBW0040" "GHCND:US1ALBW0004" "GHCND:US1ALBW0085"
[45] "GHCND:US1ALBW0009" "GHCND:US1ALBW0001" "GHCND:US1ALBW0094" "GHCND:US1ALBW0013"
[49] "GHCND:US1ALBW0079" "GHCND:US1ALBW0060"

实际上,我有大约 22,000 个气象站。这只是显示前 50 个。

rnoaa 代码

library(rnoaa)
options("noaakey" = Sys.getenv("noaakey"))
Sys.getenv("noaakey")

weather <- ncdc(datasetid = 'GHCND', stationid = df, var = 'PRCP', startdate = "2020-05-30",
                enddate = "2020-05-30", add_units = TRUE)

这会产生以下错误: Error: Request-URI Too Long (HTTP 414)

但是,当我将 df 子集为前 100 个条目时,我无法获取超过前 25 个条目的数据。但是,包详细信息表明我应该能够每天运行 10,000 个查询。

循环尝试

df1 <- df[1:125] ## Splitting dataframe. Too big otherwise

for (i in 1:length(df1))
  weather2<-ncdc(datasetid = 'GHCND', stationid=df1[i],var='PRCP',startdate ='2020-06-30',enddate='2020-06-30',
          add_units = TRUE)
  

但这只是生成单行的数据框,该行是第 125 个气象站。

如果有人能就下一步尝试什么提供建议,那就太好了:)

另外,交叉链接:https://discuss.ropensci.org/t/rnoaa-getting-county-level-rain-data/2403

【问题讨论】:

【参考方案1】:

在您的循环尝试中,weather2 在循环的每次迭代中都会被覆盖。

由于请求的数量和返回的长度未知,解决此问题的一种方法是将调用 ncdc 包装在 lapply 语句中,并将每个响应保存在一个列表中。然后在 lapply 语句的最后将所有数据合并到一个大数据帧中。

library(rnoaa)
library(dplyr)

stationlist <-ghcnd_stations() %>% filter(state == "DE")
df <- paste0("GHCND:", stationlist$id[1:10]) 

#call request data multiple time and store individual results in a list 
 output<-lapply(df, function(station)
    weather <- ncdc(datasetid = 'GHCND', stationid = station, var = 'PRCP', startdate = "2020-05-30",
                    enddate = "2020-05-30", add_units = TRUE)
    #weather$data
    #to include the meta data
    data.frame(t(unlist(weather$meta)), weather$data)
 )
 
 #merge into 1 data frame
 answer <-bind_rows(output)

我会在一小部分站点上验证此过程,因为调用 NOAA 可能会很慢。我试图减少搜索到感兴趣区域和仍在积极收集数据的站点的数量。

还有关于限制请求。 从帮助页面:“请注意,默认限制(返回的记录数)为 25。查看 $meta 中的元数据以查看找到了多少条记录。如果找到的记录多于 25 条,您可以设置参数限制在 25 以上。"

【讨论】:

好的,我相信我成功了! z &lt;- split(df, ceiling(seq_along(df)/100)) out &lt;- list() for (i in seq_along(z)) out[[i]] &lt;- ncdc(datasetid = 'GHCND', stationid = z[[i]], var = 'PRCP', startdate = "2020-05-30", enddate = "2020-05-30", add_units = TRUE, limit = 100) 我的输出是一个包含 219 个元素的列表,每个元素都有两个元素。 “元”和“数据”我感兴趣的是结合 219 out[[i]]$data 中的行。这需要一个 for 循环还是我可以使用 bind_rows? 阅读我的最后一条评论,也许这并不完全清楚。本质上,我有一个包含 219 个元素的列表。每个元素都是一个包含两个元素的列表。所以对于列表 1,我有 out[[1]]$meta 和 out[[1]]$data。我想合并 out[[1]]$data, out[[2]]$data...out[[219]]$data 的行【参考方案2】:

在@Dave2e 的大力帮助和上面的ropensci 链接上的一个萌芽下,想通了。

df <- cleaned_emshr$ghcnd  ## Grabbing necessary column

z <- split(df, ceiling(seq_along(df)/100))
out <- list()
for (i in seq_along(z)) 
  out[[i]] <- ncdc(datasetid = 'GHCND', stationid = z[[i]], var = 'PRCP', 
                   startdate = "2020-05-30", enddate = "2020-05-30", 
                   add_units = TRUE, limit = 100)


weather <- bind_rows(lapply(out, "[[", "data"))

【讨论】:

托宾,我对上面的代码进行了编辑,以将元数据包含在数据框中。虽然您的方法有效,但它需要 2 个循环(for 和 lapply)。最好的做法是在第一次通过时让 out 列表正确。

以上是关于下载 NOAA 数据的主要内容,如果未能解决你的问题,请参考以下文章

ArcGIS Pro微课1000例0013:NOAA全球1km分辨率DEM下载及拼接教程(附已拼接成果下载地址)

ArcGIS Pro微课1000例0013:NOAA全球1km分辨率DEM下载及拼接教程(附已拼接成果下载地址)

用mapreduce 处理气象数据集

用mapreduce 处理气象数据集

用mapreduce 处理气象数据集

用mapreduce 处理气象数据集