使用 xarray python 组合空间 netcdf 文件

combining spatial netcdf files using xarray python

有没有办法将2个或多个时间维度相同但空间域不同的netCDF文件合并成一个netCDF文件?空间域由纬度和经度坐标指定?在 xarray concat、merge 等文档中,他们说他们使用单一维度

我不知道 "automated" 在 python(或 R,FORTRAN)中执行此操作的方法,只能手动将文件读入更大的数组,然后将该数组写出到一个新的 netcdf 文件,但还有更多 "automated" 使用 CDO 从命令行执行此操作。

如果您定义包含两个(或更多)文件区域的域描述文件grid.txt:

gridtype = lonlat
gridsize = 420
xname = lon
xlongname = longitude
xunits = degrees east
yname = lat
ylongname = latitude
yunits = degrees north
xsize = 21
ysize = 20
xfirst = -11.0
xinc = 1
yfirst = -20.0
yinc = 1

然后你 "expand" 第一个文件 file1.nc 到更大的域,然后合并两个 netcdf 文件的内容:

cdo expand,grid.txt file1.nc large.nc
cdo mergegrid large.nc file1.nc merge1.nc
cdo mergegrid merge1.nc file2.nc final_merge.nc 

我在这里找到了这个解决方案:https://code.mpimet.mpg.de/boards/1/topics/26 并且在我需要将 2 个或 3 个文件合并在一起时使用了它。但是,当我需要将数百个文件合并在一起时,例如每个纬度行数据,我编写了一个手动程序(在我的例子中是 R)。

我对你的问题的理解是,你想打开多个 netcdf 文件,其中包含数据的不同空间部分,其中整个数据集已按 latlon.

如果是这样的话,恐怕 xarray 目前不支持这个,我在 xarray 上问过完全相同的问题 github here.

在 SO 上也询问了同样的事情concat 那里提到的 concat 解决方案将起作用。

在我的例子中,我想将连接的数据集保存到一个新的 netcdf 文件中,但使用这种方法最终将所有数据一次加载到内存中。为了解决这个问题,我最终不得不使用 netcdf python 库在较低级别解决这个问题,但它花费了很多精力。

xarray 现在支持直接通过 open_mfdataset.

进行多维拼接

关于多维度组合数据的文档是here, but as your question is very similar to ,我将在这里复制我的答案的关键部分:


您有一个二维串联问题:您需要安排数据集,以便在沿 x 和 y 连接时,它们会形成一个更大的数据集,该数据集也具有维度 x 和 y。

只要 len(x) 在每个文件中都相同,并且 len(y) 在每个文件中都相同,理论上您应该能够以一种或两种不同的方式做到这一点。

1) 使用 combine='nested'

您可以手动指定您需要它们连接的顺序。xarray 允许您通过将数据集作为网格传递来执行此操作,指定为嵌套列表。在你的例子中,如果我们有 4 个文件(名为 [upper_left、upper_right、lower_left、lower_right]),我们将像这样组合它们:

from xarray import open_mfdataset

grid = [[upper_left, upper_right], 
        [lower_left, lower_right]]

ds = open_mfdataset(grid, concat_dim=['x', 'y'], combine='nested')

我们必须告诉 open_mfdataset 网格的行和列对应于数据的哪些维度,因此它会知道连接数据的维度。这就是为什么我们需要传递 concat_dim=['x', 'y'].

2) 使用 combine='by_coords'

但是您的数据中已经有坐标 - 不能 xarray 只使用这些坐标以正确的顺序排列数据集吗?这就是 combine='by_coords' 选项的用途,但不幸的是,它需要一维坐标(也称为 维坐标 )来排列数据。如果您的文件没有任何这些,打印输出将显示 Dimensions without coordinates: x, y).

如果您可以先将一维坐标添加到您的文件,那么您可以使用 combine='by_coords',然后您可以按任意顺序传递所有文件的列表,即

ds = open_mfdataset([file1, file2, ...], combine='by_coords')

但否则你将不得不使用 combine='nested'