Извлечение подмножества из файла netCDF с использованием lat / lon и преобразование в .csv в R

У меня есть серия файлов nertCDF, содержащих глобальные данные для конкретной переменной, например tmin / tmax / осадки / скорость ветра / относительная влажность / радиация и т. д. При использовании функции nc_open в R я получаю следующую информацию:

файл данных: https://www.dropbox.com/s/xpo7zklcmtm3g5r/gfdl_preci.nc?dl=0

Файл gfdl_preci.nc (NC_FORMAT_NETCDF4_CLASSIC):

     1 variables (excluding dimension variables):
        float prAdjust[lon,lat,time]   
            _FillValue: 1.00000002004088e+20
            missing_value: 1.00000002004088e+20
            comment: includes all types (rain, snow, large-scale, convective, etc.)
            long_name: Bias-Corrected Precipitation
            units: kg m-2 s-1
            standard_name: precipitation_flux

     3 dimensions:
        lon  Size:720
            standard_name: longitude
            long_name: longitude
            units: degrees_east
            axis: X
        lat  Size:360
            standard_name: latitude
            long_name: latitude
            units: degrees_north
            axis: Y
        time  Size:365   *** is unlimited ***
            standard_name: time
            units: days since 1860-1-1 00:00:00
            calendar: standard
            axis: T

    14 global attributes:
        CDI: Climate Data Interface version 1.7.0 (http://mpimet.mpg.de/cdi)
        Conventions: CF-1.4
        title: Model output climate of GFDL-ESM2M r1i1p1 Interpolated to 0.5 degree and bias corrected using observations from 1960 - 1999 for EU WATCH project
        CDO: Climate Data Operators version 1.7.0 (http://mpimet.mpg.de/cdo)
        product_id: input
        model_id: gfdl-esm2m
        institute_id: PIK
        experiment_id: historical
        ensemble_id: r1i1p1
        time_frequency: daily
        creator: [email protected]
        description: GFDL-ESM2M bias corrected impact model input prepared for ISIMIP2.

Мне удалось прочитать файл netCDF (переменные и размеры) и разбить время на поля. Но мне все еще нужно извлечь фрагмент информации на основе местоположения (используя 4 координаты квадрата), например, европа. Позже мне нужно преобразовать фрагмент в формат .csv.

пока я мог дойти до этого шага:

# load the ncdf4 package
library(ncdf4)

# set path and filename
setwd("D:/netcdf")
ncname <- "gfdl_preci"
ncfname <- paste(ncname, ".nc", sep = "")
dname <- "prAdjust" 

# open a netCDF file
ncin <- nc_open(ncfname)
print(ncin)
# get longitude and latitude
lon <- ncvar_get(ncin,"lon")
nlon <- dim(lon)
head(lon)

lat <- ncvar_get(ncin,"lat")
nlat <- dim(lat)
head(lat)

print(c(nlon,nlat))

# get time
time <- ncvar_get(ncin,"time")
time

tunits <- ncatt_get(ncin,"time","units")
nt <- dim(time)
nt
tunits

# get variable
preci.array <- ncvar_get(ncin,dname)

dlname <- ncatt_get(ncin,"prAdjust","long_name")

dunits <- ncatt_get(ncin,"prAdjust","units")

fillvalue <- ncatt_get(ncin,"prAdjust","_FillValue")

dim(preci.array)

# split the time units string into fields
tustr <- strsplit(tunits$value, " ")

tdstr <- strsplit(unlist(tustr)[3], "-")

tmonth = as.integer(unlist(tdstr)[2])

tday = as.integer(unlist(tdstr)[3])

tyear = as.integer(unlist(tdstr)[1])

chron(time, origin = c(tmonth, tday, tyear))

Любая помощь будет оценена по достоинству!


person Eeusha Nafi    schedule 28.08.2017    source источник
comment
Не могли бы вы опубликовать свой код R, чтобы получить такой результат.   -  person and-bri    schedule 28.08.2017
comment
# загрузить библиотеку пакета ncdf4 (ncdf4) # установить путь и имя файла setwd (D: / netcdf) ncname ‹- gfdl_preci ncfname‹ - paste (ncname, .nc, sep =) dname ‹- prAdjust # открыть файл netCDF ncin‹ - nc_open (ncfname) print (ncin)   -  person Eeusha Nafi    schedule 28.08.2017
comment
привет, вы добились некоторого прогресса в решении своей проблемы. Похоже, что на ваш вопрос дан ответ? Если так, подумайте о том, чтобы закрыть вопрос. Кстати, то, как вы задаете вопрос, - не лучший стиль. Люди этого не оценили. Попытайтесь сделать ваш пример кода воспроизводимым, но удалите из-за вопроса не относящуюся к делу информацию. Подробнее об этом можно прочитать здесь: stackoverflow.com/help/how-to-ask   -  person and-bri    schedule 29.08.2017
comment
Большое спасибо за добрый комментарий. Прошу прощения за то, что не могу задать свой вопрос в стандартном формате. Тем не менее, я смог прочитать файл netCDF (переменные и размеры) и разбить время на поля. Но мне все еще нужно извлечь фрагмент информации на основе местоположения (с использованием 4 координатных точек квадрата), например, европа. Позже мне нужно преобразовать фрагмент в формат .csv.   -  person Eeusha Nafi    schedule 29.08.2017


Ответы (2)


1.) Нам неизвестен ваш файл, но вы можете получить некоторые детали объекта netCDF в R следующим образом:

data <- ncvar_get(ncin)
data

Или вы напрямую обращаетесь к слотам. Вы также можете попробовать другие числа, такие как 11 или 7, для адресации других слотов в объекте списка.

ncin[[7]]
ncin[[11]]

2.) Вот документация используемого вами пакета, я думаю, ответ вашей проблемы где-то там:
https://cran.r-project.org/web/packages/ncdf4/ncdf4.pdf

3.) Вы сохраняете информацию из R в таком файле:

write.csv(cbind(lat, lon), "result.csv", row.names=F)
person and-bri    schedule 28.08.2017
comment
Добавляю как сохранить в csv - person and-bri; 29.08.2017

вы можете извлечь точку в NC с помощью library raster

library(raster)
library(sp)

r <- brick("csiromk3.6-rcp45-2010-2099-pr.nc", varname = "pr")
vals <- extract(r, matrix(c(95.46400, 5.40400), ncol = 2))
vals

вы можете записать его в csv, преобразовав vals в dataframe

vals <- as.data.frame(t(vals),row.names = FALSE)

write.csv(vals, "D:\\ch_2010_2099_rcp45.csv")
person ExHunter    schedule 28.11.2018