use*_*827 11 python netcdf python-xarray
有没有办法将具有相同时间维度但不同空间域的2个或更多netCDF文件合并为单个netCDF文件?空间域由纬度和经度坐标指定?在xarray concat,merge等的文档中,他们说它们使用单个维度
我对你的问题的理解是,你想要打开多个 netcdf 文件,其中包含数据的不同空间部分,其中整个数据集已沿 和 进行lat细分lon。
如果是这样的话,那么恐怕 xarray 目前不支持这个,我在这里的 xarray github 上询问了完全相同的问题。
同样的事情也被问到了这里。那里提到的解决方案concat将会起作用。
就我而言,然后我想将连接的数据集保存到一个新的 netcdf 文件中,但使用此方法最终会将所有数据一次加载到内存中。为了解决这个问题,我最终不得不使用 netcdf python 库来在较低级别解决这个问题,但这需要付出很大的努力。
xarray 现在支持直接通过open_mfdataset.
关于沿多个维度组合数据的文档在这里,但由于您的问题与这个问题非常相似,我将在这里复制我的答案的关键部分:
您有一个 2D 串联问题:您需要排列数据集,这样当沿着 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')
Run Code Online (Sandbox Code Playgroud)
我们必须知道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')
Run Code Online (Sandbox Code Playgroud)
但否则你将不得不使用combine='nested'.