使用Python处理NetCDF格式文件

NetCDF(Network Common Data Form)是一种科学二进制数据格式,由UCAR负责开发和维护netCDF软件,主要用于存储多维科学数据。在地球科学领域使用较为广泛,大多数数值模式,卫星,雷达等数据格式通常为NetCDF格式。

NetCDF 数据的特性包括:

  • 自描述性:即 netCDF 文件包括关于其中所含数据的信息,如捕获数据元素的时间以及使用的测量单位。
  • 可移植性:或称跨平台性,即在一种操作系统上创建的 netCDF 文件通常可被其他操作系统上的软件读取。
  • 可扩展性:即可有效地读取一个大 netCDF 文件的一个小子集,而无需读取整个文件。

本文不对NetCDF数据格式进行过多的介绍,主要讲一下如何处理NetCDF格式文件,并且如何对最终的数据进行可视化分析。

目前有非常多的软件可以处理NetCDF格式文件,并且相当一部分提供了可视化功能。如下图所示(截图仅展示了很少的部分,完整列表见Unidata[1]):

NetCDF 文件处理工具

其中列出的ncdump可以查看NetCDF文件中的变量和属性等信息,ncview,panoply可以对NetCDF文件中的变量进行简单的可视化,如果需要对NetCDF文件进行裁剪,算术运算或者插值等操作,可以使用nco或cdo等工具。复杂的数据处理工作和二维可视化可以使用matlab,python或NCL,三维可视化可以使用VisAD,Vis5d,IDV等。

处理nc文件的工具很多,此次仅利用python来讲一下如何处理nc文件。目前Python中最受欢迎的处理NetCDF数据的库是netCDF4-python。此外,scipy.io模块也提供了NetCDF文件接口,可以用来读取NetCDF文件。

如果你还没安装netCDF4,可以通过以下命令安装:

pip install netcdf4
#or
conda install netcdf4

本文以netCDF4-python为例。以下代码给出了完整的数据读取和绘图部分(效果见图2):

# load library
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

import cartopy.crs as ccrs
from cartopy.mpl.ticker import LongitudeFormatter, LatitudeFormatter
from cartopy.util import add_cyclic_point
from palettable.colorbrewer.diverging import RdBu_11_r 
import netCDF4 as nc

sns.set_context('talk', font_scale=1.2) # 设置图形属性

# read NetCDF file
fn = 'air.sig995.2012.nc'
data = nc.Dataset(fn, 'r') # 默认为读文件,此处 'r' 可省略

# 读取相关变量
lat = data.variables['lat'][:].data
lon = data.variables['lon'][:].data
time = data.variables['time'][:].data
air = data.variables['air'][:].data

# 添加数据循环,以防止在0和360时出现白色条状
# 添加数据循环和不添加数据循环的效果见后文两张图
cycle_air, cycle_lon = add_cyclic_point(air, coord=lon)
cycle_LON, cycle_LAT = np.meshgrid(cycle_lon, lat)

projection = ccrs.PlateCarree() # 设置投影
fig, ax = plt.subplots(figsize=(16, 9), subplot_kw=dict(projection=projection))

con = ax.contourf(cycle_LON, cycle_LAT, cycle_air[0, ...], 
                 np.arange(220, 321), cmap=RdBu_11_r.mpl_colormap)

ax.coastlines(linewidth=1.5) # 添加海岸线
ax.set_xticks(np.arange(-180, 181, 60), crs=projection)
ax.set_yticks(np.arange(-90, 91, 30), crs=projection)

# 设置 ticklabels 格式
lon_formatter = LongitudeFormatter(number_format='.0f',
                                  degree_symbol='',
                                  dateline_direction_label=True)
lat_formatter = LatitudeFormatter(number_format='.0f',
                                 degree_symbol='')

ax.xaxis.set_major_formatter(lon_formatter)
ax.yaxis.set_major_formatter(lat_formatter)

