【问题标题】:Extract a given variable from multiple Netcdf files and concatenate to a single file从多个 Netcdf 文件中提取给定变量并连接到单个文件
【发布时间】:2020-09-03 12:06:57
【问题描述】:

我正在尝试从多个 NC 文件中提取单个变量 (DUEXTTAU),然后将所有单个文件合并到一个 NC 文件中。我正在使用 nco,但 ncks 有问题。

NC 文件名如下:

MERRA2_100.tavgM_2d_aer_Nx.YYYYMM.nc4

每个文件有 1 个(每月)时间步长,时间坐标没有实际值,而是以单位或 begin_date 变化。例如,在文件MERRA2_100.tavgM_2d_aer_Nx.198001.nc4中,它有:

    int time(time=1);
      :long_name = "time";
      :units = "minutes since 1980-01-01 00:30:00";
      :time_increment = 60000; // int
      :begin_date = 19800101; // int
      :begin_time = 3000; // int
      :vmax = 9.9999999E14f; // float
      :vmin = -9.9999999E14f; // float
      :valid_range = -9.9999999E14f, 9.9999999E14f; // float
      :_ChunkSizes = 1U; // uint

我对每个文件重复此步骤

ncks -v DUEXTTAU MERRA2_100.tavgM_2d_aer_Nx.YYYYMM.nc4 YYYYMM.nc4

然后

ncrcat YYYYMM.nc4 final.nc4

final.nc4 中,time 坐标具有相同的值(第一个 YYYYMM.nc4)。例如,将 198001、198002 和 198003 3 个文件合并后,time 坐标在所有时间步长上都等于 198001。我该如何处理?

【问题讨论】:

  • 以下两种解决方案是否有帮助?您可以为有用的答案投票,也可以使用勾选标记接受最佳答案

标签: netcdf netcdf4 nco cdo-climate


【解决方案1】:

首先,这个命令应该可以工作:

ncrcat -v DUEXTTAU MERRA2_100.tavgM_2d_aer_Nx.??????.nc4 final.nc4

但是,当time 是整数时,最新版本的 NCO 无法正确重建或重新定位时间坐标,在您的情况下就是这种情况。该修复程序位于 GitHub 上的最新 NCO 快照中,并将在 4.9.3 中发布,并有望在本周发布。如果无法从源安装,则需要手动干预(例如,在每个输入文件中将 time 更改为浮点数,并使用 ncap2 -s 'time=float(time)' in.nc out.nc)。在任何情况下,time_incrementbegin_datebegin_time 属性都是非标准的,只会从第一个文件中复制。但是如果您使用ncrcat 的完整版本,time 本身应该可以正确重构。

【讨论】:

  • 谢谢@charlie-zender。该命令有效,但时间坐标问题仍然存在。我可能误解了这个问题,但是当我使用xarray 打开 final.nc4 并打印出时间坐标时,我看到了: array(['1980-01 -01T00:30:00.000000000', '1980-01-01T00:30:00.000000000', '1980-01-01T00:30:00.000000000', '1980-01-01T00:30:00.000000000', ...
  • 单位元数据中的信息是否设置正确?如果您对 198001、198002 和 198003... 的原始文件尝试 cdo showtime 和 cdo showdata (或 cdo info ),您会得到什么?如果这是正确的,我认为 cdo 可以处理不同的“基本”时间,但我认为 nco 也是如此。
【解决方案2】:

您也可以使用 cdo 执行此操作,但需要两个步骤:

cdo mergetime MERRA2_100.tavgM_2d_aer_Nx.??????.nc4 merged_file.nc 
cdo selvar,DUEXTTAU merged_file.nc DUEXTTAU.nc 

如果开始日期设置正确,这实际上应该有效。问题是 merge_file.nc 实际上可能很大,因此最好先循环提取变量然后合并:

for file in `ls MERRA2_100.tavgM_2d_aer_Nx.??????.nc4`; do 
    cdo selvar,DUEXTTAU $file ${file#????}_duexttau.nc4 
done 
cdo mergetime MERRA2_100.tavgM_2d_aer_Nx.??????_duexttau.nc4 DUEXTTAU.nc 
rm -f MERRA2_100.tavgM_2d_aer_Nx.??????_duexttau.nc4 # clean up

【讨论】:

    猜你喜欢
    • 2018-05-13
    • 2018-10-10
    • 2015-05-23
    • 1970-01-01
    • 1970-01-01
    • 2022-11-19
    • 2021-11-12
    • 2018-11-24
    • 1970-01-01
    相关资源
    最近更新 更多