解码netcdf数据时单位为“ years since”的xarray错误

问题描述

我有一个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中打开单位为“ years since”的netcdf数据文件

解决方法

我认为这是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能够解码或多或少地解码时间,因此这可能会解决您的问题。

,

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

单位必须是“秒”,“分钟”,“小时”或“天”(或单数形式)之一,必须为“年”

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