Xarray индексация / нарезка для учета сезонов - PullRequest
0 голосов
/ 03 июля 2018

Я использую xarray для обработки довольно длинного набора данных. Это было очень весело, и я смог найти все, что мне нужно, в онлайн-документации . Однако сейчас я пытаюсь построить данные для лето и зима , и это не сработает. Несмотря на то, что я нашел много документации по подсчету средств, я ничего не нашел по «чистым» данным. Итак, мой код:

В зимой :

da.loc[(dataD['time.month']>10 & dataD['time.month']<3)]

А в лето :

da.loc[(dataD['time.month']>4 & dataD['time.month']<9)]

Который должен дать мне все данные за ноябрь-февраль и май-август. Однако я всегда сталкиваюсь со следующей ошибкой:

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

Я тоже пробовал нарезать, как

dataH.sel(time=slice('1995-06-01', '2005-06-10'))

но я не смог найти способ пропустить ни зимние, ни летние месяцы между ними.

Кстати: Я хочу избежать циклического прохождения данных (90 тыс. Элементов!). Мне действительно нравится способ обработки данных с помощью xarray (dask?!?), Поэтому я бы хотел сохранить код чистый и элегантный :)

Буду признателен за помощь. Спасибо!

1 Ответ

0 голосов
/ 03 июля 2018

Вы очень близки: вам просто нужен дополнительный набор скобок при использовании поэлементного сравнения и двоичных операций:

da.loc[(dataD['time.month']>10) | (dataD['time.month']<3)]  # winter
da.loc[(dataD['time.month']>4) & (dataD['time.month']<9)]  # summer

(Бинарные операторы, такие как &, связываются более тесно, чем сравнения, подобные > в Python.)

Другой вариант, который может быть немного более читабельным, - это использование метода isin() (требуется xarray v0.10.3 или новее):

ds.loc[dataD['time.month'].isin([1, 2, 11, 12])]  # winter
ds.loc[dataD['time.month'].isin([5, 6, 7, 8])]  # summer
...