У меня есть 73 файла netCDF, каждый из которых представляет 5-дневные интервалы календарного года и имеет несколько переменных. Каждый файл состоит из 120 слоев, представляющих часовые интервалы.
Я прочитал их все в R и назвал их соответствующим образом, используя пакет ncdf4
, например:
filenames <- list.files(path=getwd())
for(i in filenames) {
ncin <- nc_open(i)
ds<-paste(i)
assign(ds, ncin)
print(i)
}
У меня также есть фрейм данных с местоположениями в той же проекции, что и файлы netCDF (широта и долгота), однако эти местоположения также нерегулярно охватывают весь календарный год. Пример данных выглядит так:
>head(df)
> Lon Lat datetime
2 -3.179046 58.65417 2016-09-30 17:25:38
3 -3.180403 58.65483 2016-09-30 17:29:43
4 -3.187734 58.66102 2016-09-30 21:22:51
5 -3.190197 58.66409 2016-09-30 22:02:47
6 -3.182058 58.67433 2016-10-01 06:16:08
7 -3.181318 58.67475 2016-10-01 06:20:31
Что я пытаюсь сделать, так это сопоставить фрейм данных с правильным файлом netCDF и слоем на основе его отметки даты и времени, т.е. если это между 1 и 5 днями года, это будет файл netCDF 1 и т. Д., Тогда я хочу интерполировать переменные данные из файла netCDF в данные о местоположении с соответствующей меткой даты и времени кадра данных. Итак, каково значение переменной V в тот же день и время в файле netCDF в заданное время и в указанном кадре данных. Я могу выполнить первую часть, используя функции цикла, но это крайне неэффективно и требует много времени для кодирования:
function(dataframe){
d <- dataframe[i,]
if(between(d$datetime, 2017-01-01 00:00:00, 2017-01-05 23:59:59){ncfile <- file1} else if (between(d$datetime, 2017-01-06 00:00:00, 2017-01-010 23:59:59))
{ncfile <- file2}}
И так далее ... Я никогда раньше не работал с файлами netCDF, я не уверен в лучшем методе. Какие-либо предложения?
################# UPDATEЯ читал файлы netCDF при использовании
filenames <- list.files(path=getwd())
x <- lapply(filenames, nc_open)
извлекать из файла даты с последовательными именами:
PFOW_Climatology2_0001_1993-01-01.nc
PFOW_Climatology2_0002_1993-01-06.nc
up to
PFOW_Climatology2_0073_1993-12-27.nc
используя
fd <- as.Date(substr(filenames, 24, 36))
Затем я создаю справочный столбец для фрейма данных, находя интервал, в котором каждая точка данных соответствует в fd, следующим образом:
i <- findInterval(dd, fd)
df$file <- i