Xarray Pandas dayyyear производит неправильные размеры с високосными годами - PullRequest
0 голосов
/ 03 мая 2019

Я пытаюсь агрегировать почасовые климатические данные в среднесуточные значения для годовых файлов с помощью xarray. Однако я делю их на «Водный год» вместо календарного года - с 1 октября по 30 сентября.

Когда я пытаюсь использовать метод groupby (.dayofyear), он выдает неверное измерение «dayofyear» для водяных лет, когда либо начальная, либо конечная дата попадают в фактический високосный год.

Например, для водного года 2000 (01.10.1999 - 30.09.2000), который охватывает високосную дату, результирующий код создает размерность в течение года размером 365 вместо 366. При выполнении водного года 2001 (01.10.2000 - 30.09.2001), который не охватывает високосную дату, он создает неверный размер измерения 366 вместо 365.

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

new_array['TMEAN'] = d['T2'].groupby('XTIME.dayofyear').mean(dim='Time')

1 Ответ

1 голос
/ 06 мая 2019

Конечно - вот короткий пример использования resample для этого. Сначала мы создадим DataArray, который имеет структуру, аналогичную вашей.

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

ntimes = 24000
time = np.arange(ntimes)
times = xr.DataArray(pd.date_range('2000', periods=ntimes, freq='H'))
xtime = xr.DataArray(times, dims=['time'], coords=[time], name='XTIME')
da = xr.DataArray(np.random.random(ntimes), dims=['time'], coords=[time], name='T2')
da['XTIME'] = xtime

Здесь da индексируется измерением с именем 'time' с целочисленной координатой. У этого также есть координата даты и времени, названная 'XTIME':

<xarray.DataArray 'T2' (time: 24000)>
array([0.285948, 0.046776, 0.0814  , ..., 0.47595 , 0.241202, 0.453325])
Coordinates:
  * time     (time) int64 0 1 2 3 4 5 6 ... 23994 23995 23996 23997 23998 23999
    XTIME    (time) datetime64[ns] 1999-01-01 ... 2001-09-26T23:00:00

Чтобы использовать resample, нам нужно сделать 'XTIME' координату измерения в массиве данных вместо 'time'. Полезный метод для этого: swap_dims:

result = da.swap_dims({'time': 'XTIME'}).resample(XTIME='D').mean()

result тогда выглядит так:

<xarray.DataArray 'T2' (XTIME: 1000)>
array([0.487798, 0.422622, 0.497371, ..., 0.487836, 0.500065, 0.482849])
Coordinates:
  * XTIME    (XTIME) datetime64[ns] 1999-01-01 1999-01-02 ... 2001-09-26

Тогда, если я правильно понимаю вещи, разделение вещей на "водные годы" - это просто вопрос поднабора result, например ::

water_year_2000 = result.sel(XTIME=slice('1999-10-01', '2000-09-30'))
...