【问题标题】:How to convert array of float into 365-calendar daytime? (excluding leap year)如何将浮点数组转换为 365 日历日间? (不包括闰年)
【发布时间】:2020-11-07 22:33:45
【问题描述】:

我有一个 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。不幸的是,所以没有完全修复。

【问题讨论】:

    标签: python numpy netcdf python-xarray


    【解决方案1】:

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

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

    【讨论】:

    • 如果我将ds['days'] = days.ds - 730966 + days since xxxx 与您的答案结合起来,ds.days 变量仍然包括每个闰年的 2 月 29 日。因此,我的最后一个日期是2099-11-02,但应该是`2099-12-31。你知道我做错了什么吗?而且,感谢@spencerkclark 的回答
    • 看起来您在上面的代码中可能拼错了“日历”:)。它应该以“ar”而不是“er”结尾。你能用正确的拼写再试一次吗?
    • 哈哈,真的!非常感谢@spencerkclark!这对我来说很重要,我已经为这个问题苦苦挣扎了太久。从心底里感谢你。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多