如何将ISIMIP月度NetCDF数据生成含1日、16日的半月度数据?
问题描述
我有一份来自ISIMIP的月度NetCDF(.nc)文件,时间序列为:
time = "2000-01-01", "2000-02-01", "2000-03-01", "2000-04-01", "2000-05-01", "2000-06-01", "2000-07-01", "2000-08-01", "2000-09-01", "2000-10-01", "2000-11-01", "2000-12-01", "2001-01-01", "2001-02-01", "2001-03-01"
……直至2014-12-01。
需要将每个月的数据复制一份,设置新的时间为当月15天后(即16日),最终得到每月两个时间点(1日、16日)且数值相同的序列:2000-01-01, 2000-01-16, 2000-02-01, 2000-02-16……
尝试过以下命令但未成功:
cdo inttime,2000-01-01,12:00,15days my_file.nc interpolated_file.nc ncks -F -d time,,,2 original_file.nc first_days.nc ncks -F -d time,1,,2 interpolated_file.nc sixteenth_days.nc ncrcat first_days.nc sixteenth_days.nc final_file.nc
解决方案
方法一:使用CDO(Climate Data Operators)
这个方法简洁高效,利用时间偏移和自动时间排序完成需求:
- 生成每月16日的数据集:将原文件所有时间点向后偏移15天,得到对应每月16日的副本数据:
cdo shifttime,+15days my_file.nc shifted_file.nc
- 按时间顺序合并数据集:CDO的
mergetime会自动按时间戳升序合并两个文件,直接得到1日→16日→2日→16日…的目标序列:
cdo mergetime my_file.nc shifted_file.nc final_file.nc
方法二:使用NCO(NetCDF Operators)
若习惯用NCO工具,可按以下步骤操作:
- 生成每月16日的数据集:通过
ncap2修改时间变量,给每个时间点加15天(需确保原文件时间单位为days,若为小时则改为+360):
ncap2 -s 'time = time + 15' my_file.nc shifted_file.nc
- 交错合并时间序列:
- 先将两个文件的时间维度堆叠:
ncecat -u time my_file.nc shifted_file.nc stacked_file.nc- 对堆叠后的时间维度按时间戳排序,得到目标序列:
ncks -d time,0,-1 -s 'time=time' stacked_file.nc final_file.nc
原命令失败原因
你之前用cdo inttime尝试插值,但该命令是用于重新定义时间轴并插值数据,而这里仅需复制数据修改时间,不符合需求。后续ncks的切片逻辑未实现交错合并,导致最终序列顺序错误。
内容的提问来源于stack exchange,提问作者rocinantes
相关产品推荐
相关产品推荐

