0 . 示例數(shù)據(jù)
NC示例數(shù)據(jù)下載
注:截取其中前10個數(shù)據(jù)用于數(shù)據(jù)處理流程說明。
1.所需軟件包
require(ncdf4)
require(raster)
#安裝方法
install.packages('ncdf4')
install.packages('raster')
1. NC 文件數(shù)據(jù)導(dǎo)入
NC文件是用于儲存多維數(shù)據(jù)的一種柵格數(shù)據(jù)格式,地理學(xué)方面,其內(nèi)往往包括longitude, latitude 及對應(yīng)的參數(shù),其中參數(shù)可以是一個也可以是很多個。以今天的數(shù)據(jù)為例,其中參數(shù)包括如下:
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數(shù)據(jù)往往會包含很多個(如今天示例中會有5個),構(gòu)成一個時間序列,其中比較典型的就是降水,氣溫等。而通常來說,我們也需要去分析其中某個參數(shù)的時間序列。因此,在處理NC數(shù)據(jù)的第一步就是將其從NC文件中提取出來。但如果說我們依靠循環(huán)去遍歷NC格式的話,不是不可以,就是相當(dāng)費勁。特別是當(dāng)我們需要提取的變量之間在NC中儲存的順序不連續(xù)的時候。慶幸的是,raster-package 中的raster與stack工具可以很方便地幫我們導(dǎo)入我們需要的變量。
# 1. 獲取變量名
setwd('E:\\簡書項目\\20191007-NC數(shù)據(jù)處理\\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通過此函數(shù)可以獲得上述的變量名縮寫
# 獲取變量名全稱方法如下,以TG_R 變量為例
files_nc$var$TG_R$longname
[1] "Rural ground temperature"
#2. 導(dǎo)入單個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數(shù)據(jù)處理/test-nnu/hist/B1850.f19_g16.001.clm2.h0.0001-01.nc
names : Rural.ground.temperature
z-value : 0001-02-01
zvar : TG_R

TG_R單個柵格數(shù)據(jù)
# 3. 導(dǎo)入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

TG_R時間序列
2. NC 文件數(shù)據(jù)預(yù)處理
當(dāng)我們通過raster/stack將對應(yīng)的變量導(dǎo)入R之后,如果我們需要進一步對其進行切片處理,如統(tǒng)計分布、篩選等,我們可以通過as.data.frame 含函數(shù)將其轉(zhuǎn)化為data.frame,然后再進一步處理。
# 4. 將單個raster文件轉(zhuǎn)化為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文件轉(zhuǎn)化為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