# shrink 控制 colorbar 长度,pad 控制colorbar和图的距离
cb = fig.colorbar(con, shrink=0.73, pad=0.02)

# 调整 ticklabels
cb.set_ticks(np.arange(220, 321, 20))
cb.set_ticklabels(np.arange(220, 321, 20))

cb.ax.tick_params(direction='in', length=5) # 控制 colorbar tick

# 保存文件, dpi用于设置图形分辨率, bbox_inches 尽量减小图形的白色区域
fig.savefig('test.png', dpi=300, bbox_inches='tight')

上述导入的库:

numpy :用于生成标签数组

matplotlib :用于绘图

seaborn :用于设置合适的图形参数,关于seaborn见 Python简单高效的可视化神器——Seaborn

palettable :用于设置colormap

cartopy :添加地理图形信息

netCDF4 :读取netcdf格式文件

其余代码段的解释在上述代码中已经给出,文末也给出了Notebook和数据链接,Notebook中有更多更详细的代码和解释。Notebook中也给出了使用 scipy 读取 netcdf 文件的示例。

图1 无数据循环

图2 添加数据循环

数据处理下集预告:如何处理grib格式数据

1. https://www.unidata.ucar.edu/software/netcdf/software.html

2. 数据和代码: https://pan.baidu.com/s/15Ru8FAdnR5MxDEHO6aLvvg

- End -

本文由MeteoAI原创首发,未经允许禁止转载!

本文分享自微信公众号 - MeteoAI(meteoai)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-12-09

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏SAMshare

【LeetCode03】查找字符串最长公共前缀

这道题主要考核的还是python的zip和set的用法,如果对这两个熟悉的话就可以很容易的实现。

21620
来自专栏风吹杨柳

keras量化分析之路(1)--DataFrame格式数据

写在开头: 今天正是开始量化之路,选择keras+tushare这两个好东西

12210
来自专栏SAMshare

【LeetCode07】旋转矩阵(一)

题目的意思我这里在解释一下,其实就是按照指定方向,螺旋地输出所有的矩阵元素,如下面的矩阵:(从11开始,到23结束)

19910
来自专栏风吹杨柳

opencv 9 -- 轮廓 找 和 画

轮廓可以简单认为成将连续的点(连着边界)连在一起的曲线,具有相同的颜色或者灰度。 轮廓在形状分析和物体的检测和识别中很有用

14540
来自专栏侯哥的Python分享

python算法与数据结构-队列(44)

  队列的定义:队列是一种特殊的线性表,只允许在表的头部(front处)进行删除操作,在表的尾部(rear处)进行插入操作的线性数据结构,这种结构就叫做队列。进...

11920
来自专栏机器学习与python集中营

深度学习中常用的损失函数loss有哪些?

这是专栏《AI初识境》的第11篇文章。所谓初识,就是对相关技术有基本了解,掌握了基本的使用方法。

2.7K20
来自专栏Bypass

当sqlmap跑不出数据怎么办

你有没有遇到这样的场景,好不容易找到了一个SQL注入点,扔到SqlMap,爆错,怎么也跑不出数据。

12330
来自专栏北京宏哥

Appium+python自动化(十一)- 元素定位秘籍助你打通任督二脉 - 下卷(超详解)

  宏哥看你骨骼惊奇,印堂发亮,必是练武之奇才! 按照上一篇的节目预告,这一篇还是继续由宏哥给小伙伴们分享元素定位,是不是按照上一篇的秘籍修炼,是不是感觉到头顶...

28840
来自专栏快乐学Python

python 多线程入门 | 示例 | 新手教程

对于python 多线程的理解,我花了很长时间,搜索的大部份文章都不够通俗易懂。所以,这里力图用简单的例子,让你对多线程有个初步的认识。

14250
来自专栏Bypass

基于端口的弱口令检测工具--iscan

亲手打造了一款基于端口的弱口令检测工具,使用python进行编写,主要可以用于渗透测试中常见服务端口弱口令的检测。目前支持以下服务:

30440

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励