【问题标题】:How to identify each file of origin when concatinating many netcdf files with ncrcat?使用 ncrcat 连接许多 netcdf 文件时如何识别每个原始文件?
【发布时间】:2019-10-25 01:06:42
【问题描述】:

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

【问题讨论】:

    标签: netcdf nco cdo-climate


    【解决方案1】:

    最简单的方法:在线索引

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

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

    myrun=1
    

    第二个

    myrun=2
    

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

    请注意,如果您的空间维度不是唯一的,并且时间步数也随您编写的内容而变化,则您的索引将需要是所有非唯一维度的函数,例如我的运行(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

    【讨论】:

    • 首先,感谢您如此完整的回复。非常感激。就我而言,重播太贵了。但我下次会考虑这种方法。但是,空间域在文件之间是相同的,因此您的第二个解决方案看起来可以工作。我今晚会试一试,报告我的成功并确认你的答案。
    【解决方案2】:

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

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

    【讨论】:

    • 谢谢查理,我似乎总是想方设法使我对 NCO 的使用过于复杂 ;-)
    • 嗨,查理,如果我想将 X 设置为 bash 变量,请快速澄清您的答案,例如$x,那么单引号将不起作用,因为它们按字面意思翻译。如果我使用双引号: ncap2 -s "myrun[$time]=${x}" in.nc out.nc $time 位中断,即我可以添加一个常量标签,但不能作为时间的函数方面。知道如何解决这个问题吗?
    • 嗨,阿德里安,是的,试试 ncap2 -s "myrun[\$time]=${x}" in.nc out.nc
    猜你喜欢
    • 2016-11-26
    • 1970-01-01
    • 1970-01-01
    • 2017-02-14
    • 2012-08-22
    • 1970-01-01
    • 2021-05-12
    • 2018-11-24
    • 2015-05-24
    相关资源
    最近更新 更多