遍历多个 NetCDF 文件以计算每小时气候 ERA5 数据集的每日平均值

问题描述 投票:0回答:2

我有数百个从 ERA5(土地)数据集获得的 NETCDF 文件。数据的时间分辨率以小时为单位,但我需要将它们编译成每日平均值。 CDO 中的单一计算很简单(见下文)。但是,当我尝试遍历这些文件时,我收到一条错误消息,提示我一次只能计算一个,这会非常费力。我想知道 R 或 CDO 中是否有解决方法。这是我的 CDO 语法:

$ cdo daymean infile1980.nc outfile_day1980.nc  ##single operation works fine.

尝试循环

for i in C:/path/.*nc 
do 
    cdo daymean "${pattern}"* "${pattern}_day.nc" 
done

cdo(中止):运算符“daymean”的输入流太多!

目标是将每年的小时数据聚合成日数据

r netcdf
2个回答
1
投票

首先,为什么你有数百个文件?你应该将检索合并到单个请求中,否则他们将禁止你的用户 ID 堵塞 CDS 队列与无数单独的请求;-)(不过,说真的,请阅读他们关于组合请求的 WIKI)。

然后回答你的问题,是的,输入文件的数量有限制(通常是 256 个),这意味着你需要使用循环。你说你有数百个输入文件,但不说它们包含什么,你的第一个例子表明你在每个文件中有一年的数据,但在那种情况下你如何拥有数百个文件? ERA-Land 仅跨越 1981 年至今......

无论如何,要循环多年就这样做

for year in `seq 1981 2022` ; do 
    cdo daymean infile${year}.nc outfile_day${year}.nc
done
cdo mergetime outfile_day????.nc all_data_daily.nc 

有时您需要嵌套循环(例如,首先是一个月,然后是几年)——如果您没有指定输入格式的问题,就不可能更准确地帮助您。


0
投票

我找到了解决方法。走了几步但有效。第一步是合并所有的 .nc 文件

## "-b F64"  helps with precision
## "-f nc2" forces the files into nc2 to overcome size. 
## See here: https://code.mpimet.mpg.de/boards/1/topics/908

$ cdo -b F64 -f nc2 mergetime *.nc all_data.nc  

接下来,计算日均值

$ cdo daymean all_data.nc all_out.nc

然后按年份拆分数据

$ cdo splityear all_out.nc  var_out_  ## it automatically appends "year" to each output name
© www.soinside.com 2019 - 2024. All rights reserved.