Как преобразовать данные xarray в новые измерения - PullRequest
2 голосов
/ 21 января 2020

Я довольно новичок в библиотеке xarray и застрял в том, что кажется довольно простой задачей. У меня есть глобальные климатические данные в файле GRIB для различных 30-километровых сетей. Данные выглядят так:

<xarray.Dataset>
Dimensions:     (time: 736, values: 542080)
Coordinates:
    number      int64 0
  * time        (time) datetime64[ns] 2007-12-01 ... 2008-03-01T21:00:00
    step        timedelta64[ns] 00:00:00
    surface     int64 0
    latitude    (values) float64 89.78 89.78 89.78 ... -89.78 -89.78 -89.78
    longitude   (values) float64 0.0 20.0 40.0 60.0 ... 280.0 300.0 320.0 340.0
    valid_time  (time) datetime64[ns] 2007-12-01 ... 2008-03-01T21:00:00
Dimensions without coordinates: values
Data variables:
    t2m         (time, values) float32 247.30748 247.49889 ... 225.18036
Attributes:
    GRIB_edition:            1
    GRIB_centre:             ecmf
    GRIB_centreDescription:  European Centre for Medium-Range Weather Forecasts
    GRIB_subCentre:          0
    Conventions:             CF-1.7
    institution:             European Centre for Medium-Range Weather Forecasts
    history:                 2020-01-21T09:40:59 GRIB to CDM+CF via cfgrib-0....

И это нормально. Я могу получить доступ к разным моментам времени и графику, даже получить доступ к данным на ячейку, используя data.t2m.data. Но данные индексируются только по time и value, последний из них - я предполагаю - идентификатор номера ячейки, но не считывает latitude и longitude как значимые измерения.

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

<xarray.Dataset>
Dimensions:  (lat: 25, lon: 53, time: 2920)
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
  * time     (time) datetime64[ns] 2013-01-01 ... 2014-12-31T18:00:00
Data variables:
    air      (time, lat, lon) float32 ...
Attributes:
    Conventions:  COARDS
    title:        4x daily NMC reanalysis (1948)
    description:  Data is from NMC initialized reanalysis\n(4x/day).  These a...
    platform:     Model
    references:   http://www.esrl.noaa.gov/psd/data/gridded/data.ncep.reanaly...

Есть ли прямой способ сделать эту переиндексацию в среде xarray? Думаю, я могу просто извлечь массивы numpy и перейти к pandas или чему-то еще, но я считаю библиотеку xarray действительно мощной и полезной.

1 Ответ

2 голосов
/ 22 января 2020

Один из способов может состоять в том, чтобы вручную построить pandas.MultiIndex из переменных широты и долготы, назначить его в качестве координаты для измерения values, а затем снять набор данных:

import pandas as pd

index = pd.MultiIndex.from_arrays(
    [ds.longitude.values, ds.latitude.values], names=['lon', 'lat']
)
ds['values'] = index
reshaped = ds.unstack('values')

. см. этот раздел в разделе «Изменение формы и реорганизация данных» документации xarray.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...