Как найти максимум по всем переменным, соответствующий максимуму в одной переменной? - PullRequest
0 голосов
/ 24 мая 2018

У меня есть 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( )

Trial

Я попробовал это

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

, что приводит к этой ошибке:

ValueError: All-NaN slice encountered

Как я могу это сделать?

1 Ответ

0 голосов
/ 24 мая 2018

Для операций такого типа вы, вероятно, захотите использовать пользовательскую функцию уменьшения:

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
...