代码之家  ›  专栏  ›  技术社区  ›  shamalaia

重命名netcdf文件中的维度

  •  0
  • shamalaia  · 技术社区  · 6 年前

    我是个初学者 nco 我希望能得到一些关于我工作流程的建议,以及一些帮助我解决困难的问题。

    我有 these data 包含两个不同时间步的三维盐度值:

    dimensions:
        t = 780 ;
        z = 54 ;
        y = 450 ;
        x = 3600 ;
    variables:
        double time(t) ;
            time:units = "days since 1-1-1 00:00:0.0" ;
        float level(z) ;
            level:units = "[m]" ;
        float lat(y) ;
        float lon(x) ;
        float salt(x, y, z) ;
            salt:units = "psu * 1000 + 35" ;
            salt:missingvalue = "-1.0E34" ;
            salt:longname = "salinity" ;
    

    我想连接两个netcdf文件。

    为此,我首先使用 ncecat *.nc -O merged.nc :

    dimensions:
        record = UNLIMITED ; // (2 currently)
        t = 780 ;
        z = 54 ;
        y = 450 ;
        x = 3600 ;
    variables:
        double time(record, t) ;
            time:units = "days since 1-1-1 00:00:0.0" ;
        float level(record, z) ;
            level:units = "[m]" ;
        float lat(record, y) ;
        float lon(record, x) ;
        float salt(record, x, y, z) ;
            salt:units = "psu * 1000 + 35" ;
            salt:missingvalue = "-1.0E34" ;
            salt:longname = "salinity" ;
    

    现在变量 time 和维度 t 都是假的。所以,我用 ncks -O -x -v time merged.nc merged.nc :

        record = UNLIMITED ; // (2 currently)
        y = 450 ;
        z = 54 ;
        x = 3600 ;
    variables:
        float lat(record, y) ;
        float level(record, z) ;
            level:units = "[m]" ;
        float lon(record, x) ;
        float salt(record, x, y, z) ;
            salt:units = "psu * 1000 + 35" ;
            salt:missingvalue = "-1.0E34" ;
            salt:longname = "salinity" ;
    

    现在,我要重命名维度 record 用: ncrename -d record,time merged.nc . 命令运行时没有错误或警告。但当我这么做的时候 ncdump -h merged.nc 我明白了 错误 :

    ncdump:merged.nc:netcdf:hdf错误

    这是什么意思?我在哪里做错了?

    编辑

    根据发布的答案 Charlie Zender

    ncecat -O -u time *.nc merged.nc
    ncks -O -x -v time merged.nc merged.nc
    

    导致:

    dimensions:
        time = UNLIMITED ; // (2 currently)
        y = 450 ;
        z = 54 ;
        x = 3600 ;
        t = 780 ;
    variables:
        float lat(time, y) ;
        float level(time, z) ;
            level:units = "[m]" ;
        float lon(time, x) ;
        float salt(time, x, y, z) ;
            salt:units = "psu * 1000 + 35" ;
            salt:missingvalue = "-1.0E34" ;
            salt:longname = "salinity" ;
        double time(time, t) ;
            time:units = "days since 1-1-1 00:00:0.0" ;
    
    // global attributes:
            :history = "Tue Jun  5 09:08:25 2018: ncks -O -x -v time merged.nc merged.nc\nTue Jun  5 09:08:19 2018: ncecat -O -u time OFES_salt_mmean_607.nc OFES_salt_mmean_608.nc merged.nc" ;
            :NCO = "netCDF Operators version 4.7.4 (http://nco.sf.net)" ;
            :nco_openmp_thread_number = 1 ;
    
    1 回复  |  直到 6 年前
        1
  •  4
  •   Charlie Zender    6 年前

    首先,我推荐的命令是

    ncecat -O -u time *.nc merged.nc
    

    这样就不需要重命名 record time . 然后

    ncks -O -x -v time merged.nc merged.nc
    

    这样行吗?

    编辑问题的答案:

    关于ncrename接收到的错误,您可能遇到了下面描述的netcdf4库错误 here . 建议的解决方案是转换为netcdf3,重命名,然后根据需要转换回netcdf4:

    ncks -3 in.nc out.nc
    ncrename -d record,time out.nc
    ncks -4 out.nc out.nc