【问题标题】:xarray error when decoding netcdf data with time units of "years since"使用“自以来”的时间单位解码 netcdf 数据时出现 xarray 错误
【发布时间】:2021-02-13 21:05:22
【问题描述】:

我有一个 netcdf 文件,有人传给我,它使用“自 DATE 以来的年数”:

double time(time) ;
    time:standard_name = "time" ;
    time:long_name = "time" ;
    time:calendar = "proleptic_gregorian" ;
    time:axis = "T" ;
    time:units = "years since 2000-1-1 00:00:00" ;

当我尝试用 xarray 打开它时,我得到了错误:

ValueError: unable to decode time units 'years since 2000-1-1 00:00:00' with calendar 'proleptic_gregorian'. Try opening your dataset with decode_times=False.

我可以在 decode_times=False 时打开,但我无法分割时间。我发现将单位更改为“天数”解决了错误,但当然会弄乱时间轴(我只是用

覆盖了单位
ncatted -O -a units,time,m,c,"days since 2000-1-1 00:00:00" ./test.nc

作为测试,但没有更新实际时间变量值)

在 xarray 中打开单位为“年后”的 netcdf 数据文件有技巧吗?

【问题讨论】:

    标签: netcdf python-xarray


    【解决方案1】:

    我认为这是由于 xarray 无法始终正确解析时间,即使对于 CF 兼容文件也是如此。我认为不应该为此受到太多批评,因为能够解析所有内容并不是一件小事。

    但是,我的 nctoolkit 包中有一个解决方案。它有一个内置的to_xarray 方法。默认情况下,它使用 xarray 来解码时间。但是,对于 xarray 无法解码时间的情况,您可以使用 CDO 来完成:

    import nctoolkit as nc
    data = nc.open_data("infile.nc")
    ds = data.to_xarray(cdo_times = True)
    

    根据经验,CDO 能够或多或少地解码时间,因此这可能会解决您的问题。

    【讨论】:

    • 让我知道它是否有效。它仍然没有经过彻底的测试,因为这不是我经常遇到的问题
    • 无论如何我建议使用 xarray。
    • 如果您有建设性的内容要添加,请添加 xarray 仅回答问题
    【解决方案2】:

    问题是'years since 2000-1-1 00:00:00' 不是cftime 模块接受的单元。试图解析说:

    单位必须是“秒”、“分钟”、“小时”或“天”(或这些的单数版本)之一,得到“年”

    我相信这是因为,如 CF Conventions 中所述,年(和月)不是日历单位,而是分别定义为 365.242198781 天和年/12。

    【讨论】:

    • 感谢您的澄清,这是有道理的 - 我会将消息传递回数据生成器,他们需要更新为 CF 约定。
    猜你喜欢
    • 2021-11-21
    • 2019-09-03
    • 1970-01-01
    • 1970-01-01
    • 2020-10-28
    • 1970-01-01
    • 1970-01-01
    • 2018-10-02
    • 1970-01-01
    相关资源
    最近更新 更多