使用xarray python

时间:2018-07-23 21:02:01

标签: python netcdf python-xarray

是否可以将两个或多个具有相同时间维度但空间域不同的netCDF文件合并到单个netCDF文件中?空间域由纬度和经度坐标指定?在有关xarray concat,merge等的文档中,他们说它们使用单​​个维度

3 个答案:

答案 0 :(得分:1)

我不知道在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)。

答案 1 :(得分:1)

我对您的问题的理解是,您想打开多个netcdf文件,这些文件包含数据的不同空间部分,其中整个数据集已沿latlon细分。

如果是这种情况,那么恐怕xarray目前不支持此功能,我在xarray github here.

上询问了完全相同的问题

在SO here.上也有人问过同样的问题。此处提到的concat解决方案将起作用。

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

答案 2 :(得分:1)

xarray现在直接通过open_mfdataset支持多维级联。

有关在多个维度上组合数据的文档为here,但是由于您的问题与this one非常相似,因此我将在此处复制答案的关键部分:


您有一个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')

我们不得不告诉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'