用不同的时间坐标长度打开多个文件

问题描述:

我有两个(更多)netCDF文件,我想用xarray中的open_mfdataset函数实时连接。如果我分别使用open_dataset打开它们,打印的结构如下:用不同的时间坐标长度打开多个文件

Dimensions: (lat: 103, lon: 241, time: 365) 
Coordinates: 
    * lon  (lon) float64 5.75 5.771 5.792 5.812 5.833 5.854 5.875 5.896 ... 
    * lat  (lat) float64 45.75 45.77 45.79 45.81 45.83 45.85 45.88 45.9 ... 
    * time  (time) datetime64[ns] 2014-01-01 2014-01-02 2014-01-03 ... 
Data variables: 
    TabsD (time, lat, lon) float64 nan nan nan nan nan nan nan nan nan ... 

为第一个文件,和

Dimensions: (lat: 103, lon: 241, time: 31) 
Coordinates: 
    * lon  (lon) float64 5.75 5.771 5.792 5.812 5.833 5.854 5.875 5.896 ... 
    * lat  (lat) float64 45.75 45.77 45.79 45.81 45.83 45.85 45.87 45.9 ... 
    * time  (time) datetime64[ns] 2015-01-01 2015-01-02 2015-01-03 ... 
Data variables: 
    TabsD (time, lat, lon) float64 nan nan nan nan nan nan nan nan nan ... 

用于第二。现在的问题是这样的错误回溯,我得到的,当我把文件名中flist,做data = xr.open_mfdataset(flist, concat_dim='time', cache=False)

Traceback (most recent call last): 
    File "C:\Program Files (x86)\JetBrains\PyCharm Community Edition 2016.3.2\helpers\pydev\pydevd.py", line 1591, in <module> 
    globals = debugger.run(setup['file'], None, None, is_module) 
    File "C:\Program Files (x86)\JetBrains\PyCharm Community Edition 2016.3.2\helpers\pydev\pydevd.py", line 1018, in run 
    pydev_imports.execfile(file, globals, locals) # execute the script 
    File "C:\Program Files (x86)\JetBrains\PyCharm Community Edition 2016.3.2\helpers\pydev\_pydev_imps\_pydev_execfile.py", line 18, in execfile 
    exec(compile(contents+"\n", file, 'exec'), glob, loc) 
    File "C:/Users/*/Documents/myfile.py", line 110, in <module> 
    data = xr.open_mfdataset(flist, concat_dim='time', cache=False) 
    File "C:\Program Files\Anaconda3\lib\site-packages\xarray\backends\api.py", line 514, in open_mfdataset 
    combined = auto_combine(datasets, concat_dim=concat_dim, compat=compat) 
    File "C:\Program Files\Anaconda3\lib\site-packages\xarray\core\combine.py", line 396, in auto_combine 
    concatenated = [_auto_concat(ds, dim=dim) for ds in grouped] 
    File "C:\Program Files\Anaconda3\lib\site-packages\xarray\core\combine.py", line 396, in <listcomp> 
    concatenated = [_auto_concat(ds, dim=dim) for ds in grouped] 
    File "C:\Program Files\Anaconda3\lib\site-packages\xarray\core\combine.py", line 332, in _auto_concat 
    return concat(datasets, dim=dim) 
    File "C:\Program Files\Anaconda3\lib\site-packages\xarray\core\combine.py", line 120, in concat 
    return f(objs, dim, data_vars, coords, compat, positions) 
    File "C:\Program Files\Anaconda3\lib\site-packages\xarray\core\combine.py", line 273, in _dataset_concat 
    combined = concat_vars(vars, dim, positions) 
    File "C:\Program Files\Anaconda3\lib\site-packages\xarray\core\variable.py", line 1442, in concat 
    return Variable.concat(variables, dim, positions, shortcut) 
    File "C:\Program Files\Anaconda3\lib\site-packages\xarray\core\variable.py", line 998, in concat 
    data = duck_array_ops.concatenate(arrays, axis=axis) 
    File "C:\Program Files\Anaconda3\lib\site-packages\xarray\core\duck_array_ops.py", line 48, in f 
    return getattr(module, name)(*args, **kwargs) 
    File "C:\Program Files\Anaconda3\lib\site-packages\dask\array\core.py", line 1871, in concatenate 
    raise ValueError("Block shapes do not align") 
ValueError: Block shapes do not align 

我想已经:

  • 设置chunks={'time':10}(30,40,100等...)
  • 设置chunks={'lat':10, 'lon':10}
  • 检查,如果是时间之间的差距跨越:没有

具有基本相同的结果。

这里有什么窍门?

+0

我不知道netcdf,但不能单独读取文件并在之后连接数据? –

+0

这是可能的,但实际上我有150个相当大的文件,所以这就是为什么我选择'open_mfdataset',它依赖于用于处理大量数据的'dask'模块。 – user3017048

+0

dask无法连接数据集? –

您所描述的行为不应该发生。

我的猜测是,你的一些文件实际上有不同的尺寸大小,但你从dask得到一个无效的错误信息。

您所描述的错误消息不再出现在dask的最新版本中,因此这种行为也有可能已被修复。请更新至xarray/dask的最新版本,然后重试。

+0

谢谢@shoyer,更新到dask 0.15确实使错误消失。现在这些文件被组合在一起,但由于经纬度的精度问题,尺寸几乎翻倍。在xr.Dataset的表示中,浮点数似乎是相同的,但是比较的结果几乎只有“False”。 xarray有没有匹配最接近的数字的方法? – user3017048

+0

是的,但需要用'xarray.open_dataset()'单独打开文件,用'reindex()'或'reindex_like()'(使用'method ='nearest''')重新索引它们,然后将它们连接起来用'xarray.concat()'手动。 – shoyer

+0

谢谢,这帮了很大的忙!我不知道现在是否将答案标记为正确,或者更好地删除问题,因为实际问题出现在我担心的数据中; ....--) – user3017048