R语言处理气象数据:NetCDF格式数据的读写

下载的气象数据大多是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文档信息摘要

R语言处理气象数据:NetCDF格式数据的读写_第1张图片

​结果显示,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语言处理气象数据:NetCDF格式数据的读写_第2张图片

​​​​​数据成功读取后我们可以进行一些其他操作:

R语言:填色等值线图及其色标(color bar)设置

R语言:如何在一张图上画多个填色等值线图


你可能感兴趣的:(R语言,数据的读写)