nco 每天从上午 10 点到上午 10 点将每日 netcdf 文件剪切成重复的上午 10 点条目

nco cut daily netcdf file from 10AM to 10AM everyday with duplicated 10am entries

我是 nco 的初学者,我想将我的 .nc 文件(从 1996010110 到 2019123110)拆分为每日文件,从上午 10 点到晚上 10 点。在这种情况下,每个拆分文件包含 YYYY-MM-DD:10:00YYYY-MM-(DD+1):10:00。请注意,DD 日的结束时间在第二天开始时重复。即YYYY-MM-DD:10:00的数据在file_YYYY_MM_DD.nc中出现了两次,作为起始数据,也是file_YYYY_MM_(DD-1).nc的结束数据。 谢谢!

有一个 CDO 命令允许您 select 小时的子范围:

cdo selhour,10/22 in.nc out.nc 

这将回答问题的第一部分,但从我的评论中您会发现该问题需要进一步澄清。

在 NCO 中执行此操作的方法是随着时间的推移环绕一个循环,使用 hyperslabber 的子循环形式来消除重复的时间戳,然后在几天内循环以创建类似于此文档示例的每个文件here。对于第一个所需记录为索引 10 的输入,最后一个所需索引是无界的,重复序列中的记录数(即组之间的步幅)为 25,连续所需记录数(a 的所需子集)组)是 24,第一个命令是这样的:

ncrcat -d time,10,,25,24 in.nc out.nc

然后 out.nc 将包含数千天的数据,没有重复的时间步长,您可以根据需要将该文件拆分为每天的文件,包括将 ncrcat 包裹在一个循环中,例如

编辑 20210924:根据下面的说明,您可以忽略此消息的上述部分并直接进入此循环,该循环已被修改为每天提取 25 个时间步长。

for yr in {1996..2019}; do
  for mth in {1..12}; do
    for day in {1..${dpm[mth]}}; do # Days-per-month array exercise left for the reader :)
      yyyy=`printf "%04d" $yr`
      mm=`printf "%02d" $mth`
      dd=`printf "%02d" $day`
      ncrcat -d time,${yyyy}-${mm}-${dd}T10:00:00,${yyyy}-${mm}-${ddp1}T10:00:00 out.nc file_${yyyy}_${mm}_${dd}.nc
    done
  done
done