python 来自另一个xarray Dataset/DataArray的yearly idxmin()的输出的新xarray DataArray

gab6jxml  于 2023-06-28  发布在  Python
关注(0)|答案(1)|浏览(149)

我正在使用的xarray数据集是ERA-5数据,包含多年(1991-2020)的每日数据。我试图找出所有年份的第一天,当某个门槛被跨越时。我想将得到的30个DataArrays保存为一个DataArray或Dataset,并带有一个包含年份数值的坐标/维度年份。因此,结果将类似于如果我计算年平均值的结果,例如。

dsxr.groupby('time.year').mean()

在数据集“dsxr”中,变量“ends”包含值零,表示没有超过阈值,其他正值表示超过阈值。
如果我获取整个数据(包含所有年份),可以使用idxmin()方法在时间维度上检索一年中的第一天(DoY)。到目前为止,我一直在尝试将相同的逻辑应用于较小的数据集,每个数据集包含1年的数据。但是,我无法将(组合)结果保存为新的DataArray/Dataset。
下面是我到目前为止得到的代码。如何修改它,或使之更好,以便我得到一个新的DataArray/DataSet包含idxmin()的年度结果沿着维度“年”?

for year in range(1991, 2021):
    yr = str(year)
    hwt_da = dsxr.ends.sel(time=slice(yr,yr))  # Gets yearly subset of original dataset, dsxr, for the variable "ends" 
    dT = hwt_da.indexes['time'].strftime('%j').astype(int)  # Formats cftime to DoY as integers
    hwt_da['time'] = dT   # Assigns DoY as time
    hh = hwt_da.where(hwt_da>0).idxmin(dim='time').assign_coords({'year': year})  # Gets first DoY (idxmin()) when the threshold is above 0 
    if year == '1991':
        da = hh.copy()  # copy the first year's result
    else:
        xr.concat([da, hh], dim='year')  # Concatenates the rest year's results

循环x1c 0d1x得到的结果

uz75evzq

uz75evzq1#

我犯了个愚蠢的错误。我没有将串联数组赋给变量da。下面是更新后的代码。我还发现xr.nested_合并()方法也工作得很好。

if year == 1993:  # the year should be integer not string
    da = hh.copy()
else:
    da = xr.concat([da, hh], dim='year') # I was not storing the concatenated arrays in variable da
    # da = xr.combine_nested([da, hh], concat_dim='year') # this works too

相关问题