2

我有一个包含许多变量的每日数据的 xarray。我想在最大值发生q_routed的那一天提取每年的最大值和其他变量的相应值。q_routed

    <xarray.Dataset>
    Dimensions:    (latitude: 1, longitude: 1, param_set: 1, time: 17167)
    Coordinates:
      * time       (time) datetime64[ns] 1970-01-01 ...
      * latitude   (latitude) float32 44.5118
      * longitude  (longitude) float32 -111.435
      * param_set  (param_set) |S1 b''
    Data variables:
        ppt        (time, param_set, latitude, longitude) float64 ...
        pet        (time, param_set, latitude, longitude) float64 ...
        obsq       (time, param_set, latitude, longitude) float64 ...
        q_routed   (time, param_set, latitude, longitude) float64 ...

下面的命令给了我一年中每个变量的最大值,但这不是我想要的。

ncdat['q_routed'].groupby('time.year').max( )

审判

我试过这个

ncdat.groupby('time.year').argmax('time')

这导致了这个错误:

ValueError: All-NaN slice encountered

我怎样才能做到这一点?

4

1 回答 1

1

对于这种操作,您可能需要使用自定义 reduce 函数:

def my_func(ds, dim=None):
    return ds.isel(**{dim: ds['q_routed'].argmax(dim)})


new = ncdat.groupby('time.year').apply(my_func, dim='time')

现在,argmax当您拥有完整的 nans 数组时效果不佳,因此您可能只想将此函数应用于具有数据的位置或预填充现有的 nans。像这样的东西可以工作:

mask = ncdat['q_routed'].isel(time=0).notnull()  # determine where you have valid data

ncdat2 = ncdat.fillna(-9999)  # fill nans with a missing flag of some kind
new = ncdat2.groupby('time.year').apply(my_func, dim='time').where(mask)  # do the groupby operation/reduction and reapply the mask
于 2018-05-24T00:59:14.990 回答