假设我有两个数据集,每个数据集包含一个不同的感兴趣变量和不完整(但不冲突)的索引:
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
类似,因为任何不相同的值都会引发错误。但是它们不应该像基本坐标那样处理,例如扩展到两个指数的超集?或者我应该做另一项操作吗?
我使用的是xarray 0.7.2和numpy 1.10.4
的python 3.5答案 0 :(得分:4)
这在xarray中目前不容易实现,但应该是!
事实上,我认为在大多数情况下合并任何非冲突的值应该是安全的(除非用户要求更严格的审查)。
我打开了一个GitHub问题来跟踪此问题:https://github.com/pydata/xarray/issues/835
更新:merge
方法现在默认支持此功能(使用compat='no_conflicts'
),因此ages.merge(heights)
应该可以正常工作。
答案 1 :(得分:0)
我遇到了同样的问题。我的 netcdf 文件具有相似的纬度/经度和相似的变量/级别,但时间步长冲突(我错误地重新下载了它们!)。 我使用熊猫来检查每个文件中的时间步长是否在之前加载到列表中的其他文件中重复。最后我没有错误地合并了它们。
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)