我的文件由10个合奏和35个时间文件组成。其中一个文件如下:
>>> xr.open_dataset('ens1/CCSM4_ens1_07ic_19820701-19820731_NPac_Jul.nc')
<xarray.Dataset>
Dimensions: (ensemble: 1, latitude: 66, longitude: 191, time: 31)
Coordinates:
* ensemble (ensemble) int32 1
* latitude (latitude) float32 0.0 1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0 ...
* longitude (longitude) float32 100.0 101.0 102.0 103.0 104.0 105.0 106.0 ...
* time (time) datetime64[ns] 1982-07-01 1982-07-02 1982-07-03 ...
Data variables:
u10m (time, latitude, longitude) float64 -1.471 -0.05933 -1.923 ...
Attributes:
CDI: Climate Data Interface version 1.6.5 (http://c...
history: Wed Nov 22 21:54:08 2017: ncks -O -d longitude...
Conventions: CF-1.4
CDO: Climate Data Operators version 1.6.5 (http://c...
nco_openmp_thread_number: 1
NCO: 4.3.7
当我使用open_mfdataset
时,文件在时间维度上连接,并且整体尺寸被删除(可能因为它的大小为1)?
>>> xr.open_mfdataset('ens*/*NPac*.nc')
<xarray.Dataset>
Dimensions: (latitude: 66, longitude: 191, time: 10850)
Coordinates:
* latitude (latitude) float32 0.0 1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0 ...
* longitude (longitude) float32 100.0 101.0 102.0 103.0 104.0 105.0 106.0 ...
* time (time) datetime64[ns] 1982-07-01 1982-07-02 1982-07-03 ...
Data variables:
u10m (time, latitude, longitude) float64 -1.471 -0.05933 -1.923 ...
我不确定是否有可能沿着整体维度进行连接?
我使用merge
进行了一次简单的测试,但是它失败了:
>>> ds = xr.open_mfdataset('ens1/*NPac*')
<xarray.Dataset>
Dimensions: (ensemble: 1, latitude: 66, longitude: 191, time: 1085)
Coordinates:
* ensemble (ensemble) int32 1
* latitude (latitude) float32 0.0 1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0 ...
* longitude (longitude) float32 100.0 101.0 102.0 103.0 104.0 105.0 106.0 ...
* time (time) datetime64[ns] 1982-07-01 1982-07-02 1982-07-03 ...
Data variables:
u10m (time, latitude, longitude) float64 -1.471 -0.05933 -1.923 ...
>>> ds2 = xr.open_mfdataset('ens2/*NPac*')
<xarray.Dataset>
Dimensions: (ensemble: 1, latitude: 66, longitude: 191, time: 1085)
Coordinates:
* ensemble (ensemble) int32 2
* latitude (latitude) float32 0.0 1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0 ...
* longitude (longitude) float32 100.0 101.0 102.0 103.0 104.0 105.0 106.0 ...
* time (time) datetime64[ns] 1982-07-01 1982-07-02 1982-07-03 ...
Data variables:
u10m (time, latitude, longitude) float64 3.992 2.099 -0.3162 ...
>>> ds3 = xr.merge([ds, ds2])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/nethome/rxb826/local/bin/miniconda3/lib/python3.6/site-packages/xarray/core/merge.py", line 513, in merge
variables, coord_names, dims = merge_core(dict_like_objects, compat, join)
File "/nethome/rxb826/local/bin/miniconda3/lib/python3.6/site-packages/xarray/core/merge.py", line 432, in merge_core
variables = merge_variables(expanded, priority_vars, compat=compat)
File "/nethome/rxb826/local/bin/miniconda3/lib/python3.6/site-packages/xarray/core/merge.py", line 166, in merge_variables
merged[name] = unique_variable(name, variables, compat)
File "/nethome/rxb826/local/bin/miniconda3/lib/python3.6/site-packages/xarray/core/merge.py", line 85, in unique_variable
% (name, out, var))
xarray.core.merge.MergeError: conflicting values for variable 'u10m' on objects to be combined:
first value: <xarray.Variable (time: 1085, latitude: 66, longitude: 191)>
dask.array<shape=(1085, 66, 191), dtype=float64, chunksize=(31, 66, 191)>
Attributes:
long_name: 10m U component of wind
units: m s**-1
second value: <xarray.Variable (time: 1085, latitude: 66, longitude: 191)>
dask.array<shape=(1085, 66, 191), dtype=float64, chunksize=(31, 66, 191)>
Attributes:
long_name: 10m U component of wind
units: m s**-1
我正在使用v0.10.0(感谢最近的更新!)
答案 0 :(得分:3)
我编写了以下函数作为自己的用例的变通方法:https://gist.github.com/jnhansen/fa474a536201561653f60ea33045f4e2
它可以使用任意尺寸,但是当前要求每个文件/数据集中都存在相同的变量。
在我的情况下,我有很多瓷砖(沿着lat
,lon
和time
分裂):
ds = auto_merge('data/part*.nc')
这将立即执行,因为它仅返回数据视图(就像xarray.open_mfdataset
一样)。
答案 1 :(得分:0)
xarray现在确实支持N-D串联。由于您的数据具有一维维度坐标,因此您只需执行
ds = xr.open_mfdataset('ens*/*NPac*.nc', combine='by_coords')
,它应该自动将它们组合起来!它甚至应该在ensemble
维度上起作用,因为您也给了该坐标。
也可以向this answer看到一个非常相似的问题。