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

5

假设我有两个数据集,每个数据集都包含一个不同的感兴趣变量,并且具有不完整(但不冲突)的索引:

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]})

这将创建两个数据集,看起来它们应该很好地合并:

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

但是它们不行 - 尝试 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)

删除协调器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

看起来坐标的处理方式像是使用了 DataArrays,即任何非相同的值都会引发错误。但它们不应该更像基本坐标,例如扩展为两个索引的超集吗?或者我应该执行另一个操作吗?

我正在使用 python 3.5,xarray 0.7.2 和 numpy 1.10.4。

2个回答

7

目前在xarray中实现这一点并不容易,但应该可以做到!

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

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

更新:现在merge方法默认支持此功能(使用compat='no_conflicts'),因此ages.merge(heights)应该可以正常工作。


0

我遇到了同样的问题。我有一些netcdf文件,它们具有相似的纬度/经度范围和相似的变量/层次,但时间步长冲突(我错误地重新下载了它们!)。 我使用pandas检查每个文件中的时间步长是否在加载到列表中的其他文件中重复。最终,我成功地将它们合并。

import xarray,os,shutil,numpy,pandas files=os.listdir(os.path.join(place_in,variable,str(month),hour,level,extent))

listed=[]
if len(files)!=0:
               add=os.path.join(place_in,variable,str(month),hour,level,extent,files[0])  
               data=xarray.open_dataset(add)
               listed=listed+[data]
               times=pandas.DataFrame(data.time.values,columns=["time"])
               for file in files[1:len(files)]:
                  add=os.path.join(place_in,variable,str(month),hour,level,extent,file)
                  data=xarray.open_dataset(add)
                  times1=pandas.DataFrame(data.time.values,columns=["time"])
                  times1=times1[~(times1["time"].isin(list(times["time"])))]
                  times=times.append(times1).drop_duplicates()
                  listed=listed+[data.sel(time=(numpy.array(times1['time'])))]
               data=xarray.merge(listed)  

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接