NetCDF datu failu importēšana un apstrāde programmā R

Strādājot ar klimatiskajiem datiem, ļoti bieži tie ir īpašā NetCDF datu formātā. Piemēram, šādā formātā ir pieejami E-OBS diennakts klimatiskie dati Eiropai katram 0.25 vai 0.5 grādu regulāram režģim (gridded data).

Līdz šim lielākā problēma bija no šiem datiem atlasīt tikai tās koordinātes, kuras ir nepieciešamas un pārvēst datus R saprotamā datu tabulā, jo šo datu importēšana un atlasīšana prasīja specifiskas zināšanas par šo datu uzbūvi.

Tagad ir pieejama R pakete tidync, kas šo procesu padara ievērojami vieglāku. Pagaidām šī pakete ir pieejama tikai github serverī, tāpēc instalācijai jāizmanto devtools pakete.

Piemēram izmantošu E-OBS klimatiskos datus par diennakts vidējo temperatūru no European Climate Assessment&Dataset lapas.

Pirmkārt, datus vajag lejupielādēt. Izmantosim datus par vidējām diennakts temperatūrām 0.25 grādu režģī. Šeit jāņēm vērā, ka datu failam ir ļoti liels izmērs (nesakompresētā veidā piemērā izmantotais fails ir 4.6 GB).

Datu importēšanu un apskatīšu veic ar funkciju tidync(). Rezultātā redzams, cik datiem ir dimensijas (šajā gadījumā trīs - longitude, latitude un time). Sadaļā Dimensions ir minētas arī katras dimensijas minimālās un maksimālās vērtības. Ja attiecībā uz koordinātēm viss ir skaidrs, tad attiecībā uz laiku vērtības ir no 0 līdz 24714. Šie skaitļi nozīmē dienu skaits kopš references punkta. Attiecībā uz konkrēto datu objektu references punkts ir 1950. gada 1. janvāris, kad šī datu rinda sākas.

library(tidync)
tidync("tg_0.25deg_reg_v16.0.nc")
## 
## Data Source (1): tg_0.25deg_reg_v16.0.nc ...
## 
## Grids (4) <dimension family> : <associated variables> 
## 
## [1]   D0,D1,D2 : tg    **ACTIVE GRID** ( 2305019760  values per variable)
## [2]   D0       : longitude
## [3]   D1       : latitude
## [4]   D2       : time
## 
## Dimensions (3): 
##   
##   dim      id name    length   min     max active start count  dmin   dmax 
##   <chr> <dbl> <chr>    <dbl> <dbl>   <dbl> <lgl>  <int> <int> <dbl>  <dbl> 
## 1 D0       0. longit…   464. -40.4    75.4 TRUE       1   464 -40.4 7.54e1 
## 2 D1       1. latitu…   201.  25.4    75.4 TRUE       1   201  25.4 7.54e1 
## 3 D2       2. time    24715.   0.  24714.  TRUE       1 24715   0.  2.47e4 
## # ... with 2 more variables: unlim <lgl>, coord_dim <lgl>

Visus datus uzreiz pārvērst datu tabulā nebūtu ieteicams, jo rezultātā izveidosies ļoti liels objekts, kura apjoms var pārsniegt pieejamo operatīvās atmiņas lielulumu. Datu atlasīšanu veic ar funkciju hyper_filter(), norādot vērtību diapozonus dimensijām (vienai vai vairākām). Piemērā atlasīsim datus par pirmajām 365 dienām, un koordinātēm, kas attiecas uz daļu Latvijas. Datu pārvēršanai datu tabulā izmanto funkciju hyper_tible().

climdata <- tidync("tg_0.25deg_reg_v16.0.nc") %>%
     hyper_filter(latitude = between(latitude, 56.5,57),
                   longitude = between(longitude, 21.0,21.5)) %>%
      hyper_tibble()

Reālā datuma iegūšanai var izmantot funkciju as.Date(), norādot kā origin = 1950. gada 1. janvāri.

climdata$date <-as.Date(climdata$time, origin = as.Date("1950-01-01"))

Iegūtajā datu tabulā ir diennakts vidējā temperatūra (tg), režģa punkta koordinātes, kā arī datums un oriģinālais laika (time) mainīgais.

head(climdata)
## # A tibble: 6 x 5
##       tg longitude latitude  time date      
##    <dbl>     <dbl>    <dbl> <dbl> <date>    
## 1 -1.91       21.1     56.6    0. 1950-01-01
## 2 -2.63       21.4     56.6    0. 1950-01-01
## 3 -2.23       21.4     56.9    0. 1950-01-01
## 4 -0.350      21.1     56.6    1. 1950-01-02
## 5 -0.780      21.4     56.6    1. 1950-01-02
## 6 -0.460      21.4     56.9    1. 1950-01-02
Didzis Elferts
Didzis Elferts
Datu zinātnieks, vadošais pētnieks

Manas zinātniskās intereses saistītas ar statistiku un programmu R.