根据垂直级别合并多个Netcdf文件

问题描述

我有34个netCDF(nc)文件,其中包含纬度,经度和每个文件中的数据。每个文件名都包含一个与hPa压力级别相对应的数字(对于从1000 hPa到0.4 hPa的相应压力级别,从1到34开始。我想使用此垂直级别尺寸信息将所有文件合并到单个nc文件中。

我试图使用xarray open_mfdataset读取整个文件,但由于它不在文件中,所以我无法将其与级别维度con_cat

import xarray as xr
ds = xr.open_mfdataset('/media/MediaCentre/Dataset/d9/data*.nc',concat_dim='level')

文件在全局属性中没有有关压力的任何信息。它们的名称依次为:data1.nc,data2.nc,... datan.nc,它们对应于以下压力水平(hPa): 1000 975 950 925 900 850 800 750 700 650 600 550 500 450 400 350 300 * 250 200 150 100 70 50 40 30 20 15 10 7 5 3 2 1 0.4

如何使用python xarray或cdo / nco将它们合并在一起?

示例数据在https://www.dropbox.com/sh/linfn0721ze3j1f/AACwxTsQVNyiE7mF_gRbpRfra?dl=0

解决方法

使用CDO进行此操作可能更容易。下面将合并您提供的两个示例文件:

cdo -L -merge -setlevel,0.4 data1.nc -setlevel,1 data2.nc merged.nc

只需修改以上内容即可处理所有文件。

,

这是一个BASH脚本,它定义了压力级别列表(请查看注释),然后主力是ncap2,用于向每个文件添加一个称为“ level”的维度,然后定义定义压力值的变量“水平”。然后,我使用ncatted添加完整性属性,例如压力单位。

然后在末尾使用

cdo合并文件(也可以使用nco)。这里的示例仅合并两个文件,但是您可以合并所有。

#!/bin/bash

# define pressure levels here,start,inc,end or just a list
# this is important to get right,the number of files processed
# depends on this list,here I only process 2 files,# data1.nc = 1000hPa,data2.nc=975 hPa

# this was my test merging two files,can use seq if p levs are regular
# p_levs=($(seq 1000 -25 975))

# this is the full code:
p_levs=(1000 975 950 925 900 850 800 750 700 650 600 550 500 450 400 350 300 250 200 150 100 70 50 40 30 20 15 10 7 5 3 2 1 0.4)
    
# loop over the pressure levels,data1.nc-> first pressure level,data2-> second etc
for i in ${!p_levs[@]} ; do
    infile=data$(expr $i + 1).nc # nc filename

    # add a level dimension and define variable with pressure level:
    ncap2 -O -s 'defdim("level",1);q[level,lat,lon]=q;level=array('${p_levs[$i]}',10,$level)' $infile tmp${i}_$infile

    # put in attributes for the new level variable:
    ncatted -h -a units,"level",o,c,"hPa" tmp${i}_$infile
    ncatted -h -a long_name,"Pressure level" tmp${i}_$infile
done

# merge the files:
cdo merge tmp*.nc merged.nc

# clean up tmp files at end 
rm -f tmp*.nc 

我使用p_levs =“ 1000 975”对其进行了测试,它合并了文件的前两个data1.nc和data2.nc,没有问题,并且生成的文件在ncview中可以正常打开并且看起来不错。

注意:由于某些原因,ncap2将从“ q” as per the comments on this post中删除属性,我不确定为什么,所以这意味着您需要读取那些带有ncatted的属性。 This answer here from Charlie Zender was also helpful来构造此代码。

,

使用NCO的另一种方法是首先将级别与ncecat结合起来,例如,

ncecat -u level in*.nc out1.nc

,然后使用ncap2添加水平坐标,例如

ncap2 -O -s 'level[$level]={1000,975,... 0.4}' out1.nc out2.nc

,然后使用ncatted添加属性,如Adrian所示。

ncatted <Adrian's example> out2.nc out3.nc

祝你好运, 查理

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...