这次我们来简单了解下气象数据常用的格式以及处理的工具,常用的数据格式包括普通的二进制格式、文本数据、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