分享

气象类Python教程(8) ——netCDF4简介

 LibraryPKU 2017-10-27 发布于北京

感冒中,所以这一篇会比较短。(反正也没什么太多可讲的【不】)

本章我们将介绍用以读写netcdf文件的Python第三方库:netCDF4

不过在介绍netCDF4之前,我觉得还是应该来说说nc文件的格式问题。

虽然nc文件我们一直在用,不过其实这个数据的具体格式对很多人来说依然是个未知数,就像一个黑匣子一样。究其原因,很大程度上是因为nc文件相比一般的二进制文件、文本文件,包含了除了数据本身之外的维度、属性(是不是有点熟悉?)等信息,想要读取nc文件,必须得调用专门的函数进行解码、识别。而这一操作是相当麻烦的。

如果想要在Fortran中进行nc文件的读取,不但需要在编译的时候注明netCDF库的路径,同时读取时需要经历这样的步骤:nc文件id获取>变量id获取>变量维数id获取>为变量分配内存空间>读取,这样繁琐的步骤。其中,如果搞错了变量维数、变量数据类型、变量id,就算是一点差错都会导致读取不成功或者读取到错误的结果。

如果是使用grads进行nc文件的读取呢?诚然,grads内置了打开nc文件的函数,但是其实它只能识别标准的nc数据格式,有时候会碰到使用grads内部函数无法打开netcdf文件的情况。不过最蛋疼的还是数据处理:有过使用grads经验的人应该都知道grads在代码编写、数据处理上面的麻烦之处;很多人都会选择将数据输出到二进制文件,再用Fortran去处理,但是这样的操作往往会出现错误。

所以,如果有一个平台既能方便快捷地读取nc文件,又能支持数据处理,那该多好。

Python就提供了这样一个平台。

Python中支持nc数据读写的库有很多,其中scipynetCDF4较为出名,因为scipy主要还是一些科学计算的函数库,所以这里我们着重介绍netCDF4

netCDF4的下载地址在:https://pypi./pypi/netCDF4,它的github主页在https://github.com/Unidata/netcdf4-python,感兴趣的同学可以前去了解关于这个库的更多信息。需要注意的是canopy本身没有包含netCDF4,需要用户自行下载安装,具体方法可以参加之前的教程。

输入:



如果没有错误,那就说明安装成功了。不过呢,因为netCDF4包含了很多的函数,通常我们要用到的只有Dataset一个,所以调用的时候请在脚本开头输入:


注意大小写。

Dataset函数的作用是用只读或者读写的方式打开nc数据文件。直接来看例子吧~


这里的hgt1973.nc1973年的日均高度场数据,而我所做的,就是用只读的方式创建了nc文件对象a。到这一步我们就已经完成了nc文件的打开操作,下一步我们可以来查看一下变量:


nc文件对象a有一个属性叫做variable,顾名思义指代的是文件中的变量信息,而变量信息又有一个属性叫做keys,指代了这些变量的名字。通过调用a.varibles.keys()就可以查看该文件中的变量名了。可以发现hgt1973.nc中包含了5个变量,分别为层次、维度、经度和高度场。如果是在Fortran中,知道了变量名我们还需要去查看变量的维数,才能最终确定需要分配的数组空间。不过Python作为一门动态语言是不需要考虑变量维数这一说的:赋值的同时即内存空间的分配。

说到a.variables.keys(),大家是不是觉得很像python的字典呢?所以想要获得对应的变量数值就变得很简单了:


如图,通过直接赋值的方式我们便获得了hgt1973中的变量“level”。实际上除了获得数值,我们还可以查看“level”的其他属性例如:

可以直接将level的基本信息打印到屏幕:


可以查看数据类型:


查看数据名(有时会和变量名不一样):


查看维数:


等等,大家可以按下tab自行查看。

同理,我们也能够直接读取其他变量:


只要读取出来,之后便能够通过python中的其他数据处理过程进行处理了。

不过这个nc文件还相对箱单了一些,我们再来看个复杂一点的:


Wrfinput_d02是一个wrf模式的初始场文件。用过wrf模式的读者应该会知道,我们使用wrf进行数值模拟之前需要在namelist.input中进行大量的参数设置。而这些参数中的大部分都被写入到了wrfinput之中。如:


边界层参数化方案、陆面过程参数化方案以及网格中心经纬度。这些都不是作为变量存放在nc文件中的,而是以“属性”的形式。所以如果你遇到variables中找不到的变量,可以直接在nc文件对象的属性中查找。

读取变量和查看变量信息的方式和之前一样:

查看信息:


读取变量:


因为wrfinputnc数据类型更为复杂,所以它的变量包含了更多的属性信息,例如C网格的间隔方向等等(如果不做模式的同学可以不用了解这个概念):


不管怎么样,有了netCDF4这个库,我们便可以方便快捷地读取nc数据了~

那么修改nc数据呢?也很简单,只需要在打开文件时加上‘a’或者‘w’即可:


如图,这里我已经对hgt.1973.nc中的level变量进行了修改。修改完毕后请不要忘记调用close进行关闭,这样才能完成对数据的修改。


最后再来说说HDF数据。hdfnetCDF一样,是一种自说明(即自带了数据信息说明)常用的数据格式,很多时候用在卫星资料的储存中。想要在Python中读取hdf格式数据则需要下载对应的库:hdf4hdf5或者h5py。这里尤其请注意hdf的版本信息,hdf4hdf5虽然一个是四一个是五,但实际的内部结构却有很大不同,需要调用不同的库进行解码。不过只要用对了库,其它的步骤和读取nc文件都差不多,例如读取风云卫星的标称数据:


我这里只是读取了该文件中的‘NomFileInfo’变量,这个变量中包含了卫星数据的一些基本信息。今后有机会的话我会来说说如何使用python读取风云卫星的标称hdf数据,并绘制卫星云图:


不过心急吃不了热豆腐,心急感冒也好不了。。。

所以我们下期再见咯!(吃药躺床板去。。。



    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多