cdo | 常用命令

news2025/1/21 4:55:11

整理一下平时经常会使用的cdo命令

如何来更改netcdf数据中的变量名呢?

假设我现在有一个sst月平均数据,希望将里面的变量名称sst修改为sst_new

netcdf oisst_monthly {
dimensions:
        lat = 180 ;
        lon = 360 ;
        time = UNLIMITED ; // (476 currently)
        nbnds = 2 ;
variables:
        float lat(lat) ;
                lat:units = "degrees_north" ;
                lat:long_name = "Latitude" ;
                lat:actual_range = 89.5f, -89.5f ;
                lat:standard_name = "latitude" ;
                lat:axis = "Y" ;
                lat:coordinate_defines = "center" ;
        float lon(lon) ;
                lon:units = "degrees_east" ;
                lon:long_name = "Longitude" ;
                lon:actual_range = 0.5f, 359.5f ;
                lon:standard_name = "longitude" ;
                lon:axis = "X" ;
                lon:coordinate_defines = "center" ;
        short sst(time, lat, lon) ;
                sst:long_name = "Monthly Mean of Sea Surface Temperature" ;
                sst:unpacked_valid_range = -5.f, 40.f ;
                sst:actual_range = -1.8f, 35.56862f ;
                sst:units = "degC" ;
                sst:add_offset = 0.f ;
                sst:scale_factor = 0.01f ;
                sst:missing_value = 32767s ;
                sst:precision = 2s ;
                sst:least_significant_digit = 2s ;
                sst:var_desc = "Sea Surface Temperature" ;
                sst:dataset = "NOAA Optimum Interpolation (OI) SST V2" ;
                sst:level_desc = "Surface" ;
                sst:statistic = "Mean" ;
                sst:parent_stat = "Weekly Mean" ;
                sst:standard_name = "sea_surface_temperature" ;
                sst:cell_methods = "time: mean (monthly from weekly values interpolated to daily)" ;
                sst:valid_range = -500s, 4000s ;
      

使用nco

ncrename -v sst,sst_new oisst_monthly.nc

修改结果,修改成功了

ncdump -h oisst_monthly.nc                                                                                                                                    
netcdf oisst_monthly {
dimensions:
        lat = 180 ;
        lon = 360 ;
        time = UNLIMITED ; // (476 currently)
        nbnds = 2 ;
variables:
        float lat(lat) ;
                lat:units = "degrees_north" ;
                lat:long_name = "Latitude" ;
                lat:actual_range = 89.5f, -89.5f ;
                lat:standard_name = "latitude" ;
                lat:axis = "Y" ;
                lat:coordinate_defines = "center" ;
        float lon(lon) ;
                lon:units = "degrees_east" ;
                lon:long_name = "Longitude" ;
                lon:actual_range = 0.5f, 359.5f ;
                lon:standard_name = "longitude" ;
                lon:axis = "X" ;
                lon:coordinate_defines = "center" ;
        short sst_new(time, lat, lon) ;
                sst_new:long_name = "Monthly Mean of Sea Surface Temperature" ;
                sst_new:unpacked_valid_range = -5.f, 40.f ;
                sst_new:actual_range = -1.8f, 35.56862f ;
                sst_new:units = "degC" ;
                sst_new:add_offset = 0.f ;
                sst_new:scale_factor = 0.01f ;
                sst_new:missing_value = 32767s ;
                sst_new:precision = 2s ;
                sst_new:least_significant_digit = 2s ;
                sst_new:var_desc = "Sea Surface Temperature" ;
                sst_new:dataset = "NOAA Optimum Interpolation (OI) SST V2" ;
                sst_new:level_desc = "Surface" ;
                sst_new:statistic = "Mean" ;
                sst_new:parent_stat = "Weekly Mean" ;
                sst_new:standard_name = "sea_surface_temperature" ;
                sst_new:cell_methods = "time: mean (monthly from weekly values interpolated to daily)" ;
                sst_new:valid_range = -500s, 4000s ;

当然,使用nco还可以修改属性的名称;下面是一个将 netcdf 文件中的 miss_value_FillValue 更改为零的示例:

ncatted -O -a missing_value, MITVAR,o,f,0 dasilva94_monthly_sst.nc
ncatted -O -a _FillValue,        MITVAR,o,f,0 dasilva94_monthly_sst.nc

其中,MITVAR是变量名,o 表示覆盖; f 表示浮点类型; 0是新值。

使用cdo

在刚刚修改为sst_new的基础上,使用cdo将其修改为sst_renew

cdo chname,sst_new,sst_renew oisst_monthly.nc oisst_monthly_renew.nc 

修改结果

ncdump -h oisst_monthly_renew.nc                                                                                                                                  ✔  anaconda3  95% hdd   16:49:39
netcdf oisst_monthly_renew {
dimensions:
       time = UNLIMITED ; // (476 currently)
       bnds = 2 ;
       lon = 360 ;
       lat = 180 ;
variables:
       double time(time) ;
               time:standard_name = "time" ;
               time:long_name = "Time" ;
               time:bounds = "time_bnds" ;
               time:units = "days since 1800-1-1 00:00:00" ;
               time:calendar = "standard" ;
               time:axis = "T" ;
       double time_bnds(time, bnds) ;
       float lon(lon) ;
               lon:standard_name = "longitude" ;
               lon:long_name = "Longitude" ;
               lon:units = "degrees_east" ;
               lon:axis = "X" ;
       float lat(lat) ;
               lat:standard_name = "latitude" ;
               lat:long_name = "Latitude" ;
               lat:units = "degrees_north" ;
               lat:axis = "Y" ;
       short sst_renew(time, lat, lon) ;
               sst_renew:standard_name = "sea_surface_temperature" ;
               sst_renew:long_name = "Monthly Mean of Sea Surface Temperature" ;
               sst_renew:units = "degC" ;
               sst_renew:add_offset = 0.f ;
               sst_renew:scale_factor = 0.01f ;
               sst_renew:_FillValue = 32767s ;
               sst_renew:missing_value = 32767s ;
               sst_renew:unpacked_valid_range = -5.f, 40.f ;
               sst_renew:actual_range = -1.8f, 35.56862f ;
               sst_renew:precision = 2s ;
               sst_renew:least_significant_digit = 2s ;
               sst_renew:var_desc = "Sea Surface Temperature" ;
               sst_renew:dataset = "NOAA Optimum Interpolation (OI) SST V2" ;
               sst_renew:level_desc = "Surface" ;
               sst_renew:statistic = "Mean" ;
               sst_renew:parent_stat = "Weekly Mean" ;
               sst_renew:cell_methods = "time: mean (monthly from weekly values interpolated to daily)" ;
               sst_renew:institution = "NCEP" ;

  • 经过测试,对于变量名称的修改,cdo的速度要明显快于nco(在我这个测试个例里面);当然,nco的修改结果还是在原本的数据里面,而cdo的修改结果保留在一个新的nc文件里面

如何使用wget从ftp或者网页直接下载数据呢?

  • 通过写一个shell脚本来实现

Index of /data/sea-surface-temperature-optimum-interpolation/v2.1/access/avhrr

  • https://www.ncei.noaa.gov/data/sea-surface-temperature-optimum-interpolation/v2.1/access/avhrr/

一个完整的数据为:https://www.ncei.noaa.gov/data/sea-surface-temperature-optimum-interpolation/v2.1/access/avhrr/202404/oisst-avhrr-v02r01.20240401.nc

可以发现其链接的组成很有规则,下载一个文件时,我们可以直接wget https://www.ncei.noaa.gov/data/sea-surface-temperature-optimum-interpolation/v2.1/access/avhrr/202404/oisst-avhrr-v02r01.20240401.nc

但是如果下载多个文件呢,就可以根据它有规则命名的属性来进行循环迭代下载

#!/bin/bash
# 循环遍历每个年份
for year in {2021..2021}; do
   # 循环遍历每个月份
   for month in {01..12}; do
       # 循环遍历每一天
       for day in {01..31}; do
           # 构建文件名
           filename="oisst-avhrr-v02r01.${year}${month}${day}.nc"
           # 构建下载链接
           url="https://www.ncei.noaa.gov/data/sea-surface-temperature-optimum-interpolation/v2.1/access/avhrr/${year}${month}/${filename}"
           # 使用 wget 下载文件
           wget -o ./get -c -nH  -c  -r -A nc "$url"
       done
   done
done

如何对于多个netcdf文件进行求和计算呢?

cdo enssum file1 file2 out.nc

或者

cdo enssum *_sst.nc out.nc

如何对于netcdf数据进行插值呢?

  • 守恒插值 (适用于降水数据)

cdo remapcon,r180x90  pr.nc  pr_regrid_2x2.nc 

  • 双线性插值
cdo remapbic,r144x73 in.nc out_interp.nc 

如何修改数据calendar的类型呢?

cdo setcalendar,standard ua_day_EC-Earth3_data.nc ua_day_EC-Earth3_data_stand.nc 

如何合并多个netcdf文件呢?

将多个nc数据按照时间维度进行合并,屡试不爽的方法。当然最好是保证要合并的数据都在同一个文件夹内。

  cdo mergetime GPM*.nc GPM-2004-05-07.nc 
  • 也可以通过python基于xr.concat()进行合并,当时还是cdo一行命令好使呀。虽然合并后的数据可能会偏大。

如何对于netcdf进行时间滤波呢?

  • 对于数据是月平均来说,如果要进行10个月的低通滤波,可以使用以下命令:
cdo lowpass,0.1 sst.anomaly.nc out.nc

  • 对于数据是日平均来说,如果要进行30-60天的带通滤波
cdo bandpass,365/60,365/30 sst.day.ano.nc out.nc

注意数据中不能存在nan值或者缺测值

如何处理数据中存在的nan值或者缺测值?

  • 将正常的数据转换为Nan值
cdo setmissval,nan input.nc output.nc
  • 将Nan值转化为其他值
cdo setmissval,0 input.nc output.nc

https://dwang.wordpress.com/

https://code.mpimet.mpg.de/boards/2/topics/4057

https://code.mpimet.mpg.de/boards/2/topics/11084

python & cdo :https://code.mpimet.mpg.de/projects/cdo/wiki/Cdo%7Brbpy%7D

cdo使用手册:http://www.idris.fr/media/ada/cdo.pdf

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1719378.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

V90 PN总线伺服通过FB285速度控制实现正弦位置轨迹运动(解析法和数值法对比测试)

V90总线伺服相关内容请参考专栏系列文章,这里不在详述 1、V90伺服PN总线速度随动控制 V90伺服PN总线速度随动控制(手摇轮功能)_手摇轮可以接总线plc吗?-CSDN博客文章浏览阅读632次。V90PN总线控制相关内容,请参考下面文章链接:博途1200/1500PLC V90 PN通信控制 (FB284功能…

【html】用html模拟微信布局

您做的这个模拟微信布局的作品很不错,使用了Flexbox布局来实现元素的灵活排列。以下是关于您代码的一些分析和建议: 效果图: 代码分析: 全局样式重置: 您使用了* { margin: 0; padding: 0; }来重置所有元素的边距。这是一个常见的做法,可以避免不同浏览器默认样式的差…

ARM32开发——LED点灯

🎬 秋野酱:《个人主页》 🔥 个人专栏:《Java专栏》《Python专栏》 ⛺️心若有所向往,何惧道阻且长 文章目录 点灯的两种方式灌入电流法输出电流法扩展板点灯点灯方式点亮LED1-4完整实现 点灯的两种方式 不同颜色LED,达到相同亮度…

LLM Agent提效揭秘4:多智能体协作工作流深度剖析

在此之前,我们已经从论文到代码深度解读了吴恩达:GPT-4Agents Workflow,性能比肩GPT-5的三种大语言模型Agent工作流:反思、工具使用和规划。今天我们将深入最后一种Agent工作流:多智能体协作工作流。 想象一个未来&am…

3.spring源码:refresh()第一个方法prepareRefresh()

重点: 1.了解prepareRefresh()方法的作用:就是为容器刷新做了准备工作 2.整体了解refresh()方法 synchronized加锁的原因:刷新和销毁( "refresh" and "destroy" 都是一个完整的过程,需要加锁 改方法进入可以看到是空的,是为了扩展用的 该方法我们可以自己重…

visual studio code 全局搜索

VScode写代码的时候,会经常性的需要进行查找代码,那么怎么在Visual Studio Code中进行查找呢,下面就来大家vscode全局搜索的方法。 想要在vscode全局搜索进行全局搜索,使用快捷键CTRLSHIFTF即可进行搜索,也可以在左边…

GSM信令流程(附着、去附着、PDP激活、修改流程)

1、联合附着流程 附着包括身份认证、鉴权等 2、去附着流程 用户发起去附着 SGSN发起去附着 HLR发起去附着 GSSN使用S4发起去附着 3、Activation Procedures(PDP激活流程) 4、PDP更新或修改流程 5、Deactivate PDP Context 6、RAU(Routeing Area Update)流程 7、鉴权加…

NATS-研究学习

NATS-研究学习 文章目录 NATS-研究学习[toc]介绍说明提供的服务内容各模式介绍测试使用发布订阅(Publish Subscribe)请求响应(Request Reply)队列订阅&分享工作(Queue Subscribers & Sharing Work)…

vue+vant移动端显示table表格加横向滚动条

vant移动端显示table效果&#xff0c;增加复选框&#xff0c;可以进行多选和全选。加横向滚动条&#xff0c;可以看全部内容。 <template><div class"app-container"><div class"nav_text" style"position: relative;"><…

简单介绍QKeySequenceEdit的使用

QKeySequenceEdit是Qt框架中的一个便捷用户界面组件&#xff0c;用于输入和显示键盘快捷键。它提供了一个简单的界面&#xff0c;允许用户输入一个键盘快捷键&#xff0c;并将其显示为一个字符串。这在需要配置快捷键的应用程序中非常有用。在本文中&#xff0c;我们将详细介绍…

【C++】——string模拟实现

前言 string的模拟实现其实就是增删改查&#xff0c;只不过加入了类的概念。 为了防止与std里面的string冲突&#xff0c;所以这里统一用String。 目录 前言 一 初始化和销毁 1.1 构造函数 1.2 析构函数 二 迭代器实现 三 容量大小及操作 四 运算符重载 4.1 bool…

二叉树的顺序实现-堆

一、什么是堆 在数据结构中&#xff0c;堆&#xff08;Heap&#xff09;是一种特殊的树形数据结构&#xff0c;用数组存储&#xff0c;通常被用来实现优先队列。 堆具有以下特点&#xff1a; 堆是一棵完全二叉树&#xff08;Complete Binary Tree&#xff09;&#xff0c;即…

uni-app的网络请求库封装及使用(同时支持微信小程序)

其实uni-app中内置的uni.request()已经很强大了&#xff0c;简单且好用。为了让其更好用&#xff0c;同时支持拦截器&#xff0c;支持Promise 写法&#xff0c;特对其进行封装。同时支持H5和小程序环境&#xff0c;更好用啦。文中给出使用示例&#xff0c;可以看到使用变得如此…

算法(六)计数排序

文章目录 计数排序技术排序简介算法实现 计数排序 技术排序简介 计数排序是利用数组下标来确定元素的正确位置的。 假定数组有10个整数&#xff0c;取值范围是0~10&#xff0c;可以根据这有限的范围&#xff0c;建立一个长度为11的数组。数组下标从0到10&#xff0c;元素初始…

智慧校园有哪些特征

随着科技的飞速进步&#xff0c;教育领域正经历着一场深刻的变革。智慧校园&#xff0c;作为这场变革的前沿代表&#xff0c;正在逐步重塑我们的教育理念和实践方式。它不仅仅是一个概念&#xff0c;而是一个集成了物联网、大数据、人工智能等先进技术的综合生态系统&#xff0…

Nginx(openresty) 开启目录浏览 以及进行美化配置

1 nginx 安装 可以参考:Nginx(openresty) 通过lua结合Web前端 实现图片&#xff0c;文件&#xff0c;视频等静态资源 访问权限验证&#xff0c;进行鉴权 &#xff0c;提高安全性-CSDN博客 2 开启目录浏览 location /file{alias /data/www/; #指定目录所在路径autoindex on; …

差旅游记|绵阳印象:与其羡慕他人,不如用力活好自己。

哈喽&#xff0c;你好啊&#xff0c;我是雷工&#xff01; 来绵阳之前同事就问: “雷工&#xff0c;能吃辣嘛&#xff1f;”。 “还行&#xff0c;能吃点辣。” “那你去了四川别说能吃点辣&#xff0c;那边的能吃点比跟你说的能吃点不太一样” 01 你好 今天打车&#xff0c;上…

信息学奥赛初赛天天练-17-阅读理解-浮点数精准输出与海伦公式的巧妙应用

PDF文档公众号回复关键字:20240531 1 2023 CSP-J 阅读程序1 阅读程序&#xff08;程序输入不超过数组成字符串定义的范围&#xff1a;判断题正确填√&#xff0c;错误填&#xff1b;除特殊说明外&#xff0c;判断题1.5分&#xff0c;选择题3分&#xff0c;共计40分&#xff0…

python 如何判断一组数呈上升还是下降趋势

目录 一、引言 二、基本概念 三、判断方法 直接比较法 斜率法 统计检验法 四、方法比较与选择 五、案例分析 六、总结 一、引言 在数据处理和分析的领域中&#xff0c;判断一组数是否呈现上升或下降趋势是一个重要的环节。这不仅能够帮助我们了解数据的基本变化…

蓝桥杯高频考点-与日期相关的题目

文章目录 前言1. 如何枚举合法日期1.1 预存每个月的天数1.2 封装一个判断日期是否合法的函数1.3 枚举日期并判断日期是否合法 2. 判断日期是否为回文日期2.1 将日期当作字符串进行处理2.2 将日期当作一个8位数进行处理 3. 给定初始日期&#xff0c;计算经过n天后对应的日期3.1 …