Xarray Pandas dayofyear 产生不正确的闰年维度

Xarray Pandas dayofyear producing incorrect dimensions with leap years

我正在尝试使用 xarray 将每小时的气候数据汇总为年度文件的每日平均值。但是,我将它们分开 'Water year' 而不是日历年 - 从 10 月 1 日到 9 月 30 日。

当我尝试使用 'groupby(.dayofyear)' 方法时,它会生成不正确的 'dayofyear' 水年维度,其中开始日期或结束日期都在实际的闰年内。

例如,对于跨越闰日的水年 2000 (10/01/1999 - 09/30/2000),生成的代码生成大小为 365 而不是 366 的 dayofyear 维度。 2001 年 (10/01/2000 - 09/30/2001),不跨越闰日,它生成不正确的维度大小 366 而不是 365。

我确定我可以从头开始构建数组,但我希望有一个内置函数或其他简单方法来解决这个问题。

new_array['TMEAN'] = d['T2'].groupby('XTIME.dayofyear').mean(dim='Time')

没问题 - 这是使用 resample 执行此操作的简短示例。我们将首先构建一个与您的结构相似的 DataArray。

import numpy as np
import pandas as pd
import xarray as xr

ntimes = 24000
time = np.arange(ntimes)
times = xr.DataArray(pd.date_range('2000', periods=ntimes, freq='H'))
xtime = xr.DataArray(times, dims=['time'], coords=[time], name='XTIME')
da = xr.DataArray(np.random.random(ntimes), dims=['time'], coords=[time], name='T2')
da['XTIME'] = xtime

这里 da 由名为 'time' 的维度索引,具有整数坐标。它还有一个名为 'XTIME':

的日期时间坐标
<xarray.DataArray 'T2' (time: 24000)>
array([0.285948, 0.046776, 0.0814  , ..., 0.47595 , 0.241202, 0.453325])
Coordinates:
  * time     (time) int64 0 1 2 3 4 5 6 ... 23994 23995 23996 23997 23998 23999
    XTIME    (time) datetime64[ns] 1999-01-01 ... 2001-09-26T23:00:00

要使用resample,我们需要在DataArray 中使'XTIME' 成为维度坐标,而不是'time'。一个有用的方法是 swap_dims:

result = da.swap_dims({'time': 'XTIME'}).resample(XTIME='D').mean()

result 然后看起来像:

<xarray.DataArray 'T2' (XTIME: 1000)>
array([0.487798, 0.422622, 0.497371, ..., 0.487836, 0.500065, 0.482849])
Coordinates:
  * XTIME    (XTIME) datetime64[ns] 1999-01-01 1999-01-02 ... 2001-09-26

然后,如果我理解正确的话,把东西分成 "water years" 只是子集 result 的问题,例如:

water_year_2000 = result.sel(XTIME=slice('1999-10-01', '2000-09-30'))