Есть один принцип, который объясняет, почему оба ваших начальных подхода не сработали. В Dataset
переменные имеют значения вдоль координат. Координаты в Dataset
существуют отдельно от переменных. У вас может быть три переменные U
, V
и W
, которые все изменяются по некоторой координате longitude
в наборе данных. Сами по себе, для U
и V
хорошо иметь значения longitude
в разных порядках, но в наборе данных они должны иметь одинаковый порядок.
Когда вы назначаете переменную для набора данных, в котором у набора данных уже есть координата переменной, xarray
автоматически переупорядочит эту переменную, чтобы иметь такой же порядок, что и у набора данных. Это также будет делать приятные вещи, такие как добавление nan
значений везде, где переменная не имеет значений для данной координаты в наборе данных.
Вот пример, где я сделал Dataset
и DataArray
, которые оба имеют координаты долготы, но в обратном направлении. Когда я присваиваю DataArray
Dataset
, координата автоматически меняется на противоположную.
In[17]: ds
Out[17]:
<xarray.Dataset>
Dimensions: (longitude: 10)
Coordinates:
* longitude (longitude) float64 360.0 320.0 280.0 240.0 200.0 160.0 120.0 ...
Data variables:
*empty*
In [18]: da
Out[18]:
<xarray.DataArray (longitude: 10)>
array([ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])
Coordinates:
* longitude (longitude) float64 0.0 40.0 80.0 120.0 160.0 200.0 240.0 ...
In [19]: ds['v'] = da
In [20]: ds['v']
Out[20]:
<xarray.DataArray 'v' (longitude: 10)>
array([ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])
Coordinates:
* longitude (longitude) float64 360.0 320.0 280.0 240.0 200.0 160.0 120.0 ...
Вот аналогичный пример, где автоматически добавляется nan
:
In [27]: ds
Out[27]:
<xarray.Dataset>
Dimensions: (longitude: 10)
Coordinates:
* longitude (longitude) float64 360.0 320.0 280.0 240.0 200.0 160.0 120.0 ...
Data variables:
*empty*
In [28]: da
Out[28]:
<xarray.DataArray (longitude: 3)>
array([ 0., 0., 0.])
Coordinates:
* longitude (longitude) float64 0.0 40.0 80.0
In [29]: ds['v'] = da
In [30]: ds['v']
Out[30]:
<xarray.DataArray 'v' (longitude: 10)>
array([ nan, nan, nan, nan, nan, nan, nan, 0., 0., 0.])
Coordinates:
* longitude (longitude) float64 360.0 320.0 280.0 240.0 200.0 160.0 120.0 ...