Создать вектор временных рядов (пространственное среднее) из NETCDF R

У меня есть файл NETCDF с атрибутами: долгота, широта, время, количество осадков. Данные покрывают определенную пространственную область. Это ежедневные данные с 1960 по 2100 год.

1) Я хотел бы разместить данные в пространстве (например, lat[45,50] и lon[-78,-85]) из основного домена

2) Из подмножества я хотел бы усреднить все сетки и создать дневной ряд из одного столбца, а затем записать его в файл.csv.

NB: мои данные содержат пропущенные значения. Я довольно новичок в netcdf.

Благодарю.

2 ответа

Решение

Что-то в этом роде должно работать

library(raster)
b <- brick('file.nc')
be <- crop(b, extent(-85, -78, 45, 50))
a <- aggregate(be, dim(be)[2:1], na.rm=TRUE)
v <- values(a)
write.csv(v, 'precip.csv', row.names=FALSE)

Обычно, чтобы получить дату:

date <- getZ(be)

Или же

date <- names(a)
date <- gsub('X', '', date)

А потом

v <- data.frame(date=date, prec=v)
write.csv(v, 'precip.csv', row.names=FALSE)

Является ли эта дата удобочитаемой для человека, зависит от того, как она хранится в файле ncdf (т.е. соблюдаются ли определенные соглашения или нет).

Это сделало бы сокращение и усреднение, но записало ответ в другой netcdf. Если вам действительно нужен CSV, вам нужно использовать эту часть решения выше.

cdo fldmean -sellonlatbox,-85,-78,45,50 in.nc out.nc
library (ncdf4)

nc <- nc_open("netcdf.nc")

lon <- ncvar_get(nc,"lon")
lat <- ncvar_get(nc,"lat")
time <- ncvar_get(nc,"time")

lon_lim <- c(45,50)
lat_lim <- c(-78,-85)

lon_ind <- which(lon >= lon_lim[1] & lon <= lon_lim[2])
lat_ind <- which(lat >= lat_lim[1] & lat <= lat_lim[2])

precip <- ncvar_get(nc,"precip",start = c(lon_ind[1],lat_ind[1],time),count = c(length(lon_ind),length(lat_ind),length(time)))

ts <- apply(precip,3,mean,na.rm=TRUE)

Другие вопросы по тегам