如何使用CDO或其他软件为无时间维度的TRMM日数据添加时间维度并合并
你执行
cdo mergetime出现异常的核心逻辑:该命令强制依赖输入文件自带CDO可识别的CF标准时间坐标。你的TRMM原始日文件无时间维度,CDO无法识别每个文件对应的日期,因此无法构建合法时间轴,反而触发异常合并逻辑(如覆盖同名变量、将输入文件名写入全局属性),最终导致输出文件远小于输入总和。
预处理:给单文件添加合法时间维度
这是最简便的方案(无需额外安装NCO等工具),核心逻辑是从文件名提取该日的日期串(TRMM官方日产品命名均带YYYYMMDD格式的日期标识),再用CDO的settaxis命令给无时间维的文件注入CF标准时间坐标。
单文件测试命令
先拿1个原始文件测试,确认格式:
# 假设原始文件名为 trmm_3b42_daily.20100101.nc4,提取8位日期串20100101 date_str=$(basename trmm_3b42_daily.20100101.nc4 | grep -oE "[0-9]{8}") # 转成CDO要求的YYYY-MM-DD格式 iso_date="${date_str:0:4}-${date_str:4:2}-${date_str:6:2}" # 给文件添加时间维:时间设为当天00:00,日尺度 cdo settaxis,"${iso_date}",00:00:00,1day trmm_3b42_daily.20100101.nc4 trmm_20100101_with_time.nc4
批量处理1825个文件
先创建独立的临时目录存放带时间维的文件(避免覆盖原始数据):
mkdir -p processed_trmm # 循环遍历所有原始nc4文件(假设原始文件存在raw_trmm/目录) for raw_file in raw_trmm/*.nc4; do # 从文件名提取8位日期串(根据实际文件名调整正则,如带短横线则用[0-9]{4}-[0-9]{2}-[0-9]{2}) date_str=$(basename "$raw_file" | grep -oE "[0-9]{8}") iso_date="${date_str:0:4}-${date_str:4:2}-${date_str:6:2}" out_file="processed_trmm/$(basename "$raw_file")" # 执行时间维注入 cdo settaxis,"${iso_date}",00:00:00,1day "$raw_file" "$out_file" done
批量合并带时间维的文件
由于有1825个文件,需避免shell通配符展开超出系统命令行长度限制(ARG_MAX),分两种稳妥方案:
方案1:CDO合并(适合小文件场景)
若执行getconf ARG_MAX返回值大于100000(一般Linux默认≥2097152,足够容纳1825个文件名),直接用:
# 合并并开启轻量压缩(减小输出体积) cdo -z zip_2 mergetime processed_trmm/*.nc4 trmm_5year_merged.nc4
方案2:NCO合并(适合大数量/大文件场景)
若担心命令行长度限制,用NCO的ncrcat(逐文件读取,无ARG_MAX限制,内存占用低):
- 生成文件列表:
ls processed_trmm/*.nc4 > trmm_file_list.txt
- 执行合并(
-h选项省略全局属性的历史记录,可选):
ncrcat -h -r -1 trmm_file_list.txt trmm_5year_merged.nc4
验证合并结果
用以下命令确认是否符合预期:
- 查看时间步长数(应等于1825):
cdo -s ntime trmm_5year_merged.nc4
- 查看时间轴范围(应覆盖5年的起始到结束日期):
cdo -s showtimestamp trmm_5year_merged.nc4
- 查看文件结构(确认
time维度、变量维度合法):
ncdump -h trmm_5year_merged.nc4 | head -20
关键注意事项
- 预处理前务必用
ncdump -h raw_trmm/第一个文件.nc4确认原始文件的变量名、空间维度名,避免settaxis操作影响原有数据(CDO的settaxis仅添加时间维,不改变原有空间维度)。 - 若原始文件名的日期格式不是8位
YYYYMMDD,需调整grep的正则表达式(如日期带短横线则用[0-9]{4}-[0-9]{2}-[0-9]{2})。 - 绝对不要覆盖原始数据,所有预处理操作需在独立目录进行。
- 若合并后文件体积过大,可在CDO命令中添加
-z zip_2参数开启轻量压缩,或在NCO命令中添加--compress_deflate=2参数。
内容的提问来源于stack exchange,提问作者Utkarsh
相关产品推荐
相关产品推荐

