[英]combining spatial netcdf files using xarray python
有没有办法将 2 个或多个具有相同时间维度但不同空间域的 netCDF 文件合并到一个 netCDF 文件中? 空间域由纬度和经度坐标指定? 在 xarray concat、merge 等的文档中,他们说他们使用单一维度
xarray 现在直接通过open_mfdataset
支持多维串联。
关于沿多个维度组合数据的文档在这里,但由于您的问题与这个问题非常相似,我将在这里复制我的答案的关键部分:
你有一个二维串联问题:你需要排列数据集,这样当沿着 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'
。
我不知道在python(或R,FORTRAN)中执行此操作的“自动”方法,只能手动将文件读入更大的数组,然后将该数组写入新的netcdf文件,但还有更多“自动化”以使用 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
然后将第一个文件 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)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.