问题描述
我有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
祝你好运, 查理