Принудительная "плавание" точности для координатной переменной неограниченной размерной переменной (времени) в netcdf с использованием R(ncdf4)
Команда ncdim_def
из пакета ncdf4
построен для поощрения автоматического создания координатной переменной, которая соответствует измерению, очень хорошая практика.
Тем не менее, он позволяет только создать "двойную" или "целочисленную" точность для этой координатной переменной. По внешним причинам мне нужно записать переменную координаты "время" в виде числа с плавающей точкой.
Для этого я использую следующую структуру, которая состоит в создании переменной координаты отдельно от определения измерения (т. Е. С использованием параметра create_dimvar = FALSE
описано в документе ncdim_def
)
timevalue= seq(0.5,10.5)
VAR1value= seq(10.2,20.2)
# define time dim, but without the time var
timedim <- ncdim_def( name = 'time' ,
units = '',
vals = seq(length(timevalue)),
unlim = TRUE,
create_dimvar = FALSE)
# define time coordinate variable
timevar <- ncvar_def(name = 'time',
units = 'days since 1950-01-01 00:00:00',
dim = list(timedim),
longname = 'time',
prec = "float")
# define another variable
var1var<- ncvar_def(name = 'VAR1',
units = 'unit1',
dim = list(timedim),
missval = -9999.0,
longname = 'VAR1 long name')
defVar<-list(timevar,var1var)
# creating ncfile (removing any previous one for repeated attempt)
ncfname='test.nc'
if (file.exists(ncfname)) file.remove(ncfname)
ncout <- nc_create(ncfname,defVar,force_v4=T, verbose = T)
# writing the values
ncvar_put(ncout,timevar,timevalue)
ncvar_put(ncout,var1var,VAR1value)
nc_close(ncout)
Тем не менее, это возвращает ошибку:
"ncvar_put: warning: you asked to write 0 values, but the passed data array has 11 entries!"
Действительно, полученный netcdf показывает (ncdump):
dimensions:
time = UNLIMITED ; // (0 currently)
variables:
float time(time) ;
time:units = "days since 1950-01-01 00:00:00" ;
float VAR1(time) ;
VAR1:units = "unit1" ;
VAR1:_FillValue = -9999.f ;
VAR1:long_name = "VAR1 long name" ;
Я предполагаю, что мне нужно навязать измерение неограниченного "временного" измерения при создании, но я не понимаю, как это сделать в рамках ncdf4
,
0 ответов
Я столкнулся с той же проблемой (мне требовалось измерение времени как float вместо double), и я смог решить ее, определив временную переменную как обычное неограниченное измерение с длиной моего вектора часов
hours <- c("595377")
t <- ncdim_def("time", "", 1:length(hours), create_dimvar = FALSE)
timevar <- ncvar_def(name = "time",
units = 'hours since 1950-01-01 00:00:00',
dim = list(t),
longname = "time",
prec = "float")
variables <- list(timevar)
ncnew <- nc_create("TEST.nc", variables )
ncvar_put(ncnew, timevar, hours, start=c(1), count=c(length(hours)))
nc_close(ncnew)
Не уверен, что это работает, только если измерение времени имеет только одно значение...