Объединить два файла nc4 разного времени
Предположим, два файла netCDF (в моем случае nc4), каждая из которых имеет одну переменную с 3 измерениями: широта, долгота и время (год). Они имеют разные промежутки времени (например, 1700-2005 и 2005-2100 гг. - они перекрываются в 2005 г.). Как я могу объединить их, чтобы получить один файл nc4, охватывающий 1700-2100?
Просто попробуйте оператор NCO ncrcat file1.cn4 file2.nc4 result.nc4
дает файл, который охватывает [1700-2005, 1700-1795]. При запуске линии он предупреждает: nco_cln_clc_dff<><> failed to initialize UDUnits2 library
, Согласно этому посту, мне не о чем беспокоиться.
Я также использовал добавление, как описано в руководстве NCO ncrcat --rec_apn file2.nc4 file1.cn4
, Я получаю результирующий промежуток времени [2005-2310,2005-2100] и предупреждение: ncrcat: WARNING Intra-file non-monotonicity. Record coordinate “time” does not monotonically decrease between input file file2.nc4 record indices: 94,95 output file1.nc4 record indices 400,401 ...
(индексы здесь менее важны, так как я получаю предупреждение для каждого из них)
Обратите внимание, что я мог бы объединиться без проблем с CDO в Linux: cdo mergetime file1.cn4 file2.nc4 result.nc4
(или же cdo -z zip_3 mergetime file1.cn4 file2.nc4 result.nc4
чтобы получить уровень сжатия 3). Обратите внимание, что я должен был использовать export SKIP_SAME_TIME=1
перед звонком cdo mergetime
для того, чтобы справиться с перекрытием 2005 года (потребуется только первое вхождение).
С помощью RI попробовал следующее:
library(ncdf4)
library(ncdf.tools)
ncFile1 <- nc_open("C://file1.nc4")
nc1 <-ncvar_get(ncFile1)
ncFile2 <- nc_open("C://file2.nc4")
nc2 <-ncvar_get(ncFile2)
transNcdfMerge(c(nc1, nc2), target.name = "my_test.nc4")
Я позволил ему работать в течение почти 2 часов, а затем я остановил бег. Поскольку я должен сделать это для сотен файлов nc4, я не могу ждать так долго. Не выкрикивал никаких ошибок во время работы, но я не уверен, что код правильный.
Я использую Windows 7, 64 бит, 8 Гб оперативной памяти. А для R - "R версии 3.3.0 (2016-05-03)"
Обновление: печать некоторых метаданных двух файлов с помощью R
1) file1.nc4
ncdf4::print(file1.nc4)
1 variables (excluding dimension variables):
float prop_crop[lon,lat,time] (Chunking: [720,360,1]) (Compression: shuffle,level 3)
units: percent
_FillValue: -9999
long_name: Proportion of landcover in crops
missing_value: -9999
3 dimensions:
lat Size:360
units: degrees_north
long_name: Latitude
standard_name: latitude
lon Size:720
units: degrees_east
long_name: Longitude
standard_name: longitude
time Size:306 *** is unlimited ***
long_name: Time
standard_name: time
calendar: proleptic_gregorian
units: years since 1700-01-01 00:00:00
2) file2.nc4
ncdf4::print(file2.nc4)
1 variables (excluding dimension variables):
float prop_crop[lon,lat,time] (Chunking: [720,360,1]) (Compression: shuffle,level 3)
units: percent
_FillValue: -9999
long_name: Proportion of landcover in crops
missing_value: -9999
3 dimensions:
lat Size:360
units: degrees_north
long_name: Latitude
standard_name: latitude
lon Size:720
units: degrees_east
long_name: Longitude
standard_name: longitude
time Size:96 *** is unlimited ***
units: years since 2005-01-01 00:00:00
long_name: Time
standard_name: time
calendar: proleptic_gregorian
Надеюсь, поможет
3 ответа
NCO требует, чтобы UDUnits выполнял арифметику даты (называемую "перебазирование") в руководстве. Предлагаем вам установить полнофункциональный NCO с, например,
conda install -c conda-forge nco
затем повторите вашу исходную команду.
Просто упомянуть, что если по какой-либо причине значения в 2005 году не совпадали в двух файлах, и один хотел сохранить перекрывающуюся часть из второго файла, а не из первого, можно было бы использовать seldate с CDO, чтобы вырезать соответствующая часть:
cdo mergetime -seldate,17000101,20041231 file1.nc4 file2.nc4 merged_file.nc
nco-4.6.0.windows.mvs.exe связан с UDunits. Чтобы проверить, попробуйте это
C:\nco>ncks -r
Вывод должен быть (обратите внимание на раздел UDunits). Что касается ошибки, которую вы получаете, для отладки вашей ошибки нам нужны либо исходные файлы, либо пример, созданный с помощью ncks / ncdump.
NCO netCDF Operators version "4.6.0" built by USER on HOSTNAME at May 12 2016 17:17:59
ncks version "4.6.0"
Linked to netCDF library version 4.3.2, compiled Feb 29 2016 01:53:06
Configuration Option: Active? Meaning or Reference:
Check _FillValue Yes http://nco.sf.net/nco.html#mss_val
Check missing_value No http://nco.sf.net/nco.html#mss_val
DAP clients Yes http://nco.sf.net/nco.html#dap
Debugging: Custom No Pedantic, bounds checking (slowest execution)
Debugging: Symbols No Produce symbols for debuggers (e.g., dbx, gdb)
ESMF Library No http://nco.sf.net/nco.html#esmf
GNU Scientific Library Yes http://nco.sf.net/nco.html#gsl
HDF4 support Unknown http://nco.sf.net/nco.html#hdf4
Internationalization No http://nco.sf.net/nco.html#i18n (pre-alpha)
MPI parallelization No http://nco.sf.net/nco.html#mpi (beta)
netCDF3 64-bit files Yes http://nco.sf.net/nco.html#lfs
netCDF4/HDF5 available Yes http://nco.sf.net/nco.html#nco4
netCDF4/HDF5 enabled Yes http://nco.sf.net/nco.html#nco4
OpenMP SMP threading No http://nco.sf.net/nco.html#omp
Optimization: run-time No Fastest execution possible (slowest compilation)
Parallel netCDF3 No http://nco.sf.net/nco.html#pnetcdf (pre-alpha)
Regular Expressions No http://nco.sf.net/nco.html#rx
Shared libraries built No Small, dynamically linked executables
Static libraries built No Large executables with private namespaces
UDUnits conversions Yes http://nco.sf.net/nco.html#udunits
UDUnits2 conversions Yes http://nco.sf.net/nco.html#udunits
Обратите внимание, что ваш файл должен содержать информацию о единицах измерения в атрибутах. Это пример файла, который содержит информацию о единицах для переменной 'lon', расположенной в группе 'g1'
netcdf in_grp {
group: g1 {
dimensions:
lon=4;
float lon(lon);
lon:units = "degrees_east";
data:
lon=0,90,180,270;
}
}
В дистрибутиве исходного кода NCO есть несколько примеров файлов, которые установлены в версии Windows NCO. Пытаться
C:\nco>ncks in_grp.nc -g g1 -v lon
/g1/lon
lon: type NC_FLOAT, 1 dimension, 1 attribute, compressed? no, chunked? no, packed? no
lon size (RAM) = 4*sizeof(NC_FLOAT) = 4*4 = 16 bytes
lon dimension 0: /lon, size = 4 NC_FLOAT (Coordinate is lon)
lon attribute 0: units, size = 12 NC_CHAR, value = degrees_east
/g1/lon
lon[0]=0 degrees_east
lon[1]=90 degrees_east
lon[2]=180 degrees_east
lon[3]=270 degrees_east