0 . 示例数据
NC示例数据下载
注:截取其中前10个数据用于数据处理流程说明。
1.所需软件包
require(ncdf4)
require(raster)
#安装方法
install.packages('ncdf4')
install.packages('raster')
1. NC 文件数据导入
NC文件是用于储存多维数据的一种栅格数据格式,地理学方面,其内往往包括longitude, latitude 及对应的参数,其中参数可以是一个也可以是很多个。以今天的数据为例,其中参数包括如下:
1 mcdate EFLX_LH_TOT_R FSA_R FSRVI QIRRIG SNOW TREFMXAV_R
2 mcsec EFLX_LH_TOT_U FSA_U GC_HEAT1 QOVER SNOWDP TREFMXAV_U
3 mdcur ELAI FSDS GC_ICE1 QRGWL SNOWICE TSA
4 mscur ERRH2O FSDSND GC_LIQ1 QRUNOFF SNOWLIQ TSAI
5 nstep ERRH2OSNO FSDSNDLN H2OCAN QRUNOFF_NODYNLNDUSE SNOW_SINKS TSA_R
6 time_bounds ERRSEB FSDSNI H2OSNO QRUNOFF_R SNOW_SOURCES TSA_U
7 date_written ERRSOI FSDSVD H2OSNO_TOP QRUNOFF_U SOILICE TSOI
8 time_written ERRSOL FSDSVDLN H2OSOI QSNOMELT SOILLIQ TSOI_10CM
9 area ESAI FSDSVI HC QSNWCPICE SOILWATER_10CM TSOI_ICE
10 topo FCEV FSH HCSOI QSNWCPICE_NODYNLNDUSE SoilAlpha TV
11 landfrac FCOV FSH_G HEAT_FROM_AC QSOIL SoilAlpha_U U10
12 landmask FCTR FSH_NODYNLNDUSE LAISHA QVEGE TAUX URBAN_AC
13 pftmask FGEV FSH_R LAISUN QVEGT TAUY URBAN_HEAT
14 ZSOI FGR FSH_U OCDEP RAIN TBOT WA
15 DZSOI FGR12 FSH_V PBOT RH2M TBUILD WASTEHEAT
16 WATSAT FGR_R FSM PCO2 RH2M_R TG WIND
17 SUCSAT FGR_U FSM_R Q2M RH2M_U TG_R WT
18 BSW FIRA FSM_U QBOT SABG TG_U ZBOT
19 HKSAT FIRA_R FSNO QCHARGE SABV THBOT ZWT
20 BCDEP FIRA_U FSR QDRAI SNOBCMCL TLAI
21 BTRAN FIRE FSRND QDRIP SNOBCMSL TLAKE
22 BUILDHEAT FLDS FSRNDLN QFLX_ICE_DYNBAL SNODSTMCL TREFMNAV
23 DSTDEP FPSN FSRNI QFLX_LIQ_DYNBAL SNODSTMSL TREFMNAV_R
24 DSTFLXT FSA FSRVD QINFL SNOOCMCL TREFMNAV_U
25 EFLX_DYNBAL FSAT FSRVDLN QINTR SNOOCMSL TREFMXAV
此外,NC数据往往会包含很多个(如今天示例中会有5个),构成一个时间序列,其中比较典型的就是降水,气温等。而通常来说,我们也需要去分析其中某个参数的时间序列。因此,在处理NC数据的第一步就是将其从NC文件中提取出来。但如果说我们依靠循环去遍历NC格式的话,不是不可以,就是相当费劲。特别是当我们需要提取的变量之间在NC中储存的顺序不连续的时候。庆幸的是,raster-package 中的raster与stack工具可以很方便地帮我们导入我们需要的变量。
# 1. 获取变量名
setwd('E:\\简书项目\\20191007-NC数据处理\\test-nnu\\hist') #引号中为文件储存地址
files = list.files(full.names = T) 获取
print(files[1])
[1] "./B1850.f19_g16.001.clm2.h0.0001-01.nc"
files_nc = ncdf4::nc_open(files[1])
name_files_nc = names(files_nc$var) #t通过此函数可以获得上述的变量名缩写
# 获取变量名全称方法如下,以TG_R 变量为例
files_nc$var$TG_R$longname
[1] "Rural ground temperature"
#2. 导入单个NC文件,以变量TG_R为例
nc_raster = raster(files[1], varname = 'TG_R')
nc_raster
class : RasterLayer
dimensions : 96, 144, 13824 (nrow, ncol, ncell)
resolution : 2.5, 1.894737 (x, y)
extent : -1.25, 358.75, -90.94737, 90.94737 (xmin, xmax, ymin, ymax)
crs : +proj=longlat +datum=WGS84 +ellps=WGS84 +towgs84=0,0,0
source : E:/简书项目/20191007-NC数据处理/test-nnu/hist/B1850.f19_g16.001.clm2.h0.0001-01.nc
names : Rural.ground.temperature
z-value : 0001-02-01
zvar : TG_R
# 3. 导入TG_R变量的时间序列
tgr_ts = stack(files[1:5],varname = 'TG_R')
tgr_ts
class : RasterStack
dimensions : 96, 144, 13824, 5 (nrow, ncol, ncell, nlayers)
resolution : 2.5, 1.894737 (x, y)
extent : -1.25, 358.75, -90.94737, 90.94737 (xmin, xmax, ymin, ymax)
crs : +proj=longlat +datum=WGS84 +ellps=WGS84 +towgs84=0,0,0
names : Rural.ground.temperature.1, Rural.ground.temperature.2, Rural.ground.temperature.3, Rural.ground.temperature.4, Rural.ground.temperature.5
2. NC 文件数据预处理
当我们通过raster/stack将对应的变量导入R之后,如果我们需要进一步对其进行切片处理,如统计分布、筛选等,我们可以通过as.data.frame 含函数将其转化为data.frame,然后再进一步处理。
# 4. 将单个raster文件转化为data.frame
df_tgr = as.data.frame(nc_raster,xy = T)
head(df_tgr)
x y Rural.ground.temperature
1 0.0 90 NA
2 2.5 90 NA
3 5.0 90 NA
4 7.5 90 NA
5 10.0 90 NA
6 12.5 90 NA
# 5. 将stack文件转化为data.frame
df_tgr_ts = as.data.frame(tgr_ts,xy = T)
head(df_tgr_ts)
x y Rural.ground.temperature.1 Rural.ground.temperature.2 Rural.ground.temperature.3
1 0.0 90 NA NA NA
2 2.5 90 NA NA NA
3 5.0 90 NA NA NA
4 7.5 90 NA NA NA
5 10.0 90 NA NA NA
6 12.5 90 NA NA NA
Rural.ground.temperature.4 Rural.ground.temperature.5
1 NA NA
2 NA NA
3 NA NA
4 NA NA
5 NA NA
6 NA NA