使用ncrcat时可以将文件名作为变量包括在内吗?

时间:2019-06-10 15:52:26

标签: netcdf nco cdo-climate

我要串联1000个nc文件(模拟输出),以便在Matlab中更轻松地处理它们。为此,我使用ncrcat。文件具有不同的大小,并且时间变量在文件之间不是唯一的。串联效果很好,它使我可以比单独读取文件快得多的速度将数据读取到Matlab中。但是,我希望能够识别出每个数据点所源自的原始nc文件。例如,是否可以将源文件名添加为额外的变量,以便我可以追溯数据?

2 个答案:

答案 0 :(得分:4)

最简单的方法:在线索引

在开始之前,我将使用整数索引而不是文件名来标识每次运行,因为它很容易处理,无论是编写还是在matlab程序中进行处理。标识符可以与运行无关,而不是简单的单调递增的索引(或者,必要时甚至可以编写几个单独的索引(例如,您可能为分辨率,日期,模型版本等使用数字)。

因此,我可以想到的显而易见的方法是,每个模拟都会在文件中写入一个索引以标识自身。即第一次运行模型会写一个变量

myrun=1

第二个

myrun=2

以此类推...然后,当您对文件进行分类时,可以使用此索引轻松地唯一标识数据。

请注意,如果您的空间尺寸不是唯一的,并且步数也随编写的不同而变化,则索引将需要是所有非唯一尺寸的函数,例如myrun(x,y,t)。如果您的任何维度在所有文件中都是唯一的,则该维度在索引中是多余的,可以省略。

当然,此解决方案的唯一问题是,它意味着再次运行仿真:-D,您可能正在谈论要运行的昂贵模型,或者您无法重复的其他人的运行。如果无法重新运行,则需要尝试离线添加索引...

离线索引编制(如果网格相同则容易,否则复杂)

IF ,您的空间尺寸在所有文件中都是相同的,因此这仍然是一项轻松的任务,因为您可以轻松地在所有时间步长中离线添加索引每个文件都使用nco:

ncap2 -s 'myrun[$time]=array(X,0,$time)' infile.nc  outfile.nc

或者如果您愿意覆盖原始文件(请注意!)

ncap2 -O -s 'myrun[$time]=array(X,0,$time)'

其中X是运行编号。这将添加一个变量,并带有一个新变量myrun,该变量是时间的函数,然后将X放在每一步。合并后,您可以查看哪个数据切片来自哪个特定运行。

顺便说一句,第二个零是增量,因为将其设置为零,将在给定文件中的所有时间步长写入X数(否则,如果为1,索引将在每个时间步长增加1-在某些情况下可能很有用。例如,您可以使用两个索引,一个索引的增量为零以标识运行,而第二个索引的增量为1以方便地告诉您数据切片属于第X个运行的哪一步) 。

如果您的文件也用于不同的域,那么您可能需要先将它们放在一个公共网格上,然后再考虑...

cdo enlarge 

可能会有所帮助,请参阅此帖子:https://code.mpimet.mpg.de/boards/2/topics/1459

答案 1 :(得分:3)

我同意索引比文件名更简单。我只是在上面的答案中添加了一个命令,它可以将具有时间维度的唯一索引X添加到每个输入文件的命令可以简化为

ncap2 -s 'myrun[$time]=X' in.nc out.nc