vlambda博客
学习文章列表

R语言:天气数据抓取RNCEP简介

之前提到过的前同事Dr. Christian Weichsel,他曾经在项目中给我推荐过一个R语言的包:RNCEP,可以很方便的根据经纬度和时间爬取历史天气数据。这里就简单介绍一下,就当薪火相传了。



天气数据的抓取,在实际工作中还是比较常见的,常用于相关性分析,和给数据挖掘增加外部特征。当然可以去noaa网站上手动下载,不过有了RNCEP也着实方便了R用户。NOAA是美国国家海洋和大气管理局记录了自测量器诞生以来地球的所有历史气象数据,可追溯到17世纪。


准备工作,在R中安装需要的包

install.packages("RNCEP")

在MacOS中,还需要安装xquartz,然后重启才能正常使用,shell中

brew cask install xquartz

首先,看看最简单的如何输入经纬度和时间来得到气候数据

library(lubridate)library(RNCEP)library(tidyverse)
get_weather=function(RYear,RMonth,Lon,Lat){ wx.extent <- NCEP.gather(variable='air',level=850,months.minmax=c(RMonth,RMonth),years.minmax=c(RYear,RYear),lat.southnorth=c(Lat,Lat), lon.westeast=c(Lon,Lon),reanalysis2=FALSE,return.units=TRUE)-273.15 wx.ag <- NCEP.aggregate(wx.data=wx.extent, YEARS=TRUE, MONTHS=TRUE,DAYS=TRUE, HOURS=FALSE, fxn='mean') wx <- NCEP.array2df(wx.ag, var.names=NULL) w <- wx[1,4] return(w) }
w=get_weather(2017,1,103,31)

R语言:天气数据抓取RNCEP简介

然后,就会自动从noaa数据库中抓取气候数据了。这个函数的输入就分别是年、月、经度、纬度,例子中取得就是2017年1月,经度103,纬度31的气候。至于什么气候,取决于gather里的变量,这里的air表示的是气温,还有高度,湿度,风力,降雨量等,参考其CRAN上的文档。


如果,想取一段时间内所有气象站的气候数据,可以参考如下代码:

wx.ag.t1 <- NCEP.aggregate(wx.data=wx.t1, YEARS=TRUE, MONTHS=TRUE,DAYS=TRUE,  HOURS=FALSE,fxn = 'mean')View(wx.ag.t1)
flight <- NCEP.flight(beg.loc=c(58.00,7.00), end.loc=c(53.00,7.00), begin.dt='2007-10-01 18:00:00', flow.assist='NCEP.Tailwind', fa.args=list(airspeed=12), path='loxodrome', calibrate.dir=FALSE, calibrate.alt=FALSE, cutoff=0, when2stop='latitude', levels2consider=c(850,925), hours=12, evaluation.interval=60, id=1, land.if.bad=FALSE, reanalysis2 = FALSE, query=TRUE)

wx.t1 <- NCEP.gather(variable='air.2m', level='gaussian', months.minmax = c(1,12),years.minmax = c(2017,2017), lat.southnorth = c(30,31), lon.westeast = c(104,104), reanalysis2 = FALSE, return.units = TRUE)-273.15
wx.t2 <- NCEP.gather(variable='shum.2m', level='gaussian', months.minmax = c(1,12),years.minmax = c(2017,2017), lat.southnorth = c(30,31), lon.westeast = c(104,104), reanalysis2 = FALSE, return.units = TRUE)
wx.df1 <- NCEP.array2df(wx.data=wx.t1, var.names='temperature')wx.df2 <- NCEP.array2df(wx.data=wx.t2, var.names='humidity')
wx.df <- wx.df1 %>% inner_join(wx.df2)
View(wx.df)write_csv(wx.df, "hum.csv")


取气候数据和画地图,是我所剩不多的R技能了。下篇会继续如何在python中获取天气数据,我是YueTan,欢迎关注