使用CDO mergetime合并nc文件报NetCDF数值转换不可表示错误
报错产生原因
该报错本质是NetCDF库在做数值类型转换时,待写入的数值超出了目标数据类型可表示的数值范围,在cdo mergetime场景下,触发该问题的高频原因有三个:
- 各输入NetCDF文件的时间坐标基准、时间单位不统一。比如部分文件时间单位是
days since 1979-01-01,部分是hours since 1800-01-01,CDO合并时自动做时间坐标对齐转换,转换后的时间值超出了时间变量默认存储类型的数值上限,触发溢出。 - 同名变量的存储属性不统一。比如同一个变量在部分文件中是带
scale_factor、add_offset属性的16位整型存储,在其他文件中是32位浮点存储,合并时做变量类型映射时出现数值溢出。 - 单个源文件存在损坏或非法值,比如某一文件的时间坐标存在NaN、无效时间戳,或者变量值存在超出类型范围的极值,读取转换阶段就会抛出该错误。
解决步骤
按以下顺序排查修复,基本可以覆盖所有触发场景:
- 先统一所有源文件的时间基准和单位
首先逐个核对四个文件的时间属性,执行以下命令查看每个文件的时间单位:ncdump -h 1979-1982.nc | grep "time:units"
四个文件重复执行上述命令,若输出的时间基准、单位不一致,先对每个文件做统一处理,比如统一为常用的hours since 1900-01-01 00:00:00基准,单文件处理命令示例:cdo settunits,hours -setreftime,1900-01-01,00:00:00 1979-1982.nc tmp_1979-1982.nc
其余三个文件替换文件名依次执行即可。 - 合并时指定输出数据精度,避免变量类型转换溢出
处理完时间基准后,不要直接用默认精度合并,指定输出为32位浮点型,规避不同文件scale/offset规则不一致导致的类型转换问题,合并命令:cdo -b F32 mergetime tmp_*.nc merged_file.nc
注意:执行合并前务必先清理目录下之前生成失败残留的merged_file.nc文件,避免通配符*.nc把残留的输出文件也纳入输入列表,引发额外错误 - 若上述操作后仍报错,逐个校验源文件完整性
对四个源文件分别执行信息打印命令,定位存在异常的文件:cdo info 1979-1982.nc
若某一文件执行该命令时就抛出错误,说明该文件本身存在损坏、时间轴错乱或异常极值,单独修复该文件(比如用cdo settaxis重设正确时间轴、用cdo setmissval标记异常值为缺省)后再重新参与合并。
内容的提问来源于stack exchange,提问作者los
相关产品推荐
相关产品推荐

