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

如何将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)

这个方法简洁高效,利用时间偏移和自动时间排序完成需求:

  1. 生成每月16日的数据集:将原文件所有时间点向后偏移15天,得到对应每月16日的副本数据:
cdo shifttime,+15days my_file.nc shifted_file.nc
  1. 按时间顺序合并数据集:CDO的mergetime会自动按时间戳升序合并两个文件,直接得到1日→16日→2日→16日…的目标序列:
cdo mergetime my_file.nc shifted_file.nc final_file.nc

方法二:使用NCO(NetCDF Operators)

若习惯用NCO工具,可按以下步骤操作:

  1. 生成每月16日的数据集:通过ncap2修改时间变量,给每个时间点加15天(需确保原文件时间单位为days,若为小时则改为+360):
ncap2 -s 'time = time + 15' my_file.nc shifted_file.nc
  1. 交错合并时间序列:
    • 先将两个文件的时间维度堆叠:
    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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 08:43:12