之前一篇文章简单介绍了Climate Data Operators (CDO) 如何处理气候数据的软件,并提到配合Python可以方便的使用,这里就再进一步讲解如何在Python中调用CDO,以及其它系统指令。虽然CDO发布了Python-cdo提供了直接使用的方法,但是这里给一些不能安装python-cdo或者其它原因不使用这个库的用户一个其它的方法。
一、 Python调用CDO
这里只需要使用os库(操作系统接口)即可完成,更确切的说,是os.system()函数。
1 | import os |
system函数可以将字符串转化成命令在服务器上运行;其原理是每一条system函数执行时,其会创建一个子进程在系统上执行命令行,子进程的执行结果无法影响主进程。有了这个函数,我们就可以在python脚本里随意使用CDO了。比如:
1 | os.system('cdo selname,t2m ./in.nc ./out.nc') |
通常而言,我们会利用CDO批量处理一些数据,一条一条输入太过麻烦,这时候灵活利用循环format格式化函数就可以实现,如我们下载了NCEP再分析资料1948-2020年逐日的pressure level的温度数据,我们需要提取每年500 hPa的数据并且合并成1个文件:
1 | import os |
这里需要注意的是格式化函数的匹配,比如对os.system(‘cdo sellevel,500 {}{} {}t500_{}.nc’.format(filePath,filename[i],filePath,i))这行代码而言,代码中一共有四个{},分别对应filePath,filename[i],filePath和i。
二、Python调用其它系统指令
既然python可以通过os.system函数调用CDO,那同样也可以调用其它指令,实际上在上边一个示例的最后一行代码已经涉及到了,调用了系统的rm函数删除了中间文件。
我在批量下载气象数据(EC;NCEP;CMIP)介绍过使用bash脚本批量下载数据的方法,这里我们进行一点简单的修改,就可以在python里实现批量下载。
1 | import numpy as np |
对于不熟悉shell语言的伙伴们,看到这样的方法可能会更亲切一点吧。需要注意的是wget语句会默认将文件下载到python脚本所在路径,通过-O 参数可以指定下载路径。
1 | wget -O ./data/1948.nc ftp://ftp2.psl.noaa.gov/Datasets/ncep.reanalysis.dailyavgs/pressure/hgt.1948.nc |
当然wget还有更多参数,有兴趣的可以参考wget参数。
当然如果你使用的是jupyternotebook,那可能你无法看到下载进度了。当然也有一个不是办法的应对办法,安装一个进度条库:
1 | pip install tqdm |
1 | import numpy as np |
这时再试试看使用了tqdm有什么区别呢?