有没有一种方法将具有相同时间维度但不同空间域的2个或多个netCDF文件合并为单个netCDF文件? 空间域由纬度和经度坐标指定。 在xarray concat,merge等文档中,它们说它们只能处理单个维度。
有没有一种方法将具有相同时间维度但不同空间域的2个或多个netCDF文件合并为单个netCDF文件? 空间域由纬度和经度坐标指定。 在xarray concat,merge等文档中,它们说它们只能处理单个维度。
xarray现在通过open_mfdataset
直接支持多维连接。
有关沿多个维度组合数据的文档在这里,但是由于您的问题与此问题非常相似,因此我将在此处复制我的答案的关键部分:
您有一个二维连接问题:您需要安排数据集,在沿x和y连接时,它们构成一个更大的数据集,该数据集还具有x和y两个维度。
只要每个文件中的len(x)
都相同,并且每个文件中的len(y)
都相同,理论上您应该可以以一种或两种不同的方式完成此操作。
1)使用combine='nested'
您可以手动指定需要连接的顺序。 xarray允许您通过传递作为嵌套列表的网格来执行此操作。 在您的情况下,如果我们有4个文件(命名为[左上,右上,左下,右下]),我们将按以下方式将它们组合:
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'
选项的作用,但不幸的是,它需要1维坐标(也称为dimensional coordinates)来排列数据。如果你的文件没有这些坐标,则输出将显示Dimensions without coordinates: x, y
。
如果你能先给你的文件添加1维坐标,那么你就可以使用combine='by_coords'
,然后只需要以任意顺序传递所有文件的列表即可,例如:
ds = open_mfdataset([file1, file2, ...], combine='by_coords')
但是否则你将不得不使用combine ='nested'
。
combine='nested'
选项,并告诉它数据集的确切顺序。我的意思是,如果你的数据集中没有1D坐标,则不能使用完全自动化的方式(即combine='by_coords')完成该操作。 - ThomasNicholasgridtype = 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
然后您需要将第一个文件 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编写的)。