首页 > 解决方案 > 如何将浮点数组转换为 365 日历日间?(不包括闰年)

问题描述

我有一个nc文件,其中日单位已关闭。

<xarray.DataArray 'days' (time: 6570)>
array([730817., 730818., 730819., ..., 737384., 737385., 737386.])
Dimensions without coordinates: time
Attributes:
    units:      days_since_Jan11900
    long_name:  calendar_days

我想将这些转换为日期而不考虑闰年,因为我的数据是一年 365 天的日历,这意味着数据集中没有闰年之类的东西。我试过这个

ds['days'] = ds.days - 730817
ds.days.attrs['units'] = 'days since 2001-05-30'

但是,2004 年的闰年比前三年提前了一天。因此,它从 5 月 29 日开始,但这是不正确的,因为由于一年 365 天的日历,它实际上是 5 月 30 日。我想要的是我的时间单位不断显示从 2001 年 5 月 30 日到 8 月 18 日、2002 年 5 月 30 日到 2002 年 8 月 18 日等期间,即使在闰年也是如此。所以基本上用我的范围代替:

<xarray.DataArray 'days' (time: 6570)>
array([30-05-2001, 31-05-2001, ..., 18-08-2001, ..., 18-08-2015, 30-05-2016, ...,])

我怎样才能做到这一点?

编辑我现在尝试包含@spencerkclark 的方法。

ds['days'] = ds.days - 730817
ds.days.attrs['units'] = 'days since 2001-05-30'
ds['days'].attrs['calender'] = 'noleap'
ds = xr.decode_cf(ds)

但是,我仍然在闰年得到 2 月 29 日。因此,我的最后一个日期向后移动,2099-11-02而它应该保持在2099-12-31. 不幸的是,所以没有完全解决。

标签: pythonnumpynetcdfpython-xarray

解决方案


将日历属性添加到'days'坐标,xarray 会将假设'noleap'日历的时间解码为cftime.DatetimeNoLeap对象:

ds['days'].attrs['calendar'] = 'noleap'
ds = xr.decode_cf(ds)

推荐阅读