下载的气象数据大多是NetCDF格式,也即.nc文档。在R中处理这类数据,可以用ncdf包或ncdf4包,最近把R更新为3.3.2版本后发现ncdf包不支持了,只能用ncdf4包,用法差不多,在这里记录一下。
常用函数:
nc_open 打开.nc文档
nc_close 关闭.nc文档
nc_create 新建.nc文档
ncvar_get 读取变量数据
ncatt_get 读取变量属性
ncvar_def 设定变量
ncdim_def 设定维度
ncvar_add 添加变量
ncvar_put 写入变量数据
ncatt_put 写入变量属性
一、读取.nc格式数据
1、nc_open的用法:
nc_open( filename, write=FALSE, readunlim=TRUE, verbose=FALSE, auto_GMT=TRUE, suppress_dimvals=FALSE )
nc_open用于打开已存在的.nc文档。在仅对数据进行读取操作的情况下,我们只需输入路径参数filename,其他参数保持默认值即可。(如果数据很大,为了减少运行时间也可将readunlim设置为FALSE)
2、ncatt_get的用法
ncatt_get( nc, varid, attname=NA, verbose=FALSE )
ncatt_get用于查看所选变量的属性。其中,参数nc是即将进行读取操作的数据集,其数据类型需是ncdf4型(即用nc_open或nc_create函数生成的数据);参数varid是要读取的变量名,其数据类型需是character型;参数attname是要读取的属性名,其数据类型需是character型;参数verbose决定是否输出debug信息,一般保持默认值即可。
3、ncvar_get的用法
ncvar_get(nc, varid=NA, start=NA, count=NA, verbose=FALSE, signedbyte=TRUE, collapse_degen=TRUE)
ncvar_get用于提取所选变量的数据。其中,参数nc是即将进行读取操作的.nc数据集,其数据类型需是ncdf4型;参数varid是要读取的变量名,其数据类型需是character型;参数start是读取的起始位置;参数count是数据读取的总个数;一般情况下,剩余3个参数保持默认值就可以。
4、nc_close的用法
nc_close( nc )
在读完或者写完,特别是写完一个.nc文档之后,一定记得关闭它。
下面以HadISST数据为例记录一下.nc数据的读取,数据集保存为HadISST_sst.nc,下载地址为http://www.metoffice.gov.uk/hadobs/hadisst/data/download.html。
示例代码如下:
library(ncdf4) #加载ncdf4包
setwd('E:\\数据\\HadISST\\') #设置工作目录
nc <- nc_open( ‘HadISST_sst.nc’ ) #打开.nc文档,并将其赋值给nc这个变量
print(nc) #输出.nc文档信息摘要
结果显示,HadISST_sst.nc数据包含2个数据变量time_bnds和sst,以及4个维度数据time、latitude、longitude和nv,其中time_bnds包含两个维度[nv, time],sst包含三个维度[longitude, latitude, time]。除此之外,数据集的9个全局属性(Title、reference等)对整个数据集起说明的作用。
我们将这个数据集赋值给nc这个变量,通过class()函数我们可以看到nc的数据类型是ncdf4型。
从上一步的结果中得知,数据集共有6个变量time_bnds、sst、time、latitude、longitude和nv,下面以latitude为例演示对数据属性的提取。
示例代码如下:
ncatt_get( nc = nc, varid = 'latitude' ) #输出latitude的属性
如果只想输出其单位(units),则:
ncatt_get( nc, 'latitude', 'units' )
下面以latitude和sst为例演示如何读取变量中的数据。如果想读取变量的所有数据,则只需给出nc和varid参数值,以latitude为例:
lat <- ncvar_get( nc = nc, varid = 'latitude')
如果只想读取变量的部分数据,则还应该给出start和count参数值。以sst为例,从第一步的结果得知,sst是个3维数据集,三个维度分别为[longitude,latitude,time],假如我们只想读取2009年NINO3区数据(即5N-5S,150W-90W区域),代码如下:
sst_nino3 <- ncvar_get( nc = nc, varid = 'sst', start = c(31,86,1669), count = c(60,10,12) )
值得一提的是,如果count值取为-1,则表示读取start之后的所有数据。
利用ncvar_get读取的数据是array型的,接下来的计算就可以用R处理了。
读取完数据之后,记得及时关闭文档:
nc_close( nc )
二、写入.nc格式数据
1、nc_create的用法
nc_create( filename, vars, force_v4=FALSE, verbose=FALSE )
nc_create用于创建新的.nc文档。其中,参数filename表示输出路径,vars表示文档中的变量,其数据类型需是ncvar4型(即由ncvar_def函数创建的数据),或者ncvar4型数据构成的list(数据有多个时);force_v4参数如果设置为TRUE,则表明创建的是ncdf4型文档(新版本的),FALSE表示创建的ncdf型文档。
2、ncvar_def的用法
ncvar_def( name, units, dim, missval, longname=name, prec="float", shuffle=FALSE, compression=NA, chunksizes=NA, verbose=FALSE )
ncvar_def用于创建新的变量。其中,参数name表示变量名,其数据类型需是character型;units便是变量的单位,其数据类型需是character型;dim表示变量的维度,其数据类型需是ncdim4型(即由ncdim_def函数创建的数据)或由ncdim4构成的list(维度为多个时);missval表示缺失值,如不需要可以不填,填NA则表示缺失值用NaN表示;longname表示更详细的名字,数据类型需是character型,默认值与name一致;prec表示数据的精度,可填’short’、’integer’、’float’、’double’或’char’;一般情况下,剩余变量可以保持默认值。
3、ncdim_def的用法
ncdim_def( name, units, vals, unlim=FALSE, create_dimvar=TRUE, calendar=NA, longname=name )
ncdim_def用于创建新的维度。其中,参数name表示维度名,其数据类型需是character型;units便是维度的单位,其数据类型需是character型;vals表示维度的值,数据类型需是numeric型向量;longname表示更详细的名字;calendar一般仅在维度是时间时设置,表示日期的计数方式,一般有"standard" ("gregorian")、"noleap" ("365_day")以及"360_day"三种选择;一般情况下,剩余变量可以保持默认值。
4、ncvar_add的用法
ncvar_add( nc, v, verbose=FALSE, indefine=FALSE )
ncvar_add用于给已经存在的.nc文档添加新的变量。其中,参数nc是即将进行添加操作的.nc数据集,其数据类型需是ncdf4型;v表示新添加的变量,其数据类型需是ncvar4型。
5、ncvar_put的用法
ncvar_put( nc, varid, vals, start=NA, count=NA, verbose=FALSE )
ncvar_put用于给新建的变量添加数据。其中,参数nc是即将进行添加操作的.nc数据集,其数据类型需是ncdf4型;varid表示进行添加数据操作的变量,其数据类型需是ncvar4型;vals表示数据值;start表示写入数值的起始位置(用法与ncvar_get相同);count表示写入数值的数目(用法与ncvar_get相同)。
6、ncatt_put的用法
ncatt_put( nc, varid, attname, attval, prec=NA, verbose=FALSE, definemode=FALSE )
ncatt_put用于给新建的变量或整个文档添加属性。其中,参数nc是即将进行添加操作的.nc数据集,其数据类型需是ncdf4型;varid表示进行添加数据操作的变量,其数据类型需是ncvar4型(varid设为0则表示给整个文档添加全局属性);attname表示属性名称;attval表示属性值;prec表示属性值的精度。
接下来,用一个例子说明上述函数的用法。在第一部分“读取.nc格式数据”,我们读取了2009年1月-12月的NINO3区sst数据,我们将其输出命名为“NINO3_2009.nc”,代码如下:
#创建维度,分别是time、longitude、latitude
longitude <- ncdim_def( name = 'longitude', units = 'degrees_east', vals = seq(-149.5,-90.5,1) )
latitude <- ncdim_def( name = 'latitude', units = 'degrees_north', vals = seq(4.5,-4.5,-1) )
t <- ncdim_def( name = 'time', units = 'months', vals = 1:12 )
#创建变量sst
sst <- ncvar_def( name = 'sst', units = 'C', dim = list(longitude,latitude,t), missval = NA, prec = 'double' )
#创建文档,命名为NINO3_2009.nc,只包含1个数据变量sst
ncnew <- nc_create( filename = 'NINO3_2009.nc', vars = sst )
#写入数据
ncvar_put( nc = ncnew, varid = sst, vals = sst_nino3 )
#写入属性
ncatt_put( nc = ncnew, varid = 0, attname = 'description', attval = 'sst data in NINO3 area during 2009')
#最后别忘了关闭.nc文档
nc_close(ncnew)
#完成之后,读取文档检查一下
nc <- nc_open('NINO3_2009.nc')
print(nc)
nc_close(nc)
结果如下:
数据成功读取后我们可以进行一些其他操作:
R语言:填色等值线图及其色标(color bar)设置
R语言:如何在一张图上画多个填色等值线图