Операция вместе год с xarray - PullRequest
0 голосов
/ 24 мая 2018

Я хотел бы выполнить среднее (и квантили) по годам на xarray.

Если выборка по времени равна нескольким дням, я могу легко сделать что-то подобное:

arr.groupby('time.dayofyear').mean('time')

Но я не могу найти простой способ сделать то же самое, если у меня есть такжеч.(Сейчас я использую ужасный трюк).

Например, в этом случае:

import numpy as np
import pandas as pd
import xarray as xr

time = pd.date_range('2000-01-01', '2010-01-01', freq='6h')
arr = xr.DataArray(
     np.ones(len(time)), 
     dims='time', 
     coords={'time' : ('time', time)}
)

Возможно, я что-то упускаю, я не очень разбираюсь в пандах и ксарри.У вас есть несколько советов?

Большое спасибо.

Ответы [ 3 ]

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

Если вы хотите среднесуточные значения, resample - лучший инструмент для работы:

daily = arr.resample(time='D').mean('time')

Затем вы можете использовать groupby для вычисления квантилей для каждого дня года:

quantiles_by_dayofyear = daily.groupby('time.dayofyear').apply(
    xr.DataArray.quantile, q=[0.25, 0.5, 0.75])

print(quantiles_by_dayofyear)

Выход:

<xarray.DataArray (dayofyear: 366, quantile: 3)>
array([[1., 1., 1.],
       [1., 1., 1.],
       [1., 1., 1.],
       ...,
       [1., 1., 1.],
       [1., 1., 1.],
       [1., 1., 1.]])
Coordinates:
  * quantile   (quantile) float64 0.25 0.5 0.75
  * dayofyear  (dayofyear) int64 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ...

Вероятно, мы должны добавить метод квантили в список методов группового сокращения xarray, но пока это должно работать.

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

Извините, возможно, мой вопрос был неясен.Рассмотрим только квантили.Мой ожидаемый результат примерно такой:

<xarray.DataArray (hours: 1464, quantile: 3)>
array([[1., 1., 1.],
      [1., 1., 1.],
      [1., 1., 1.],
      ...,
      [1., 1., 1.],
      [1., 1., 1.],
      [1., 1., 1.]])
Coordinates:
* quantile   (quantile) float64 0.25 0.5 0.75
* hours  (hours) int64 6 12 18 24 30 36 42 48 54 60 66 72 ...

Где часы - это часы с начала года.Но вместо часов может быть хорошо и что-то вроде мультииндекс с dayofyear и hour (of day).У меня есть хитрый способ сделать это (выполнить некоторую переиндексацию с помощью мультииндексации и развернуть измерение времени), но это действительно ужасно.Я думаю, что есть более простой и элегантный способ сделать это.

Большое спасибо.

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

Для среднесуточного я бы предложил использовать функцию повторной выборки.Если я правильно понял вопрос, это должно дать вам среднесуточные значения.Затем вы можете использовать эти среднесуточные значения для вычисления вашей групповой дневной операции.

import numpy as np
import pandas as pd
import xarray as xr

time = pd.date_range('2000-01-01', '2010-01-01', freq='6h')
arr = xr.DataArray(
     np.ones(len(time)), 
     dims='time', 
     coords={'time' : ('time', time)}
)

daily = arr.resample(time='D').mean('time')
...