You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何批量处理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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 12:35:02