使用 ncrcat 连接多个 netcdf 文件时如何识别每个原始文件?

How to identify each file of origin when concatinating many netcdf files with ncrcat?

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

最简单的方法:在线索引

在我们开始之前,我会使用整数索引而不是文件名来标识每个 运行,因为它更容易处理,无论是编写还是在 matlab 程序中处理。标识符可以与您的 运行 相关,而不是简单的单调递增索引(或者如果需要,您甚至可以编写多个单独的索引(例如,您可能有一个数字表示分辨率、日期、模型版本等) .

因此,我能想到的最明显的方法是每次模拟都将索引写入文件以标识自己。即第一个模型 运行 会写一个变量

myrun=1

第二个

myrun=2

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

请注意,如果您的空间维度不是唯一的,并且时间步长的数量也从您所写的 运行 运行 变化,您的索引将需要是所有 non-unique 尺寸,例如我的 运行(x,y,t)。如果您的任何维度在所有文件中都是唯一的,则该维度在索引中是多余的,可以省略。

当然,此解决方案的唯一问题是它意味着 运行 再次模拟 :-D 并且您可能正在谈论 运行 或其他人的 [=56] 的昂贵模型=]s 你不能重复。如果 re运行ning 不可行,您将需要尝试离线添加索引...

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

IF 您的 space 尺寸在所有文件中都相同,那么这仍然是一项简单的任务,因为您可以使用 nco:

在每个文件的所有时间步骤中非常轻松地添加离线索引
ncap2 -s 'myrun[$time]=array(X,0,$time)' infile.nc  outfile.nc

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

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

其中 X 是 运行 号码。这将添加一个变量,新变量 my运行 是时间的函数,然后在每个步骤中放置 X。合并时,您可以看到哪个数据切片来自哪个特定 运行.

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

如果您的文件也适用于不同的域,那么您可能希望在执行此操作之前将它们放在一个公共网格上...我认为

cdo enlarge 

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

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

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