python xarray concat groupby в измерениях datetime64
У меня есть набор данных xarray, который:
ds
<xarray.Dataset>
Dimensions: (lat: 360, lon: 720, time: 3652)
Coordinates:
* lon (lon) float32 -179.75 -179.25 -178.75 -178.25 -177.75 -177.25 ...
* lat (lat) float32 89.75 89.25 88.75 88.25 87.75 87.25 86.75 86.25 ...
* time (time) datetime64[ns] 2010-01-01 2010-01-02 2010-01-03 ...
Data variables:
dis (time, lat, lon) float64 nan nan nan nan nan nan nan nan nan...
В переменной dis есть nans, но весь массив не nans. Длина времени измерения соответствует 10 годам ежедневных данных (3652 дня).
То, что я хочу сделать, это получить ежемесячные средние за 10-летнюю серию, за каждый месяц и каждый квадрат сетки (широта, долгота). Таким образом, выходной набор данных будет:
Dimensions: (lat: 360, lon: 720, time: 12) #<<< or 'months'
Один вариант, который я увидел, который почти делает то, что я хочу, это:
ds.dis.groupby('time.month').mean()
Однако на выходе это просто массив из 12 элементов. т.е. мы теряем как широту, так и долготу.
<xarray.DataArray 'dis' (month: 12)>
array([ 368.26764123, 394.0543304 , 424.67056092, 476.94943773,
522.383195 , 516.37355647, 497.74700652, 472.46993274,
456.87268206, 402.44729131, 367.41928436, 362.6121917 ])
Coordinates:
* month (month) int64 1 2 3 4 5 6 7 8 9 10 11 12
Я полагаю, что, возможно, существуют простые способы сделать это с помощью методов datetime64, но я изо всех сил пытался понять их.
Увы, пока я писал это, мне удалось:
stacked = xr.concat([ds.dis[tlist[month,:],:,:].mean(dim='time',skipna=True) for month in range(0,12)],dim='month')
который дает:
<xarray.DataArray 'dis' (month: 12, lat: 360, lon: 720)>
Тем не менее, есть ли еще один более питонический способ в большей степени в соответствии с первой строкой кода с использованием groupby?
Спасибо
1 ответ
Чтобы избежать агрегирования по всем измерениям в каждом под-массиве, необходимо явно указать список измерений:
ds.dis.groupby('time.month').mean('time')
(В какой-то момент мы рассматривали вопрос о том, чтобы сделать это поведением по умолчанию для групповых операций, так как это обычно то, что нужно, но тогда не ясно, как вызвать текущее значение по умолчанию для суммирования по всем измерениям.)