其他
R语言+QGIS处理NOAA全球气象数据(二)气象站点数据下载
前面讲了NOAA ISD数据的站点获取,接下来下载这个数据。在rnoaa
包中,使用isd
函数即可下载ISD数据,要指定三个参数:
usaf,站点号,根据自己需要来选择 wban, 指定为99999就行 year,年份,根据自己需要来
单一站点数据选择和下载
单一站点的数据下载很简单,指定站点号usaf,wban,year三个参数即可,下载后的数据在R语言中自动转换为一个tibble数据框。如需保存这个数据,输出为rds或者csv、excel即可。
res1 <- isd(usaf='545110', wban='99999', year=1993)
批量下载
根据前面单一站点数据下载函数情况我们可以知道,只需修改站点号和年份即可进行数据自动下载,那么可以使用两重嵌套循环,分别循环站点号和年份,即可实现数据的批量下载。
两重循环批量下载
思路有了,接下来就是实现,那么在设置双重循环之前要把这两层循环的参数准备好:
usaf站点号的准备,在这我说通过起始年份begin和结束年份end来筛选得到的,需要注意的是,这个筛选结果是一个tibble数据框,后面循环的写法要参考数据框的行列号标识方法。 year年份,这个简单,一个等差序列就完事了 建立双重嵌套循环,批量下载数据,并将下载结果输出为csv文件
#筛选2000年以后,到2021年有数据的气象站
x_cn2 = x_cn %>%
filter(begin < 20000000 & end > 20210000) %>%
select(usaf) %>%
mutate(id = row.names(.)) #tibble数据框位置不好找,加个id方便定位
year = seq(2001, 2021, 1) #获取年份
#双重循环下载数据
for (i in 1:nrow(x_cn2)) {
for (j in 1:length(year)) {
res1 <- isd(usaf=x_cn2[i,1], wban='99999', year= year[j])
write.csv(res1, file = paste0("./csv/", x_cn2[i,1], "-", year[j], ".csv"))
}
}
理论上上面的代码是可以很方便的把数据都下载下来的,但是实际上经常会网络中断下载失败,怎么办呢?
下载中断怎么办
由于网络不稳定等原因,数据下载可能会发生中断,如下图所示,下载到站点号527370,2020年的数据时下载失败,那么就需要对站点527370,2020、2021两年的数据重新下载。
前面批量下载我使用了两重循环,在这由于是对单一站点,多年份数据批量下载,针对缺失的部分,指定站点,对年份进行循环即可。
for (j in 20:length(year)) {
res1 <- isd(usaf='527370', wban='99999', year= year[j])
write.csv(res1, file = paste0("./csv/527370-", year[j], ".csv"))
}
上述代码循环完成后,单一站点剩余年份的数据即下载完成,可以继续修改一下双重循环参数,继续下载剩余的数据,以此类推,多次循环,完成所有所需数据的下载。