气象数据的常用格式以及处理的工具

2019-07-24 15:55:29 浏览数 (1)

  这次我们来简单了解下气象数据常用的格式以及处理的工具,常用的数据格式包括普通的二进制格式、文本数据、NetCDF、HDF4/5以及GRIB1/2数据。我们可以利用编程语言例如python、matlab以及c语言,根据数据的说明文档或者相应的数据api开发文档进行读取,此外我们也可以根据提供的command命令行进行高效提取数据。

二进制文件和文本数据

  气象中的二进制文件是指利用ASCII及扩展ASCII字符编写的数据或程序指令的文件,一般没有格式,用文本编辑器打开只能看到无意义的乱码,需要特定的解码说明才能使用,例如气象雷达的数据;文本数据的以记录的形式存在,每一条记录是以ASCIIVS的回车符CR(OD)加换行符LF(OA)来结束的,可以用文本编辑器查看,但也需要变量的说明文档,例如NOAA提供的ghcn以及isd数据都需要进行处理提取数据 IR000407540.dly 文本数据 IR000407540194406PRCP -9999 -9999 10 S 0 S-9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 -9999 - python

代码语言:javascript复制
With open("IR000407540.dly") as file:
    lines = file.readlines()
    for line in lines:
    if (line[17:21] == "PRCP"):
        SID = line[0:11]
        YEAR_MON = line[11:17]

linux/unix cat IR000407540.dly | awk -F' ' '{print($1)}'

NetCDF(Network Common Data Form)

  NetCDF数据是常用的气象和卫星数据存储的数据格式,结构形式包含维数、变量、属性和数据四个子域,公众号前几期有过利用python对netCDF数据处理的介绍,有感兴趣的同学可以关注公众号查看历史精彩文章使用python处理NetCDF格式文件,这里介绍大家利用CDO如何处理netCDF格式的文件   CDO(Climate Data Operators)是用来处理气候数据的命令行的集合,支持netCDF3/4以及Grib1/2数据格式,常用功能:

代码语言:javascript复制
cdo info a.nc  ###查看文件信息
cdo -f grb copy a.nc a.grb
cdo -f nc copy a.grb a.nc ###grb和nc文件转换
cdo mergetime *nc test.nc ###合并netCDF文件
cdo -selyear,2019 -selmonth,01 -selday,25 -seltime,08:00 -remapnn,lon=121_lat=43 a.nc ###选择特定时间特定点的数据
cdo -outputtab,loa,lat,date,value a.nc > a.txt ###以表格形式江nc文件输出 
代码语言:javascript复制
#python调用cdo
from cdo import *
cdo=Cdo()
cdo.infov(input=ifile)
cdo.showlevel(input=ifile)

GRIB1和GRIB2文件

  GRIB(GRIdded Binary)和GRIB2(General Regularly-distributed Information in Binary Form)是与计算机无关的压缩的二进制编码,主要用来存放数值天气分析和预报产品资料。处理grib文件的常用工具包pygrib,Grib格式数据处理有详细介绍,gribapi也自带python接口,可以通过ECMWF提供的ecCodes或cgrib安装包进行安装使用。此外利用wgrib以及wgrib2命令行工具也可以高效处理grib文件。

代码语言:javascript复制
###wgrib2命令行
wgrib2 -d 56 a.grb2 -netcdf a.nc ###将grib文件转位nc文件
wgrib2 a.grb2 -d 1 -s -lon 249 39 -lon 255 33 ###提取过后经纬度点的数值
wgrib2 a.grb2 -set_grib_type c2 -small_grib 109:110 35:37 a_china.grb2 ###将文件裁剪到中国区域范围
代码语言:javascript复制
###eccodes包
import eccodes
import gribapi
with GribFile(filename) as grib:
    len(grib)
    for msg in grib:
        print(msg[key_name])
代码语言:javascript复制
###cfgrib包
import cfgrib
ds = cfgrib.open_file('era5-levels-members.grib')
ds.attributes['GRIB_edition']
代码语言:javascript复制
###利用xarray和cfgrib直接读取为数组
import xarray as xr
ds = xr.open_dataset('era5-levels-members.grib', engine='cfgrib')

HDF、HDF-EOS、HDF5和HDF-EOS5

  HDF(Hierarchical Data Format)数据格式是一种具有自描述性、可扩展性、自我组织形的数据存储格式。HDF5数据克服了HDF4的不足,可以支持超过2G大小的文件,以及并行I/O;HDF-EOS是NASA开发专门处理EOS产品,可以有效的存储地理定位数据。HDF、HDF-EOS、HDF5和HDF-EOS5数据多用于卫星资料的存储和发布。

代码语言:javascript复制
###读取NASA AIRS HDF-EOS2文件
from pyhdf.SD import SD, SDC
# Open file.
FILE_NAME = 'AIRS.2002.08.01.L3.RetStd_H031.v4.0.21.0.G06104133732.hdf'
with SD(FILE_NAME, SDC.READ) as hdf:
    # List available SDS datasets.
    print(hdf.datasets())
    # Read dataset.
    DATAFIELD_NAME='RelHumid_A'
    data3D = hdf.select(DATAFIELD_NAME)
    data = data3D[11,:,:]
    # Read geolocation dataset.
    lat = hdf.select('Latitude')
    latitude = lat[:,:]
    lon = hdf.select('Longitude')
    longitude = lon[:,:]
代码语言:javascript复制
###读取 OMI L3 version 2 product HDF-EOS5的数据
import h5py
FILE_NAME = 'OMI-Aura_L3-OMTO3e_2005m1214_v002-2006m0929t143855.he5'
DATAFIELD_NAME = '/HDFEOS/GRIDS/OMI Column Amount O3/Data Fields/ColumnAmountO3'
with h5py.File(FILE_NAME, mode='r') as f: 
    #List available datasets.
    print(f.keys())
    # Read dataset.
    dset = f[DATAFIELD_NAME]
    data = dset[:]

常用气象格式的数据读取及可视化 https://code.mpimet.mpg.de/projects/cdo/wiki https://confluence.ecmwf.int/pages/viewpage.action?pageId=7374715 https://hdfeos.org/index.php

0 人点赞