Join/merge 使用 xarray 的多个 NetCDF 文件
Join/merge multiple NetCDF files using 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.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')
希望这有用。
我有一个文件夹,其中包含 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。使用此功能,您不需要 for-loop
;您可以将 "path/to/my/files/*.nc"
形式的字符串 glob 传递给它。以下与之前提供的解决方案等效,但内存效率更高:
ds = xarray.open_mfdataset('path/to/file/*.nc')
希望这有用。