4

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

4

2 回答 2

4

最简单的方法:在线索引

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

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

myrun=1

第二

myrun=2

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

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

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

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

如果您的空间尺寸在所有文件中都相同,那么这仍然是一项简单的任务,因为您可以使用 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,索引将在每个时间步长增加一 - 这可能很有用在某些情况下。例如,您可以使用两个索引,一个增量为零来标识运行,第二个增量为单位,以便轻松告诉您数据切片属于第 X 次运行的哪一步)。

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

cdo enlarge 

可能会有所帮助,请参阅这篇文章:https ://code.mpimet.mpg.de/boards/2/topics/1459

于 2019-06-11T07:02:20.043 回答
3

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

ncap2 -s 'myrun[$time]=X' in.nc out.nc
于 2019-06-11T23:17:52.500 回答