Введите новую координату «зима» - PullRequest
0 голосов
/ 28 октября 2019

У меня есть набор данных xarray с ежедневными данными о переменной в течение нескольких лет (но для каждого года у меня есть только январь, февраль, март и декабрь).

У меня нет проблем с доступом, например, к определенной комбинации год-месяц, например «показать мне данные за январь 2009 года». Но я изо всех сил пытаюсь ввести новую координату, которая позволяет мне получить доступ к

  • зима № 1 (которая содержит ежедневные данные за декабрь 2008 г., январь 2009 г., февраль 2009 г. и март 2009 г.),

  • зима № 2 (которая содержит ежедневные данные за декабрь 2009 г., январь 2010 г., февраль 2010 г. и март 2010 г.),

  • зима № 3и т. д.

Это дает вам представление о том, как выглядят «данные» моего набора данных:

<xarray.Dataset>
Dimensions:    (latitude: 1, longitude: 1440, time: ...)
Coordinates:
  * longitude  (longitude) float32 -180.0 -179.75 -179.5 ... 179.25 179.5 179.75
  * latitude   (latitude) float32 60.0
  * time       (time) datetime64[ns] 1980-01-01 ... 2010-03-28
Data variables:
    u          (time, latitude, longitude) float32 dask.array<shape=(..., 1, 1440), chunksize=(..., 1, 1440)>

Вот как выглядит data.time:


<xarray.DataArray 'time' (time: 476)>
array(['1980-01-01T00:00:00.000000000', '1980-01-01T06:00:00.000000000',
       '1980-01-01T12:00:00.000000000', ..., '1981-02-28T06:00:00.000000000',
       '1981-02-28T12:00:00.000000000', '1981-02-28T18:00:00.000000000'],
      dtype='datetime64[ns]')
Coordinates:
  * time     (time) datetime64[ns] 1980-01-01 ... 1981-02-28T18:00:00
Attributes:
    long_name:  time

1 Ответ

0 голосов
/ 06 ноября 2019

Вы можете сделать функцию для определения ваших новых координат (зима).

def get_winter_year(dates):

    y = dates.dt.year.values
    m = dates.dt.month.values
    ym = list(zip(y,m))

    return [(ym[i][0] - ym[0][0] + 1) if ym[i][1] < 4 else (ym[i][0] - ym[0][0] + 2) for i in range(len(ym))]

Затем мы можем сгруппировать нашу новую координату и произвести вычисления.

airtemps = xr.tutorial.open_dataset('air_temperature')
d = airtemps.assign_coords(time=get_winter_year(airtemps['time']))
d = d.rename({'time' : 'Winter'})
d.groupby('Winter').mean(dim=('Winter'))

> <xarray.Dataset> Dimensions:  (Winter: 3, lat: 25, lon: 53)
> Coordinates:   
> * lat (lat) float32 75.0 72.5 70.0 67.5 65.0 ... 25.0 22.5 20.0 17.5 15.0    
> * lon (lon) float32 200.0 202.5 205.0 207.5 ... 322.5 325.0 327.5 330.0   
> * Winter   (Winter) int64 1 2 3 
>  Data variables:
>      air  (Winter, lat, lon) float32 244.61775 244.4874 ... 297.86255
...