专栏首页MeteoAI使用Python处理NetCDF格式文件

使用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),作者:none

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

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

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 数据处理利器pandas入门

    想入门 Pandas,那么首先需要了解Pandas中的数据结构。因为Pandas中数据操作依赖于数据结构对象。Pandas中最常用的数据结构是 Series ...

    zhangqibot
  • Metpy新版功能下载TLnP图设置

    用于天气绘图的Metpy包更新(0.8版本)了,他们要逐渐抛弃Python2.X,转到Python>=3.6的版本上。所以,之前(越2018年6月以前,0.7版...

    zhangqibot
  • Python绘制气象实用地图(附代码和测试数据)

    前面的推文对于常用的Python绘图工具都有了一些介绍,在这里就不赘述了。本文主要就以下几个方面:“中国区域绘图”、“包含南海”、“兰伯特投影带经纬度标签”、“...

    zhangqibot
  • React第三方组件4(状态管理之Reflux的使用④TodoList下)

    本教程总共5篇,每日更新一篇,请关注我们!你可以进入历史消息查看以往文章,也敬请期待我们的新文章! 1、React第三方组件4(状态管理之Reflux的使用①...

    前端人人
  • 抢占系统调用执行时间过长的goroutine(22)

    本文是《Go语言调度器源代码情景分析》系列的第22篇,也是第六章《抢占调度》的第2小节。

    阿波张
  • 第3篇:用MACS2软件call peaks

    Peak calling即利用计算的方法找出ChIP-seq或ATAC-seq中reads富集的基因组区域。

    生信技能树
  • 爬取knewone上的信息-- coding: utf-8 -

    爬取knewone上的信息 <pre> author = 'LEE' -- coding: utf-8 - from bs4 import Beautif...

    98k
  • 校招助手数据存储PyMySQL

    之前做了招聘会信息提醒之微信机器人,微信群已经建了5个,总体的用户大概有不到两千人。小目标是让西电今年找工作的人都能用上。 和几个小伙伴一拍即合,做个小程序吧!...

    一点儿也不潇洒
  • 2019 AI 安防:机会、战争、活下去

    行业剧变、机会遍地、欲望蔓延,同时不确定性骤增,形态各异的欢喜、悲伤、期待、遗憾,构成了一幅独属于2019年的浮世绘。

    AI掘金志
  • 关于正整数、质数与公因数及哥德巴赫猜想

    张风捷特烈

扫码关注云+社区

领取腾讯云代金券