【问题标题】:Join/merge multiple NetCDF files using xarray使用 xarray 加入/合并多个 NetCDF 文件
【发布时间】:2018-04-23 21:33:16
【问题描述】:

我有一个文件夹,其中包含 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'

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

【问题讨论】:

  • dsmerged = xarray.merge([xarray.open_dataset(f) for f in glob.glob('path/to/file/.*nc')])怎么样?
  • 好吧,这几乎让我的电脑崩溃了,在未崩溃后它说memory error: - 这可能是由于文件的大小?也许我的电脑不能处理这个?
  • 您的文件数量超出了机器的内存容量可以处理的范围。您可以通过缩短要处理的文件数来测试我提供的代码是否真的有效,如下所示:dsmerged = xarray.merge([xarray.open_dataset(f) for f in glob.glob('path/to/file/.*nc')[:2]])。在这种情况下,您只处理两个文件。至于您的记忆问题,我建议您查看this
  • 我用更少的文件尝试过,它可以工作!谢谢你。我也会按照您的建议尝试解决内存问题。
  • 如果您使用xarray.open_mfdataset,则不需要xarray.merge 操作。 xarray.open_mfdataset 已经在处理它。只需dsmerged = xarray.open_mfdataset('path/to/file/*.nc') 就足够了。

标签: python join merge python-xarray


【解决方案1】:

如果您正在寻找一种将所有数据集合并在一起的简洁方法,您可以使用某种形式的 list comprehensionxarray.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')

我希望这证明有用。

【讨论】:

    猜你喜欢
    • 2022-01-08
    • 2021-01-22
    • 2018-12-31
    • 2018-10-10
    • 2019-06-19
    • 1970-01-01
    • 2020-02-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多