微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何更正Xarray数据集中的坐标元数据属性如时间日历?

如何解决如何更正Xarray数据集中的坐标元数据属性如时间日历?

不幸的是,我正在读入xarray的NetCDF文件在指定为gregorian_proleptic而不是CF标准proleptic_gregorian的时间坐标上具有calendar属性

我该如何解决

我尝试仅更改属性,但是xarray必须将元数据保存在我需要修改的其他位置,因为当我尝试使用decode_cf时,它仍然认为日历为gregorian_proleptic。这是我尝试过的:

import xarray as xr
import fsspec

url='s3://noaa-ofs-pds/dbofs.20200826/nos.dbofs.fields.f044.20200826.t06z.nc'
ncfile = fsspec.open(url)
ds = xr.open_dataset(ncfile.open(),decode_times=False)

ds.ocean_time.attrs['calendar']='proleptic_gregorian'

xr.decode_cf(ds,decode_times=True)

产生:

---------------------------------------------------------------------------
OutOfBoundsDatetime                       Traceback (most recent call last)
/srv/conda/envs/notebook/lib/python3.7/site-packages/xarray/coding/times.py in decode_cf_datetime(num_dates,units,calendar,use_cftime)
    157         try:
--> 158             dates = _decode_datetime_with_pandas(flat_num_dates,calendar)
    159         except (KeyError,OutOfBoundsDatetime,OverflowError):

/srv/conda/envs/notebook/lib/python3.7/site-packages/xarray/coding/times.py in _decode_datetime_with_pandas(flat_num_dates,calendar)
    105             "Cannot decode times from a non-standard calendar,{!r},using "
--> 106             "pandas.".format(calendar)
    107         )

OutOfBoundsDatetime: Cannot decode times from a non-standard calendar,'gregorian_proleptic',using pandas.

During handling of the above exception,another exception occurred:

KeyError                                  Traceback (most recent call last)
/srv/conda/envs/notebook/lib/python3.7/site-packages/xarray/coding/times.py in _decode_cf_datetime_dtype(data,use_cftime)
     76     try:
---> 77         result = decode_cf_datetime(example_value,use_cftime)
     78     except Exception:

/srv/conda/envs/notebook/lib/python3.7/site-packages/xarray/coding/times.py in decode_cf_datetime(num_dates,use_cftime)
    160             dates = _decode_datetime_with_cftime(
--> 161                 flat_num_dates.astype(float),calendar
    162             )

/srv/conda/envs/notebook/lib/python3.7/site-packages/xarray/coding/times.py in _decode_datetime_with_cftime(num_dates,calendar)
     97     return np.asarray(
---> 98         cftime.num2date(num_dates,only_use_cftime_datetimes=True)
     99     )

cftime/_cftime.pyx in cftime._cftime.num2date()

cftime/_cftime.pyx in cftime._cftime.to_calendar_specific_datetime()

KeyError: 'gregorian_proleptic'

During handling of the above exception,another exception occurred:

ValueError                                Traceback (most recent call last)
<ipython-input-41-174237fc09de> in <module>
----> 1 xr.decode_cf(ds,decode_times=True)

/srv/conda/envs/notebook/lib/python3.7/site-packages/xarray/conventions.py in decode_cf(obj,concat_characters,mask_and_scale,decode_times,decode_coords,drop_variables,use_cftime,decode_timedelta)
    594         drop_variables=drop_variables,595         use_cftime=use_cftime,--> 596         decode_timedelta=decode_timedelta,597     )
    598     ds = Dataset(vars,attrs=attrs)

/srv/conda/envs/notebook/lib/python3.7/site-packages/xarray/conventions.py in decode_cf_variables(variables,attributes,decode_timedelta)
    496             stack_char_dim=stack_char_dim,497             use_cftime=use_cftime,--> 498             decode_timedelta=decode_timedelta,499         )
    500         if decode_coords:

/srv/conda/envs/notebook/lib/python3.7/site-packages/xarray/conventions.py in decode_cf_variable(name,var,decode_endianness,stack_char_dim,decode_timedelta)
    336         var = times.CFtimedeltaCoder().decode(var,name=name)
    337     if decode_times:
--> 338         var = times.CFDatetimeCoder(use_cftime=use_cftime).decode(var,name=name)
    339 
    340     dimensions,data,encoding = variables.unpack_for_decoding(var)

/srv/conda/envs/notebook/lib/python3.7/site-packages/xarray/coding/times.py in decode(self,variable,name)
    425             units = pop_to(attrs,encoding,"units")
    426             calendar = pop_to(attrs,"calendar")
--> 427             dtype = _decode_cf_datetime_dtype(data,self.use_cftime)
    428             transform = partial(
    429                 decode_cf_datetime,/srv/conda/envs/notebook/lib/python3.7/site-packages/xarray/coding/times.py in _decode_cf_datetime_dtype(data,use_cftime)
     85             "if it is not installed."
     86         )
---> 87         raise ValueError(msg)
     88     else:
     89         dtype = getattr(result,"dtype",np.dtype("object"))

ValueError: unable to decode time units 'days since 2016-01-01 00:00:00' with "calendar 'gregorian_proleptic'". Try opening your dataset with decode_times=False or installing cftime if it is not installed.

如果有用的话,这里是full notebook

解决方法

有问题的数据集中还有另一个非坐标变量(dstart),该变量也具有错误的gregorian_proleptic日历属性。

如果设置正确:

ds.dstart.attrs['calendar']='proleptic_gregorian'
xr.decode_cf(ds,decode_times=True)

cf解码将起作用。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。