усреднение данных за 2 десятилетия по 6-часовому временному шагу с использованием данных netcdf и python - PullRequest
2 голосов
/ 06 мая 2019

У меня есть два десятилетия пространственно-переменных данных ветра, записанных с шестичасовыми интервалами. Мне нужно усреднить данные за два десятилетия за каждый шестичасовой интервал времени, поэтому я получаю 365 * 4 временных шага. Данные в формате netcdf.

Вот как выглядят данные:

import xarray as xr
filename = 'V-01011999-01012019.nc'
ds = xr.open_dataset(filename)

print(ds)
<xarray.Dataset>
Dimensions:  (lat: 8, lon: 7, time: 29221)
Coordinates:
  * lat      (lat) float32 -2.5 -5.0 -7.5 -10.0 -12.5 -15.0 -17.5 -20.0
  * lon      (lon) float32 130.0 132.5 135.0 137.5 140.0 142.5 145.0
  * time     (time) datetime64[ns] 1999-01-01 1999-01-01T06:00:00 .. 2019-01-01
Data variables:
vwnd     (time, lat, lon) float32 ...

#remove feb 29 from records
ds = ds.sel(time=~((ds.time.dt.month == 2) & (ds.time.dt.day == 29)))

Мне удалось сгруппировать по дням года, чтобы получить среднее значение по декаде в году.

tsavg = ds.groupby('time.dayofyear').mean('time')

print(tsavg)
<xarray.Dataset>
Dimensions:    (dayofyear: 366, lat: 8, lon: 7)
Coordinates:
  * lat        (lat) float32 -2.5 -5.0 -7.5 -10.0 -12.5 -15.0 -17.5 -20.0
  * lon        (lon) float32 130.0 132.5 135.0 137.5 140.0 142.5 145.0
  * dayofyear  (dayofyear) int64 1 2 3 4 5 6 7 8 ... 360 361 362 363 364 365 366
Data variables:
    vwnd       (dayofyear, lat, lon) float32 -2.61605 -1.49012 ... -0.959997

Что мне действительно нужно, так это временная координата длиной 365 * 4 (интервалы 4 x 6 часов в день), причем каждый временной шаг является средним значением за последние 20 лет для этого временного шага. Кроме того, по какой-то причине длина tsavg.dayofyear по-прежнему составляет 366, хотя я удалил 29 февраля. Я не мог подать заявку или подписаться на ответы этого поста . Я тщательно изучил ресурсы groupby и перепробовал столько всего, но не могу понять. Мне нужна помощь с кодированием.

1 Ответ

0 голосов
/ 06 мая 2019

Действительно, не очень хорошо документированный способ сделать это.Также обратите внимание, что dayofyear может не соответствовать ожидаемому .

Вместо возможности использовать groupby с несколькими уровнями (например, см. этот ответ относительно того, как сделать что-то похожее на то, что вы спрашиваете в пандах), который пока недоступенВ xarray достаточно чистый способ решения этой проблемы - определить новую координату для группировки, которая представляет «время года» для каждого времени в вашем наборе данных.

В вашем случае вы хотите сгруппировать по «часу года» (т. Е. По месяцу, дню и часу).Для этого вы можете создать массив строк, которые в основном представляют собой строковые представления дат во временной координате с отброшенными годами:

ds['hourofyear'] = xr.DataArray(ds.indexes['time'].strftime('%m-%d %H'), coords=ds.time.coords)
result = ds.groupby('hourofyear').mean('time')
...