如何合并坐标冲突的xArray数据集

Mic*_*ado 5 python python-xarray

假设我有两个数据集,每个数据集包含不同的关注变量,并且索引不完整(但不冲突):

In [1]: import xarray as xr, numpy as np
In [2]: ages = xr.Dataset(
          {'ages': (['kid_ids'], np.random.rand((3))*20)}, 
          coords={'kid_names':(['kid_ids'], ['carl','kathy','gail']), 'kid_ids': [10,14,16]})
In [3]: heights = xr.Dataset(
          {'heights': (['kid_ids'], np.random.rand((3))*160)}, 
          coords={'kid_names':(['kid_ids'], ['carl','keith','gail']), 'kid_ids': [10,13,16]})
Run Code Online (Sandbox Code Playgroud)

这将创建两个看起来应该很好合并的数据集:

In [4]: ages
Out[4]: 
<xarray.Dataset>
Dimensions:    (kid_ids: 3)
Coordinates:
  * kid_ids    (kid_ids) int32 10 14 16
    kid_names  (kid_ids) <U5 'carl' 'kathy' 'gail'
Data variables:
    ages       (kid_ids) float64 13.28 1.955 4.327
In [5]: heights
Out[5]: 
<xarray.Dataset>
Dimensions:    (kid_ids: 3)
Coordinates:
  * kid_ids    (kid_ids) int32 10 13 16
    kid_names  (kid_ids) <U5 'carl' 'keith' 'gail'
Data variables:
    heights    (kid_ids) float64 115.0 38.2 31.65
Run Code Online (Sandbox Code Playgroud)

但他们没有-尝试ages.merge(heights)导致ValueError

ValueError: conflicting value for variable kid_names:
first value: <xarray.Variable (kid_ids: 4)>
array(['carl', nan, 'kathy', 'gail'], dtype=object)
second value: <xarray.Variable (kid_ids: 4)>
array(['carl', 'keith', nan, 'gail'], dtype=object)
Run Code Online (Sandbox Code Playgroud)

放下坐标kid_names可解决问题:

In [7]: ages.reset_coords('kid_names', drop=True).merge(
          heights.reset_coords('kid_names', drop=True))
Out[7]:
<xarray.Dataset>
Dimensions:  (kid_ids: 4)
Coordinates:
  * kid_ids  (kid_ids) int64 10 13 14 16
Data variables:
    ages     (kid_ids) float64 0.4473 nan 6.45 6.787
    heights  (kid_ids) float64 78.42 78.43 nan 113.4
Run Code Online (Sandbox Code Playgroud)

似乎就像在处理坐标一样DataArrays,因为任何不相同的值都会引发错误。但是,是否不应该将它们像基本坐标那样处理,例如扩展到两个索引的超集?还是我应该做另一项操作?

我在使用xarray 0.7.2和numpy 1.10.4的python 3.5上

sho*_*yer 6

这在xarray中目前不容易实现,但应该如此!

实际上,我认为在大多数情况下合并任何不冲突的值应该是安全的(除非用户要求进行更高的审查)。

我打开了一个GitHub问题来跟踪此问题:https : //github.com/pydata/xarray/issues/835

更新:该merge方法现在默认情况下(带有compat='no_conflicts')支持此功能,因此ages.merge(heights)应该可以使用。