如何批量处理ERA5(Land)逐小时NetCDF文件计算日均值?
ERA5-Land逐小时NetCDF批量生成日均值解决方案
问题原因
你之前的循环错误地将所有NC文件作为输入传递给cdo daymean,而该算子默认仅支持单个输入流(单个文件或合并后的文件),因此触发Too many input streams报错。以下是CDO和R两种工具的可行解决方法:
CDO解决方案
场景1:单个文件对应一整年的逐小时数据
直接遍历每个文件,单独生成对应年份的日均值文件:
for file in C:/path/*.nc; do # 替换文件名后缀,生成带_day的输出文件 cdo daymean "$file" "${file%.nc}_day.nc" done
${file%.nc}会自动移除输入文件名的.nc后缀,再拼接_day.nc作为输出文件名。
场景2:同一年的逐小时数据分散在多个文件中
先合并同一年份的所有小时文件,再计算日均值:
# 提取所有唯一的年份(假设文件名包含4位数字年份) years=$(ls C:/path/*.nc | grep -oE '[0-9]{4}' | sort -u) for year in $years; do # 合并当年所有小时文件到临时文件 cdo mergetime C:/path/*"$year"*.nc temp_"$year".nc # 计算日均值并保存 cdo daymean temp_"$year".nc era5_daymean_"$year".nc # 删除临时文件 rm temp_"$year".nc done
R解决方案(使用terra包)
terra包处理NetCDF时间序列更简洁,支持直接合并多文件并按日期分组计算均值:
# 安装依赖包(首次运行时执行) install.packages("terra") library(terra) # 设置NC文件路径 nc_path <- "C:/path/" # 获取所有NC文件的完整路径 nc_files <- list.files(nc_path, pattern = "\\.nc$", full.names = TRUE) # 从文件名中提取年份(假设文件名包含4位数字年份) extract_year <- function(file) { regmatches(basename(file), regexpr("[0-9]{4}", basename(file))) } file_years <- sapply(nc_files, extract_year) # 按年份批量处理 for (year in unique(file_years)) { # 筛选当前年份的所有文件 year_files <- nc_files[file_years == year] # 读取并合并所有小时数据为时间序列栅格 hourly_raster <- rast(year_files) # 提取日期(去除小时信息) dates <- as.Date(time(hourly_raster)) # 按日期分组计算日均值 daymean_raster <- tapp(hourly_raster, dates, mean) # 保存结果文件 writeRaster(daymean_raster, filename = paste0(nc_path, "era5_daymean_", year, ".nc"), overwrite = TRUE) }
内容的提问来源于stack exchange,提问作者user11384727
相关产品推荐
相关产品推荐

