【问题标题】:Removing leap day from leap years in xarray dataset从 xarray 数据集中的闰年中删除闰日
【发布时间】:2019-04-21 21:36:24
【问题描述】:

我在 xarray 数据集中加载了 Netcdf 文件,我想制作没有闰日的每日气候学,即不包括 2 月 29 日。我正在尝试syntaxDataset.drop 方法对我来说不是那么直观。这是数据集

print(ds)
>><xarray.Dataset>
Dimensions:        (lat: 1, lev: 1, lon: 720, time: 27133)
Coordinates:
* lon            (lon) float32 -180.0 -179.5 -179.0 ... 178.5 179.0 179.5
* lev            (lev) float32 1.0
* time           (time) datetime64[ns] 2000-01-02T18:00:00 ... 2018-07-30
Dimensions without coordinates: lat
Data variables:
Var1              (time, lev, lon) float32 ...
Var2              (time, lat, lon) float64 ...
Var3              (time, lat, lon) float64 ...

我试过了

ds_N_R.drop(['Var1', 'Var2', 'Var3'], time='2000-02-29')
>>TypeError: drop() got an unexpected keyword argument 'time'
##another approach
ds_N_R.sel(time='2000-02-29').drop(['Var1', 'Var2', 'Var3'])
## gives not the result I intended
<xarray.Dataset>
Dimensions:  (lev: 1, lon: 720, time: 4)
Coordinates:
* lon      (lon) float32 -180.0 -179.5 -179.0 -178.5 ... 178.5 179.0 179.5
* lev      (lev) float32 1.0
* time     (time) datetime64[ns] 2000-02-29 ... 2000-02-29T18:00:00
Data variables:
*empty*

我该如何继续?很高兴知道是否有一种直接的方法可以让我仅考虑一年中的 365 天来计算每日气候,但我也想知道如何在需要时从特定时间步长中删除数据。

【问题讨论】:

    标签: python python-xarray


    【解决方案1】:

    在这里使用drop() 的正确方法是: ds_N_R.drop([np.datetime64('2000-02-29')], dim='time')

    但我认为这实际上可以通过索引操作更干净地完成,例如, ds_N_R.sel(time=~((ds_N_R.time.dt.month == 2) &amp; (ds_N_R.time.dt.day == 29)))

    【讨论】:

    • drop 方法仅从 '2002-02-29' 中删除第一个时间步,并为当天保留其他 3 个时间步。但是,您建议的“sel”方法非常棒。我自己无法弄清楚使用'time.dt.month'而不是'time.month',因为'time'是一个数据数组。我发现有点令人沮丧的是,我需要多次尝试才能获得新函数的正确语法。我尝试阅读函数的源代码,但似乎我需要更多的时间和精力才能很好地掌握函数的源代码。
    • 我可以举一个例子来说明我上面提到的语法对我来说不是直观的。例如,当我使用“分组依据”来计算气候学时,它可以在不使用“time.dt”的情况下工作。 ds.groupby('time.day').mean(dim='time') 并且实际上 'time.dt.day' 给出了一个错误,但是,当使用 'sel' 方法时,'time.month' 给出了一个错误。
    • 您上面建议的“sel”方法从 2 月 29 日开始删除时间步,但是当我计算每日气候学时,我的时间轴再次具有 366 个值而不是 365。“Var1_updated”与主要时间步相比少了 20 个时间步数组,我的数据的时间范围为 2000-2018。为了计算每日气候,我使用 daily_clim = Var1_updated.groupby('time.dayofyear').mean(dim='time')。它给了我 。然后我认为 'dayofyear' = 60(闰日)上的值应该是 Nan 数组,但我很惊讶地发现事实并非如此。
    • 请注意,dayofyear 属性表示“序数日”,在 pandas 中定义为“自上一年 12 月 31 日以来的天数”。因此,所有年份都将包含一个序号为 60 的日期;在非闰年,这个日期是 3 月 1 日,而在闰年,这个日期是 2 月 29 日。如果我正确理解您的预期用例(每日气候,即按“匹配月份和日期编号”分组),我想您可能会对this GitHub issue 中的讨论感兴趣。
    • pandas 中的解决方案非常好。我认为通过在 xarray 中添加多参数 groupby 可以实现类似的事情(请参阅一些针对 here 的初步工作)。由于broader re-envisioning of MultiIndex support,这方面的进展有所延迟,但可以肯定的是它在雷达上。
    猜你喜欢
    • 2016-04-30
    • 1970-01-01
    • 1970-01-01
    • 2019-07-18
    • 2019-01-06
    • 2022-11-29
    • 1970-01-01
    • 2017-10-04
    • 1970-01-01
    相关资源
    最近更新 更多