1

假设有两个 netCDF 文件(在我的例子中是 nc4),每个变量都有 3 个维度:纬度、经度和时间(年)。它们具有不同的时间跨度(例如 1700-2005 和 2005-2100 - 它们在 2005 年重叠)。如何连接它们以获得一个跨越 1700-2100 的 nc4 文件?

简单地尝试 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 ...索引在这里不太重要,因为我收到了每个索引的警告)

请注意,我可以在没有时间跨度问题的情况下与Linux上的CDOcdo mergetime file1.cn4 file2.nc4 result.nc4连接:(或cdo -z zip_3 mergetime file1.cn4 file2.nc4 result.nc4获得 3 级压缩)。另请注意,为了处理重叠的 2005 年,我必须export SKIP_SAME_TIME=1在调用之前使用(仅第一次出现)。cdo mergetime

使用 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 位、8Gb RAM。对于 R -“R 版本 3.3.0 (2016-05-03)”

更新:用 R 打印这两个文件的一些元数据

1)文件1.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)文件2.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

希望能帮助到你

4

3 回答 3

3

NCO 要求 UDUnits 执行手册中的日期算术(称为“变基”)。建议您安装一个功能齐全的 NCO,例如,

conda install -c conda-forge nco

然后重试您的原始命令。

于 2016-07-06T22:09:06.363 回答
2

顺便提一下,如果由于任何原因,两个文件中 2005 年的值不一致,并且想要保留第二个文件而不是第一个文件中的重叠部分,则可以将 seldate 与 CDO 一起使用以删除相关部分:

cdo mergetime -seldate,17000101,20041231 file1.nc4 file2.nc4 merged_file.nc
于 2017-05-31T12:35:56.343 回答
1

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

请注意,您的文件必须在属性中包含单位信息。这是一个文件的示例,该文件具有位于组“g1”中的变量“lon”的单位信息

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
于 2016-07-16T22:00:40.837 回答