В вашем примере есть несколько заблуждений. Во-первых, вы должны понимать, что значения в измерении netcdf должны быть числовыми. Они не являются просто метками для слоев, они являются фактическими значениями этого измерения и поэтому не могут принимать значения типа "Jan.1980"
, который является строкой. Одним из способов решения этой проблемы является сохранение файла netcdf, а затем добавление к нему значений измерения z в виде числового значения. К сожалению, это означает, что мы также не можем использовать типы переменных даты / времени, но должны сначала преобразовать их в числовые эквиваленты. Здесь я использую пакет lubridate
, чтобы сделать это.
# first we write the netcdf file to disk
writeRaster(TempStack, "Temp.nc", overwrite=TRUE,
format="CDF", varname="Temperature", varunit="degC",
longname="Temperature -- raster stack to netCDF, monthly average",
xname="Longitude", yname="Latitude", zname='Time', zunit='seconds')
# and open a connection to it to make changes.
# note that we use write=TRUE so that we can change it
nc = nc_open('Temp.nc', write = TRUE)
# now convert the strings to numeric values based on their dates
zvals = lubridate::parse_date_time(names, orders = 'm.y', tz = "UTC")
zvals = as.integer(zvals)
# and we can write these numeric dates to the z dimension
ncdf4::ncvar_put(nc, 'Time', zvals)
Записав даты в измерение z следующим образом, нам также нужно будет обратить процесс вспять, если вы хотите преобразовать числовые значения z обратно в имена растровых слоев, которые выглядят как «Jan.1908» и т. Д. Опять же, lubridate может помощь.
ncb = brick('Temp.nc')
zvals = ncvar_get(nc, 'Time')
zvals = as.POSIXct(zvals, origin = lubridate::origin, tz = "UTC")
znames = paste0(lubridate::month(zvals, label=T), '.', lubridate::year(zvals))
names(ncb) = znames
Давайте проверим, что сработало:
plot(ncb)