使用xarray加入/合并多个NetCDF文件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用xarray加入/合并多个NetCDF文件相关的知识,希望对你有一定的参考价值。

我有一个文件夹,包含2006 - 2001年的NetCDF文件,十年块(2011-2020,2021-2030等)。

我想创建一个新的NetCDF文件,其中包含连接在一起的所有这些文件。到目前为止,我已阅读过文件:

ds = xarray.open_dataset('Path/to/file/20062010.nc')
ds1 = xarray.open_dataset('Path/to/file/20112020.nc')
etc.

然后像这样合并这些:

dsmerged = xarray.merge([ds,ds1])

这是有效的,但是很笨重,并且必须有一种更简单的方法来自动化这个过程,因为我将为许多不同文件夹的文件夹执行此操作。有没有更有效的方法来做到这一点?

编辑:

尝试使用glob加入这些文件:

for filename in glob.glob('path/to/file/.*nc'):
    dsmerged = xarray.merge([filename])

给出错误:

AttributeError: 'str' object has no attribute 'items'

这只是读取文件名的文本,而不是实际文件本身,所以它不能合并它。如何打开,存储为变量,然后合并而不是一点一点地进行合并?

答案

如果您正在寻找一种将所有数据集合并在一起的简洁方法,您可以使用某种形式的列表推导和xarray.merge函数来完成它。以下是一个例子:

ds = xarray.merge([xarray.open_dataset(f) for f in glob.glob('path/to/file/.*nc')])

为了响应您遇到的内存不足问题,这可能是因为您拥有的文件比python进程可以处理的文件多。最好的解决方法是使用xarray.open_mfdataset函数,它实际上使用引擎盖下的库dask将数据分成更小的块来处理。这通常更节省内存,并且通常允许您将数据带入python。有了这个功能,你不需要for-loop;你可以以"path/to/my/files/*.nc"的形式传递一个字符串glob。以下相当于以前提供的解决方案,但内存效率更高:

ds = xarray.open_mfdataset('path/to/file/*.nc')

我希望这证明是有用的。

以上是关于使用xarray加入/合并多个NetCDF文件的主要内容,如果未能解决你的问题,请参考以下文章

使用xarray python组合空间netcdf文件

使用xarray从netcdf中提取最近的经纬度和时间值

xarray 自动将 _FillValue 应用于 netCDF 输出上的坐标

使用 xarray 更改坐标系以进行切片操作

将多个NetCDF合并到一个文件中,每个文件的平均值都为平均值

使用 xarray 选择所有坐标值