Повторная выборка набора данных xarray до годовой частоты, используя только зимние данные

У меня есть набор данных, который состоит из ежедневных метеорологических данных с координатной сеткой x, y за несколько лет. Меня интересует вычисление среднегодовых значений только зимних данных, т.е. не считая и летних данных.

Я думаю, что мне нужно использовать команду resample, например, частота AS-OCT для пересчета временных рядов на годовую частоту с началом зимы в октябре каждого года (это северные широты).

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

Поскольку функция resample работает с ndarray объектами, я придумал довольно непереносимый способ сделать это за определенную сумму:

def winter(x,axis):
    # Only use data from 1 October to end of April (day 211)
    return np.sum(x[0:211,:,:],axis=0)
win_sum = all_data.resample('AS-OCT',how=winter,dim='TIME')

но мне кажется, что должно быть более элегантное решение. Любые идеи?


person ajt    schedule 15.09.2016    source источник
comment
Python не имеет функции повторной выборки. Если вы используете Pandas, добавьте тег к своему вопросу.   -  person stark    schedule 15.09.2016
comment
Этот вопрос касается набора данных xarray, а не DataFrame pandas.   -  person ajt    schedule 15.09.2016
comment
Вы пробовали маскировать (с .where), а затем передискретизировать? Я думаю, вам будет намного проще, чем пытаться объединить маскировку в ресэмпл. Если у вас есть полностью воспроизводимый пример, я могу ответить примером   -  person Maximilian    schedule 15.09.2016


Ответы (1)


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

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

# create some example data at daily resolution that also has a space dimension
time = pd.date_range('01-01-2000','01-01-2020')
space = np.arange(0,100)
data = np.random.rand(len(time), len(space))
da = xr.DataArray(data, dims=['time','space'], coords={'time': time, 'space': space})
# this is the trick -- use groupby to extract the month number of each day
month = da.groupby('time.month').apply(lambda x: x).month
# create a boolen Dataaray that is true only during winter
winter = (month <= 4) | (month >= 10)
# mask the values not in winter and resample annualy starting in october
da_winter_annmean = da.where(winter).resample('AS-Oct', 'time')

Надеюсь, это сработает для вас. Это немного более элегантно, но групповой трюк по-прежнему кажется хакерским. Может, есть способ получше.

person Ryan    schedule 15.09.2016
comment
Уловка для извлечения номера месяца для каждой точки данных очень полезна для любых видов нарезки и фильтрации. - person claude; 19.10.2016