Как перекодировать нестандартное измерение даты в файле netcdf в R? - PullRequest
0 голосов
/ 19 апреля 2019

Я ищу совет о том, как перекодировать измерение времени / даты в файле / растре кирпича netcdf.Я извлек месячные данные о температуре, и измерение даты не в стандартном формате даты.Например, 1850.04166666667, 1850.125, означает январь и февраль 1850 соответственно в данных, и R не мог их понять.Вот структура данных

> eco.sst
class       : RasterBrick 
dimensions  : 180, 360, 64800, 2030  (nrow, ncol, ncell, nlayers)
resolution  : 1, 1  (x, y)
extent      : -180, 180, -90, 90  (xmin, xmax, ymin, ymax)
coord. ref. : +proj=longlat +datum=WGS84 +ellps=WGS84 +towgs84=0,0,0 
data source : C:\Users\Admin\AppData\Local\Temp\Rtmp6vFWNG\raster\r_tmp_2019-04-18_183528_11516_79080.grd 
names       : X1850.04166666667,     X1850.125, X1850.20833333333, X1850.29166666667,     X1850.375, X1850.45833333333, X1850.54166666667,     X1850.625, X1850.70833333333, X1850.79166666667,     X1850.875, X1850.95833333333, X1851.04166666667,     X1851.125, X1851.20833333333, ... 
min values  :      -0.668686926,  -0.273689777,      -1.902773499,      -3.406341553,  -3.626811743,      -2.131400585,      -1.569969416,  -1.630665064,      -2.418994188,      -1.971702099,  -0.822018623,      -3.423746109,      -1.303600550,  -0.786648691,      -1.452626705, ... 
max values  :      3.926926e+00,  1.550823e+00,      1.151636e+00,      6.622851e-01,  9.673859e-01,      7.178870e-01,      9.010030e-01,  4.363060e-01,      5.231520e-01,      3.346115e-01,  2.156055e-01,      6.418970e-01,      2.259051e+00,  3.802529e+00,      2.077996e+00, ... 
time        : 1850.04166666667, 2019.125 (min, max)

Я написал функцию для замены десятичных точек;

fun.repl = function (x, na.rm = TRUE) str_replace(x, ".04166666667", "-1") 

таким, что 1850.04166666667, что означает, что январь 1850 года становится 1850-1;

который я затем применил к растру в виде:

stackApply(eco.sst, "time", fun.repl)

eco.sst - это растровый кирпич, в то время как «время» ссылается на измерение времени.Но функция не сработала.Я подозреваю, что недостаточно хорошо понимаю структуру данных, чтобы успешно применить функцию.Я новичок в этом, а также обнаружил, что это редкая проблема с netcdf.

Я ожидаю, что 1850.04166666667, 1850.125, 1850.20833333333, 1850.29166666667 ... что означает, что январь-апрель 1850 года станут стандартными датами в виде .... 1850-1, 1850-2, 1850-3, 1850-4и т.д.

1 Ответ

1 голос
/ 19 апреля 2019

Вот еще один способ получить даты

todate <- function(x) {
    year <- trunc(x)
    month <- round(12 * ((x - year) + 1/24))
    as.Date(paste0(year, "-", month, "-15")) 
}

dts <- c(1850.04166666667, 1850.125)
d <- todate(dts)
d
#[1] "1850-01-15" "1850-02-15"

Обратите внимание, что я использую 15-й день для каждого месяца, чтобы получить действительную дату - но, похоже, именно это и предполагается.

Теперь вы, вероятно, хотите использовать setZ, см. Пример ниже.(stackApply здесь не имеет смысла, и используемые вами аргументы также недопустимы)

library(raster)
r <- raster(ncol=10, nrow=10)
s <- stack(lapply(1:2, function(x) setValues(r, runif(ncell(r)))))
s <- setZ(s, d)
s
#class      : RasterStack 
#dimensions : 10, 10, 100, 2  (nrow, ncol, ncell, nlayers)
#resolution : 36, 18  (x, y)
#extent     : -180, 180, -90, 90  (xmin, xmax, ymin, ymax)
#crs        : +proj=longlat +datum=WGS84 +ellps=WGS84 +towgs84=0,0,0 
#names      :    layer.1,    layer.2 
#min values : 0.01477963, 0.01178438 
#max values :  0.9980334,  0.9939610 
#time        : 1850-01-15, 1850-02-15 
...