Herbie 是一个 Python 包,用于从不同的云存档源下载最近和存档的数值天气预报(NWP)模型输出。NWP 数据以 GRIB2 格式分发,Herbie 使用 xarray
和 cfgrib
读取这些数据。Herbie 还提供了一些额外的功能,帮助用户可视化和提取数据。
下面将展示简单介绍该库功能,并实战下载HRRR数据与可视化
!pip install herbie-data -i https://pypi.mirrors.ustc.edu.cn/simple/
Herbie 可以帮助你发现、下载和读取以下模型的数据:
这些数据大多通过 NOAA 开放数据传播(NODD)计划提供,使得天气数据比以往任何时候都更容易获取。
最简单的安装方式是通过 conda-forge
安装 Herbie 及其依赖项:
conda install -c conda-forge herbie-data
你也可以使用提供的 Conda 环境文件 environment.yml
来创建环境:
# 下载环境文件
wget https://github.com/blaylockbk/Herbie/raw/main/environment.yml
# 创建环境
conda env create -f environment.yml
# 激活环境
conda activate herbie
Herbie 也可以通过 PyPI 安装,但需要手动安装一些依赖项:
安装依赖项后,可以使用 pip 安装 Herbie:
# 安装最新发布版本
pip install herbie-data
# 或者安装最新开发版本
pip install git+https://github.com/blaylockbk/Herbie.git
# 安装额外功能的依赖项
pip install herbie-data[extra]
xarray
读取数据。from herbie import Herbie
# 创建 HRRR 模型 6 小时地面预报产品的 Herbie 对象
H = Herbie(
'2021-01-01 12:00',
model='hrrr',
product='sfc',
fxx=6
)
# 查看文件内容
H.inventory()
# 下载完整的 GRIB2 文件
H.download()
# 下载子集,例如所有 500 mb 的字段
H.download(":500 mb")
# 使用 xarray 读取子集,例如 2 米温度
H.xarray("TMP:2 m")
╭─[48;2;255;255;255m[38;2;136;33;27m▌[0m[38;2;12;53;118m[48;2;240;234;210m▌[38;2;0;0;0m[1mHerbie[0m─────────────────────────────────────────────╮
│ INFO: Created a default config file. │
│ You may view/edit Herbie's configuration here: │
│ [38;2;255;153;0m /home/mw/.config/herbie/config.toml [0m │
╰──────────────────────────────────────────────────────╯
✅ Found ┊ model=hrrr ┊ [3mproduct=sfc[0m ┊ [38;2;41;130;13m2021-Jan-01 12:00 UTC[92m F06[0m ┊ [38;2;255;153;0m[3mGRIB2 @ aws[0m ┊ [38;2;255;153;0m[3mIDX @ aws[0m
👨🏻🏭 Created directory: [/home/mw/data/hrrr/20210101]
!ls /home/mw/data/hrrr/20210101
hrrr.t12z.wrfsfcf06.grib2 subset_8fb2be61__hrrr.t12z.wrfsfcf06.grib2
import xarray as xr
ds = xr.open_dataset('/home/mw/data/hrrr/20210101/hrrr.t12z.wrfsfcf06.grib2',engine ='cfgrib',
filter_by_keys={'stepType': 'instant', 'typeOfLevel': 'surface'})
print(ds)
<xarray.Dataset> Size: 305MB
Dimensions: (y: 1059, x: 1799)
Coordinates:
time datetime64[ns] 8B ...
step timedelta64[ns] 8B ...
surface float64 8B ...
latitude (y, x) float64 15MB ...
longitude (y, x) float64 15MB ...
valid_time datetime64[ns] 8B ...
Dimensions without coordinates: y, x
Data variables: (12/36)
vis (y, x) float32 8MB ...
gust (y, x) float32 8MB ...
sp (y, x) float32 8MB ...
orog (y, x) float32 8MB ...
t (y, x) float32 8MB ...
cnwat (y, x) float32 8MB ...
... ...
cfnsf (y, x) float32 8MB ...
vbdsf (y, x) float32 8MB ...
vddsf (y, x) float32 8MB ...
blh (y, x) float32 8MB ...
lsm (y, x) float32 8MB ...
siconc (y, x) float32 8MB ...
Attributes:
GRIB_edition: 2
GRIB_centre: kwbc
GRIB_centreDescription: US National Weather Service - NCEP
GRIB_subCentre: 0
Conventions: CF-1.7
institution: US National Weather Service - NCEP
history: 2025-02-09T11:34 GRIB to CDM+CF via cfgrib-0.9.1...
import cmaps
import matplotlib.pyplot as plt
import cartopy.crs as ccrs
import cartopy.feature as cfeature
from cartopy.io.shapereader import BasicReader
from cartopy.mpl.gridliner import LONGITUDE_FORMATTER, LATITUDE_FORMATTER
# 创建绘图对象
fig, ax = plt.subplots(figsize=(18, 4), subplot_kw={'projection': ccrs.PlateCarree()},dpi=200)
gl = ax.gridlines(crs=ccrs.PlateCarree(), draw_labels=True, linewidth=1.2, color='gray', alpha=0.5, linestyle='--')
gl.top_labels = False
gl.right_labels = False
gl.xformatter = LONGITUDE_FORMATTER
gl.yformatter = LATITUDE_FORMATTER
# 绘制要素分布
im = ax.contourf(ds.longitude , ds.latitude , ds.sp, levels=10, cmap=cmaps.WhiteBlue,
transform=ccrs.PlateCarree())
# 添加标题
ax.set_title('HRRR SP')
# 增加地图
ax.coastlines(resolution='50m', lw=0.5)
ax.add_feature(cfeature.OCEAN.with_scale('50m'))
ax.add_feature(cfeature.LAND.with_scale('50m'))
#色标
cax = fig.add_axes([0.7, 0.1, 0.02, 0.6])
cbar = fig.colorbar(im, cax=cax, orientation='vertical', shrink=0.8, pad=0.05)
cbar.set_label('sp')
plt.show()
有这个库大家获取数值天气预报方便很多,就是网络不太好,下载速度比较感人
另外读取的话还是直接用xarray,Herbie转换的速度比较慢
怎么读取grib可以参考我的往期文章,去个人主页搜grib即可