Как объединить ежемесячные файлы netCDF TRMM в один файл netCDF, используя NCO или R в Windows 7?

Я скачал месячную норму осадков TRMM в формате netCDF с 1998 по 2016 год, так что примерно более 200 файлов. Названия этих файлов 3B43.19980101.7.HDF.nc 3B43.19980201.7.HDF.nc 3B43.19980301.7.HDF.nc, и так далее. Я хотел бы объединить все эти файлы в один netCDF. Я попытался использовать оператор NCO "ncrcat", который должен иметь возможность объединять очень длинные серии файлов по измерению записи, в данном случае это время, но пока не повезло. Я попробовал сначала просто только с 2 файлами

ncrcat -O -h 3B43.19980101.7.HDF.nc 3B43.19980201.7.HDF.nc out.nc

получил

ОШИБКА: нет переменных переменных критериев для обработки

тогда я попробовал

ncks --mk_rec_dmn time 3B43.19980101.7.HDF.nc TD.3B43.19980101.7.HDF.nc
ncks --mk_rec_dmn time 3B43.19980201.7.HDF.nc TD.3B43.19980201.7.HDF.nc

Я попробовал еще раз с

ncrcat -O -h TD.3B43.19980101.7.HDF.nc TD.3B43.19980201.7.HDF.nc out.nc

все еще получил ту же ошибку

ОШИБКА: нет переменных переменных критериев для обработки

Есть ли более простой способ сделать это с 200+ файлами? Сценарий, которому я могу следовать? Я новичок во всем этом, поэтому, пожалуйста, будьте нежны.

Любая помощь будет принята с благодарностью. Я использую Windows 7 x86.

2 ответа

Это вполне возможно сделать с помощью NCO. Я посмотрел на ваши входные файлы, и им просто не хватает измерения времени, поэтому ncrcat не работает. Добавьте измерение времени с помощью

ncecat -u time in.nc out.nc

Затем используйте ncrcat, как вы сказали выше. PS Я изменил сообщения об ошибках ncrcat и ncra, чтобы быть более понятным, как это сделать. Ранее подсказки применялись только в тех случаях, когда файл уже имел размерность, но он был исправлен. У ваших файлов не было измерения времени, поэтому введенная вами команда ncks не имела никакого эффекта.

Изменить, чтобы показать петли:

Чтобы сделать это или что-то подобное в цикле, используйте такую ​​конструкцию

for fl in `ls trmm*.nc`; do
    ncecat -u time ${fl} ${fl/trmm/trmm_new} # Base output name in input name
    ... # more processing
done

В руководстве NCO есть много примеров использования файловых циклов.

В R вы можете сделать это, считывая все данные, объединяя их в один большой трехмерный массив (latxlonxtime). Например, массив [,,1] будет сеткой латексона для января 1998 года. Затем его можно сохранить в формате.rds для дальнейшего использования в R или сохранить в виде файла netCDF, который я не буду охватывать, но есть учебные пособия по сохранению массивов R в виде файлов.nc в Интернете.

Сначала создайте файл.csv, который содержит один столбец всех загруженных вами имен файлов. Один из простых способов - это ctrl-C вывод, набрав 'ls' в терминале в лист Excel. Приведенный ниже код читает эти файлы один за другим, добавляя каждый из них в массив.

library(ncdf4)
library(abind)
filenames=read.csv('TRMM.filenames.csv',head=F) #read in filenames
filenames=as.character(filenames[,1]) #convert to 'character' format

n.lon=192 #input the correct #'s here, must be the same for all files
n.lat=94

NA.matrix=matrix(rep(NA,n.lon*n.lat),nrow=n.lon) #used to initialize
prcp=array(NA.matrix,c(n.lon,n.lat,1)) #n.lonxn.latx1 array of NA's to initialize
for (i in 1:length(filenames)){
  ncdata=nc_open(filenames[i]) #read in file i, assuming files are in same location as filenames.csv/your current working directory
  #ncdata=nc_open(paste(data.dir,filenames[i],sep="")) #if your data is in another directory than the filenames.csv file, you could read it in with this line instead
  nc=ncvar_get(ncdata,"precip") #check the .nc files to see what the variable name actually is; this reads in the variable "precip"
  prcp=abind(prcp,nc)
}
prcp=prcp[,,-1] #remove the NA.matrix used to initialize

dim(prcp) #check that the lonxlatxtime dimensions make sense
saveRDS(prcp,'TRMM.all.rds') #save as .rds file, or proceed to save it as .nc file, which takes a bit more work
Другие вопросы по тегам