Python 使用xarray连接/合并多个NetCDF文件

Python 使用xarray连接/合并多个NetCDF文件,python,join,merge,python-xarray,Python,Join,Merge,Python Xarray,我有一个文件夹,包含2006-2100年的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.m

我有一个文件夹,包含2006-2100年的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。使用此函数,循环不需要
;您可以以
“path/to/my/files/*.nc”
的形式向它传递一个字符串glob。以下与先前提供的解决方案等效,但内存效率更高:

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

我希望这证明是有用的。

如何
dsmerged=xarray.merge([xarray.open_dataset(f)for f in glob.glob('path/to/file/*nc'))
?好吧,这几乎使我的计算机崩溃,在解除崩溃后说
内存错误:
-这可能是由于文件的大小?也许我的电脑无法处理这个问题?你的文件比你的电脑的内存容量还多。您可以通过如下方式缩短要处理的文件数量来测试我提供的代码是否真正有效:
dsmerged=xarray.merge([xarray.open_dataset(f)for f in glob.glob('path/to/file/*nc')[:2]])
。在本例中,您只处理两个文件。至于你的内存问题,我建议你看看。我用更少的文件试过,效果很好!非常感谢。我将尝试按照您的建议解决内存问题。如果您使用
xarray.open_mfdataset
,则不需要
xarray.merge
操作。它已由xarray处理。打开\u mfdataset
。只要
dsmerged=xarray.open_mfdataset('path/to/file/*.nc')
就足够了。