Как объединить ежемесячные файлы 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», который должен уметь объединять очень длинные серии файлов по измерению записи, в данном случае времени, но пока безуспешно. Я пробовал сначала просто с двумя файлами

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.


person marie_r    schedule 05.10.2016    source источник
comment
У меня есть доступ к FTP-серверу PPS TRMM. Можете ли вы отправить ссылку на файлы 3B43.19980101.7.HDF.nc, к которым вы обращаетесь? Я могу взглянуть.   -  person Eric Bridger    schedule 06.10.2016
comment
Есть ли способ поделиться с нами этими двумя файлами? Это поможет диагностировать проблему. Не могли бы вы сделать ncdump -h [filename] для одного из файлов?   -  person N1B4    schedule 06.10.2016
comment
@EricBridger Я загрузил файлы с mirador.gsfc.nasa.gov, используя координаты (15.04, - 90,05), (15,31, -89,24)   -  person marie_r    schedule 12.10.2016
comment
@ N1B4 Вот ссылка: dropbox.com/sh/3c7dd03c3xv8q3c/shg/3xv8q3c/sh/93xv8cc = 0   -  person marie_r    schedule 12.10.2016
comment
@ N1B4 У меня почему-то не работает ncdump. После установки, если я перейду в папку NCO, я могу найти: ncap2, ncatted, ncbo, ncea, ncecat, ncflint, ncks, ncpdq, ncra, ncrcat, ncrename, & ncwa. Но нет ncdump ...   -  person marie_r    schedule 12.10.2016
comment
@marie_r Я нашел файлы и потратил некоторое время, потому что это набор данных, который я хотел бы использовать. Я пришел к выводу, что это невозможно с помощью одних только инструментов nco. Основная проблема в том, что в файлах нет временной переменной. Сначала вам нужно создать временную переменную, задав значение на основе имени файла. Я бы использовал библиотеку Python NetCDF4, не знаю R. Затем вы можете создать измерение времени, mk_rec_dmn time, а затем использовать ncrcat.   -  person Eric Bridger    schedule 12.10.2016
comment
Есть идеи, как это сделать с помощью Python?   -  person marie_r    schedule 17.10.2016
comment
Это вполне возможно сделать с NCO. У вас есть правильная стратегия, и вам просто нужно добавить измерение времени (временная переменная не нужна, хотя это тоже не повредит). Добавьте измерение времени с помощью   -  person Charlie Zender    schedule 23.10.2016


Ответы (2)


В R вы можете сделать это, прочитав все данные, объединив их в один большой трехмерный массив (latxlonxtime). Например, array [,, 1] будет сеткой latxlon для января 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
person Jack Ballard    schedule 10.10.2016
comment
Что вы имеете в виду под n.lon = 192 и n.lat = 94? Как мне проверить мой правильный #? - person marie_r; 12.10.2016
comment
Размеры наборов данных по долготе и широте. В терминале, если у вас установлен и загружен netCDF, вы можете сделать ncdump -h filename, и он напечатает сводную информацию. В противном случае в R откройте один из ваших файлов: filename="3B43.19980101.7.HDF.nc"; ncdata=nc_open(filename); print(ncdata) Это дает вам сводку файла, включая «размер» для измерений долготы и широты. - person Jack Ballard; 12.10.2016
comment
Большое спасибо, Джек! Используя ваш скрипт, я смог создать файл rds. Однако мне действительно интересно сохранить его как файл NC. Есть идеи, где я могу найти дополнительную информацию по этому поводу? - person marie_r; 17.10.2016

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

ncecat -u time in.nc out.nc

Затем используйте ncrcat, как вы сказали выше. p.s. Я изменил сообщения об ошибках 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 есть много примеров использования файловых циклов.

person Charlie Zender    schedule 23.10.2016
comment
Благодарность! Думаю, это могло сработать. Теперь мой последний вопрос: есть ли способ сделать это в цикле. У меня более 200 файлов, к которым я хотел бы добавить измерение времени, чтобы затем объединить их вместе. - person marie_r; 24.10.2016