当前位置: 首页 > 知识库问答 >
问题:

在netcdf文件中将所有变量和维度从int/float转换为double

冷宏茂
2023-03-14

我有一个netCDF文件。ncdump:

netcdf nc_data {
dimensions:
    lon = 1440 ;
    bounds = 2 ;
    lat = 720 ;
    time = UNLIMITED ; // (6 currently)
variables:
    double lon_bounds(lon, bounds) ;
    double lat_bounds(lat, bounds) ;
    int time(time) ;
        time:units = "year as %Y.%f" ;
        time:calendar = "proleptic_gregorian" ;
        time:long_name = "time" ;
        time:standard_name = "time" ;
        time:axis = "T" ;
    float lat(lat) ;
        lat:units = "degrees_north" ;
        lat:long_name = "latitude" ;
        lat:standard_name = "latitude" ;
        lat:axis = "Y" ;
        lat:bounds = "lat_bounds" ;
    float lon(lon) ;
        lon:units = "degrees_east" ;
        lon:long_name = "longitude" ;
        lon:standard_name = "longitude" ;
        lon:axis = "X" ;
        lon:bounds = "lon_bounds" ;
    float valf(time, lat, lon) ;
        valf: standard_name = “area_fraction”
        valf:missing_value = -9999.f ;
        valf:_fillvalue = -9999.f ;
        valf:long_name = "val fraction" ;
        valf:units = "fraction of grid cell" ;
}

是否有 nco 命令可以将 int/float 的所有变量和维度转换为双精度?

我发现了这个:

ncap2 -s 'valf=double(valf)' nc_data.nc nc_data.nc

然而,这一次只能处理一个变量,我的文件中有大约30个变量

共有1个答案

东方建修
2023-03-14

ncap2 可以优雅地做到这一点,尽管它需要当前的快照(即将成为 4.6.0)。请注意,自 NCO 版本 4.5.3 以来,您上面使用的命令不会更改输出文件中变量的类型,并且当前快照确实允许它工作。(ncap2 的临时版本要求输出变量具有与输入不同的名称才能更改其类型,例如 val_dbl=double(valf)。

重要的是,ncap2的当前快照理解变量列表。因此,您可以使用以下脚本创建某些变量的输出文件,并更改其名称:

@all=get_vars_in();
*sz=@all.size();

for(idx=0;idx<sz;idx++){

  @var_nm=sprint(@all(idx));

  if( *@var_nm.type() == NC_INT || *@var_nm.type() == NC_FLOAT )
   *@var_nm=*@var_nm.double();

}

不需要重命名变量。

 类似资料:
  • 我有一个 netcdf 数据文件,其中包含以下变量,显示在下面的 ncdump 代码段中: 我正在尝试从此文件中消除时间坐标变量,以便获得三维 netcdf 数据文件。基本上在netcdf文件中第一次拥有数据数据值,仅此而已。我试图用 ncks 完成此操作,这就是他们在进行谷歌搜索时显示我应该做的事情。我用 ncks 尝试了以下命令: 但我无法删除时间维度。我应该怎么做才能调整此命令以获得仅显示初

  • 问题内容: 我想将转换成斯威夫特。像这样的基本转换不起作用,因为这些类型不是基元,这与Objective-C中的s和s 不同 但这会产生以下错误消息: “浮点数”不可转换为“整数” 知道如何将属性从转换为吗? 问题答案: 您可以转换到斯威夫特这样的: 您还可以使用@paulm的注释来实现此结果:

  • 我想在Swift中将转换为。像这样的基本强制转换不起作用,因为这些类型不是原语,不像Objective-C中的s和s

  • 代码是这个答案确实有效,增加了一个新的维度,但是它没有做我想要它做的事情。 为了进一步说明我的问题 - 我有以下定义时间(无限),纬度,经度,水平为四个维度和一个可变的位势高度。我想做的是在现有的可变地势高度中添加一个维度dimz_Z。 现在,上面代码中的答案是 netCDF 文件在 ncdump 中的样子 但是dimz_Z维度不见了,如下所示,从nck的输出。 它确实出现在定义中,但作为一个独立

  • 所以,问题是--为什么在I=L的情况下,当L的大小足够小到适合I时,必须显式地进行,但在F=L的情况下,当L的大小也适合F时,铸造可以隐式地进行,而不会产生错误。 我的意思是,在这两种情况下,右操作数的大小可能不适合左操作数。那么,为什么在一种情况下(I=L),强制转换必须显式进行,而在另一种情况下(F=L)可以隐式进行呢?虽然隐式地将长var转换为int var比隐式地将长var转换为浮点var

  • 问题内容: 如果我正在使用,并将其转换为,则该如何正确工作?值会被截断以适合浮点数吗?还是舍入值不同?抱歉,这听起来有点补救,但是我正在尝试掌握和转换的概念。 问题答案: 根据 Java语言规范的 第5.1.3节 : 从double到float的原始转换变窄由IEEE 754舍入规则(第4.2.4节)控制。这种转换可能会失去精度,但也会失去范围,导致非零双精度浮点为零,而有限双精度浮点为无穷大。双