Группировка ежедневных данных xarray в среднемесячные значения

Я надеюсь построить график, представляющий месячную температуру с 1 января 1981 года по 31 декабря 2016 года.

Я хотел бы, чтобы месяцы январь, февраль, март, апрель, май... декабрь по оси x и запись температуры по оси y, поскольку мой план состоит в том, чтобы сравнить месячную запись температуры 1981–1999 годов с 2000–2016 годами.

Я прочитал данные без проблем.

temp1 = xr.open_dataarray('temp1981-1999.nc') temp2 = xr.open_dataarray('temp2000-2016.nc')

и избавились от размеров широты и долготы

temp1mean = temp1.mean(dim=['latitude','longitude']) temp2mean = temp2.mean(dim=['latitude','longitude'])

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

temp1.cftime_range(start=None, end=None, periods=None, freq='M', normalize=False, name=None, closed=None, calendar='standard')

t2m time 1981-01-01 276.033295 1981-02-01 278.882935 1981-03-01 282.905579 1981-04-01 289.908936 1981-05-01 294.862457 ... ... 1999-08-01 295.841553 1999-09-01 294.598053 1999-10-01 289.514771 1999-11-01 283.360687 1999-12-01 278.854431

monthly = temp1mean.groupby(temp1mean.index.month).mean()

Однако я получил следующую ошибку.

У объекта DataArray нет атрибута index

Поэтому мне интересно, есть ли способ сгруппировать все ежемесячные средние значения и создать график следующим образом.

График

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

celsius = temp1mean.attrs['units'] = 'kelvin'

но выход просто

'температура_воздуха

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


person grace11    schedule 20.07.2021    source источник
comment
Бонусные баллы за рисованный сюжет! :) Спасибо, что сделали все возможное, чтобы показать нам, чего вы пытались достичь.   -  person Michael Delgado    schedule 24.07.2021


Ответы (1)


Computing monthly means

В документах xarray есть полезный раздел по использованию средство доступа datetime для любых измерений даты и времени:

Аналогичные пандам компоненты datetime объекты, содержащиеся в данном DataArray, могут быть быстро вычислены с помощью специального метода доступа .dt.

...

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

xarray также поддерживает понятие «виртуальные» или «производные» координаты для компоненты даты и времени, реализованные пандами, включая "год", "месяц", "день", "час", "минуту", "секунду", "день года", "неделю", "день недели", «будний день» и «квартал»

В вашем случае вам нужно использовать имя координаты даты и времени (независимо от того, как оно называется) вместе со ссылкой .dt.month в вашей группе. Если ваша координата datetime называется time, операция groupby будет выглядеть так:

monthly_means = temp1mean.groupby(temp1mean.time.dt.month).mean()

или, используя сокращение строки:

monthly_means = temp1mean.groupby('time.month').mean()

Units in xarray

Что касается единиц измерения, вы обязательно должны знать, что xarray никоим образом не интерпретирует и не использует атрибуты или метаданные, за исключением построения графиков и отображения.

Следующее задание:

temp1mean.attrs['units'] = 'kelvin'

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

Если данные на самом деле в кельвинах, лучший известный мне способ конвертировать их в градусы Цельсия — это temp1mean - 273.15 :)

Если вы действительно хотите работать с единицами измерения явно, ознакомьтесь с пинтом -xarray проект расширения. В настоящее время он находится на ранних стадиях и является экспериментальным, но он делает то, что, как я думаю, вы ищете.

person Michael Delgado    schedule 20.07.2021
comment
Спасибо за помощь =] - person grace11; 24.07.2021
comment
Конечно! Это ответило на вопрос? - person Michael Delgado; 24.07.2021