前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >气象数据处理:NetCDF文件处理

气象数据处理:NetCDF文件处理

作者头像
bugsuse
发布2020-04-21 17:37:48
4.6K0
发布2020-04-21 17:37:48
举报
文章被收录于专栏:气象杂货铺

NetCDF文件是自描述的二进制数据格式。所谓自描述就是自带属性信息,这和一般的雷达基数据格式不同,一般的雷达数据也是二进制的,但不是自描述的,而是需要额外的数据格式文档来说明数据格式,而NetCDF文件中包含了描述变量和维度的元数据信息。通常包含以下三个部分:

  • 维度
  • 变量
  • 属性

维度部分记录的是每个变量的维度名及长度,而变量包含了维度,属性(如数据单位)信息及变量的值。属性部分包含了一些额外信息,比如文件创建者等。

很多工具都可以处理NetCDF文件,比如MATLAB,Python,NCL,GrADS,CDO,NCO,Panoply等等。这里主要讲一下如何利用MATLAB,Python,NCL处理NetCDF文件。

Python

python中有多个库提供了处理NetCDF文件的功能,比如专门处理nc数据的netCDF4-python,scipy,osgeo,PyNIO(Linux)等。

  • netCDF4-python

使用 netCDF4-python处理nc数据是非常方便的,而且其提供了非常多的功能,并且正在不断的完善。关于netCDF4-python库的介绍,之前已经提到了 netcdf4-python 模块详解,还有这里这里使用 Cartopy 和 netCDF4 可视化 WRF 模式数据

下面以一个例子来讲述一下如何处理nc数据:

代码语言:javascript
复制
# 加载库
import netCDF4 as nc

data = nc.Dataset("wrfout_v2_Lambert.nc", "r")

# 输出文件中变量
print(data.variables.keys())

# 读取变量
lon = data.variables["XLONG"]
lat = data.variables["XLAT"]
sst = data.variables["SST"]

## 通过指定索引获取变量部分数据
# lon = data.variables["XLONG"][1, :, :]
# lat = data.variables["XLAT"][1, :, :]
# sst = data.variables["SST"][1, :, :]
  • scipy

scipy 库中的io模块同样提供了 netcdf 文件处理方法,其所使用的外部模块和 netCDF4-python 使用的相同,都不需要使用 Unidata 提供的 netcdf C库。

代码语言:javascript
复制
import scipy.io as spio

data = spio.netcdf_file("wrfout_v2_Lambert.nc", "r")
# data = spio.netcdf.netcdf_file("wrfout_v2_Lambert.nc", "r")

# 输出文件中变量信息
data.variables.keys()
Out[95]: dict_keys(['SFROFF', 'DN', 'SH2O', 'TMN', 'UDROFF', 'RDY', 'ITIMESTEP', 'HGT', 'RDX', 'PSFC', 'W', 'V', 'MU', 'QVAPOR', 'SMOIS', 'CF1', 'MAPFAC_U', 'HFX', 'DNW', 'SINALPHA', 'QFX', 'SNOWC', 'PB', 'CFN1', 'VEGFRA', 'MAPFAC_V', 'EPSTS', 'XLONG', 'F', 'XICE', 'COSALPHA', 'E', 'P_TOP', 'ZNW', 'QRAIN', 'SST', 'TSLB', 'RDNW', 'XLAND', 'RAINC', 'SNOW', 'U', 'FNM', 'LANDMASK', 'MAPFAC_M', 'ZNU', 'ZETATOP', 'PHB', 'SNOWH', 'TH2', 'Q2', 'RDN', 'QCLOUD', 'DZS', 'V10', 'RESM', 'TSK', 'CF3', 'RAINNC', 'XLAT', 'GLW', 'ISLTYP', 'P', 'PH', 'T', 'CANWAT', 'IVGTYP', 'CFN', 'CF2', 'MUB', 'LU_INDEX', 'Times', 'FNP', 'SWDOWN', 'PBLH', 'GRDFLX', 'T2', 'U10', 'LH', 'ZS'])

# 读取变量数据,获取变量数据的方式和 netCDF4-python 相同
lon = data.variables["XLONG"]
lat = data.variables["XLAT"]
sst = data.variables["SST"]
  • osgeo.gdal 模块

具体的应用见这里 Basemap系列教程:读取WRF模式数据

代码语言:javascript
复制
# 加载模块
from osgeo import gdal

# 读取方式略有不同
#  'NETCDF:"' + filename + '":Varname'

lon = gdal.Open('NETCDF:"'+ "wrfout_v2_Lambert.nc" + '":XLONG')
lat = gdal.Open('NETCDF:"'+ "wrfout_v2_Lambert.nc" + '":XLAT')
sst = gdal.Open('NETCDF:"'+ "wrfout_v2_Lambert.nc" + '":SST')

但是按照上述方式读取出变量之外,无法直接用于绘图和其他处理,因为变量类型和之前的方法输出的变量类型不同:

代码语言:javascript
复制
type(lon)
Out[106]: osgeo.gdal.Dataset

获取数据可以通过以下方式:

代码语言:javascript
复制
# 获取变量数据
lon_value = lon.ReadAsArray()

lon_value.shape
Out[111]: (13, 60, 73)

type(lon_value)
Out[112]: numpy.ndarray

获取变量数据后,得到的数组同样是 numpy.ndarray 数组。

MATLAB

matlab中提供了处理netcdf文件的包,但是只有2011年之后的版本内置了改包。

读取数据之前,可以先查看以下文件中包含了哪些信息:

代码语言:javascript
复制
ncinfo('F:\wrfout_v2_Lambert.nc');

数据信息为结构体,其中包含了各维度信息,包含的变量及属性等信息。Format 表示文件格式为 classic netcdf文件。

知道变量信息之后就可以读取变量了:

代码语言:javascript
复制
lon = ncread('F:\wrfout_v2_Lambert.nc', 'XLONG');
lat = ncread('F:\wrfout_v2_Lambert.nc', 'XLAT');
sst = ncread('F:\wrfout_v2_Lambert.nc', 'SST');

读取数据之后,在变量空间可以查看关于变量的一些信息,比如维度大小。

NCL

ncl处理netcdf文件的方法同样非常简单,这里仅简单介绍一下:

代码语言:javascript
复制
data = addfile("wrfout_v2_Lambert.nc", "r")

lon = data->XLONG
lat = data->XLAT
sst = data->SST

; 当然也可以通过索引获取部分数据
lon = data->XLONG(1, :, :)
lat = data->XLAT(1, :, :)
sst = data->SST(1, :, :)

以上三种方法均可以处理netcdf文件,根据不同的需要使用不同的方法。此节仅记录了怎么读netcdf文件,关于如何写netcdf文件下次再说。

除了上述三种工具之外,CDO和NCO在处理netcdf文件时有时会非常有用,关于这两部分的介绍有空再说。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2017-06-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 气象杂货铺 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档