如何用CDO从RegCM逐小时NetCDF输出提取昼夜数据集
使用CDO拆分RegCM逐小时地表温度数据为白昼/夜间数据集
核心逻辑
你的数据是UTC逐小时输出,需先转换为IST(+5.5小时),再筛选对应时段:
- 白昼:IST 6:30-18:30 → 对应UTC时间01:00-13:00(每个UTC日)
- 夜间:IST 18:30至次日5:30 → 对应UTC时间13:00-次日01:00(每个UTC日)
下面提供两种实操方法,按需选择:
方法一:基于时间偏移后筛选(更直观,推荐新手)
将UTC时间轴转换为IST
用shifttime命令给所有时间戳加5.5小时,生成IST时间的中间文件:cdo shifttime,+5.5hours your_input_file.nc ist_shifted.nc提取白昼数据
IST白昼时段是6:30-18:30,对应偏移后时间的小时值(含小数)在6.5到18.5之间。用expr命令生成掩码筛选目标时段,再提取变量:# 生成带掩码的临时文件 cdo expr,"day_mask = (hour(time)+0.5 >=6.5 && hour(time)+0.5 <=18.5) ? 1 : 0; t2m_day = t2m*day_mask" ist_shifted.nc temp_day.nc # 提取白昼时段的地表温度变量,保存为最终文件 cdo selvar,t2m_day temp_day.nc data_day.nc # 删除临时文件 rm temp_day.nc提取夜间数据
同理,筛选IST夜间时段(小时值<6.5 或 >18.5):cdo expr,"night_mask = (hour(time)+0.5 <6.5 || hour(time)+0.5 >18.5) ? 1 : 0; t2m_night = t2m*night_mask" ist_shifted.nc temp_night.nc cdo selvar,t2m_night temp_night.nc data_night.nc rm temp_night.nc
方法二:直接按时间索引筛选(匹配你提到的步长规则)
你提到首日白昼对应时间步1-13,夜间对应13-24,后续每天以此类推。我们可以用bash生成索引列表,再用selindex提取:
提取白昼数据
生成每个UTC日的前13个时间步索引(1-13、25-37...1153-1165),并提取:# 自动生成白昼索引列表 day_indices=$(seq 0 48 | awk '{for(i=1;i<=13;i++) print $1*24+i}' | paste -sd ",") # 提取对应索引的数据 cdo selindex,$day_indices your_input_file.nc data_day.nc提取夜间数据
生成每个UTC日的13-24时间步索引(13-24、37-48...1165-1176),并提取:night_indices=$(seq 0 48 | awk '{for(i=13;i<=24;i++) print $1*24+i}' | paste -sd ",") cdo selindex,$night_indices your_input_file.nc data_night.nc
注意事项
- 替换命令中的
your_input_file.nc为你的实际输入文件名 - 如果地表温度变量名不是
t2m,请替换为你数据中的对应变量名 - 方法一的中间文件
ist_shifted.nc可在操作完成后删除
内容的提问来源于stack exchange,提问作者Ankan Sarkar
相关产品推荐
相关产品推荐

