Brian Blaylock
August 10, 2022
NAM Data#
This tutorial shows you how to download NAM data from Amazon (and other sources) with the Herbie Python package.
[1]:
from herbie.archive import Herbie
from toolbox.cartopy_tools import common_features, pc
from paint.standard2 import cm_tmp
import matplotlib.pyplot as plt
import cartopy.crs as ccrs
🥳 Herbie loaded your custom templates.
[4]:
H = Herbie("2022-08-10", model="nam", fxx=6, priority="nomads")
✅ Found ┊ model=nam ┊ product=conusnest.hiresf ┊ 2022-Aug-10 00:00 UTC F06 ┊ GRIB2 @ nomads ┊ IDX @ nomads
[5]:
ds = H.xarray("TMP:2 m above")
ds
[5]:
<xarray.Dataset> Dimensions: (y: 1059, x: 1799) Coordinates: time datetime64[ns] 2022-08-10 step timedelta64[ns] 06:00:00 heightAboveGround float64 2.0 latitude (y, x) float64 21.14 21.14 21.15 ... 47.86 47.85 47.84 longitude (y, x) float64 237.3 237.3 237.3 ... 299.0 299.0 299.1 valid_time datetime64[ns] 2022-08-10T06:00:00 Dimensions without coordinates: y, x Data variables: t2m (y, x) float32 295.0 295.0 294.9 ... 290.4 290.4 290.4 gribfile_projection object None 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 model: nam product: conusnest.hiresf description: North America Mesoscale - CONUS remote_grib: https://nomads.ncep.noaa.gov/pub/data/nccf/com/n... local_grib: /p/cwfs/blaylock/data/nam/20220810/subset_6765c0... searchString: TMP:2 m above
[7]:
ax = common_features("50m", crs=ds.herbie.crs, figsize=[8, 8]).STATES().ax
p = ax.pcolormesh(
ds.longitude, ds.latitude, ds.t2m, transform=pc, **cm_tmp(units="K").cmap_kwargs
)
plt.colorbar(
p, ax=ax, orientation="horizontal", pad=0.05, **cm_tmp(units="K").cbar_kwargs
)
ax.set_title(
f"{ds.model.upper()}: {H.product_description} ({H.product})\nValid: {ds.valid_time.dt.strftime('%H:%M UTC %d %b %Y').item()}",
loc="left",
)
ax.set_title(ds.t2m.GRIB_name, loc="right")
[7]:
Text(1.0, 1.0, '2 metre temperature')

Cycle through all products:#
[44]:
def plot_product(product):
H = Herbie("2022-08-10", model="nam", fxx=6, product=product)
ds = H.xarray("TMP:2 m above")
ax = common_features("50m", crs=ds.herbie.crs, figsize=[8, 8]).STATES().ax
p = ax.pcolormesh(
ds.longitude, ds.latitude, ds.t2m, transform=pc, **cm_tmp(units="K").cmap_kwargs
)
plt.colorbar(
p, ax=ax, orientation="horizontal", pad=0.05, **cm_tmp(units="K").cbar_kwargs
)
ax.set_title(
f"{ds.model.upper()}: {H.product_description} ({product})\nValid: {ds.valid_time.dt.strftime('%H:%M UTC %d %b %Y').item()}",
loc="left",
)
ax.set_title(ds.t2m.GRIB_name, loc="right")
return H, ds, ax
[45]:
H.PRODUCTS.keys()
[45]:
dict_keys(['conusnest.hiresf', 'firewxnest.hiresf', 'alaskanest.hiresf', 'hawaiinest.hiresf', 'priconest.hiresf', 'afwaca'])
[21]:
H, ds, ax = plot_product("conusnest.hiresf")
✅ Found ┊ model=nam ┊ product=conusnest.hiresf ┊ 2022-Aug-10 00:00 UTC F06 ┊ GRIB2 @ aws ┊ IDX @ aws

[22]:
H, ds, ax = plot_product("firewxnest.hiresf")
✅ Found ┊ model=nam ┊ product=firewxnest.hiresf ┊ 2022-Aug-10 00:00 UTC F06 ┊ GRIB2 @ aws ┊ IDX @ aws

[25]:
H, ds, ax = plot_product("alaskanest.hiresf")
✅ Found ┊ model=nam ┊ product=alaskanest.hiresf ┊ 2022-Aug-10 00:00 UTC F06 ┊ GRIB2 @ aws ┊ IDX @ aws

[27]:
# NOTE: Weirdness with Hawaii not returning as a grid, but as a line
# NOTE: NEEDS TO BE RESHAPED
H, ds, ax = plot_product("hawaiinest.hiresf")
✅ Found ┊ model=nam ┊ product=hawaiinest.hiresf ┊ 2022-Aug-10 00:00 UTC F06 ┊ GRIB2 @ aws ┊ IDX @ aws
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
/p/home/blaylock/BB_python/Herbie/docs/user_guide/notebooks/data_nam.ipynb Cell 13 in <cell line: 1>()
----> <a href='vscode-notebook-cell://ssh-remote%2Bkoehr03.navydsrc.hpc.mil/p/home/blaylock/BB_python/Herbie/docs/user_guide/notebooks/data_nam.ipynb#X30sdnNjb2RlLXJlbW90ZQ%3D%3D?line=0'>1</a> H, ds, ax = plot_product('hawaiinest.hiresf')
/p/home/blaylock/BB_python/Herbie/docs/user_guide/notebooks/data_nam.ipynb Cell 13 in plot_product(product)
<a href='vscode-notebook-cell://ssh-remote%2Bkoehr03.navydsrc.hpc.mil/p/home/blaylock/BB_python/Herbie/docs/user_guide/notebooks/data_nam.ipynb#X30sdnNjb2RlLXJlbW90ZQ%3D%3D?line=3'>4</a> ds = H.xarray("TMP:2 m")
<a href='vscode-notebook-cell://ssh-remote%2Bkoehr03.navydsrc.hpc.mil/p/home/blaylock/BB_python/Herbie/docs/user_guide/notebooks/data_nam.ipynb#X30sdnNjb2RlLXJlbW90ZQ%3D%3D?line=5'>6</a> ax = common_features("50m", crs=ds.herbie.crs, figsize=[8, 8]).STATES().ax
----> <a href='vscode-notebook-cell://ssh-remote%2Bkoehr03.navydsrc.hpc.mil/p/home/blaylock/BB_python/Herbie/docs/user_guide/notebooks/data_nam.ipynb#X30sdnNjb2RlLXJlbW90ZQ%3D%3D?line=6'>7</a> p = ax.pcolormesh(
<a href='vscode-notebook-cell://ssh-remote%2Bkoehr03.navydsrc.hpc.mil/p/home/blaylock/BB_python/Herbie/docs/user_guide/notebooks/data_nam.ipynb#X30sdnNjb2RlLXJlbW90ZQ%3D%3D?line=7'>8</a> ds.longitude, ds.latitude, ds.t2m, transform=pc, **cm_tmp(units="K").cmap_kwargs
<a href='vscode-notebook-cell://ssh-remote%2Bkoehr03.navydsrc.hpc.mil/p/home/blaylock/BB_python/Herbie/docs/user_guide/notebooks/data_nam.ipynb#X30sdnNjb2RlLXJlbW90ZQ%3D%3D?line=8'>9</a> )
<a href='vscode-notebook-cell://ssh-remote%2Bkoehr03.navydsrc.hpc.mil/p/home/blaylock/BB_python/Herbie/docs/user_guide/notebooks/data_nam.ipynb#X30sdnNjb2RlLXJlbW90ZQ%3D%3D?line=9'>10</a> plt.colorbar(
<a href='vscode-notebook-cell://ssh-remote%2Bkoehr03.navydsrc.hpc.mil/p/home/blaylock/BB_python/Herbie/docs/user_guide/notebooks/data_nam.ipynb#X30sdnNjb2RlLXJlbW90ZQ%3D%3D?line=10'>11</a> p, ax=ax, orientation="horizontal", pad=0.05, **cm_tmp(units="K").cbar_kwargs
<a href='vscode-notebook-cell://ssh-remote%2Bkoehr03.navydsrc.hpc.mil/p/home/blaylock/BB_python/Herbie/docs/user_guide/notebooks/data_nam.ipynb#X30sdnNjb2RlLXJlbW90ZQ%3D%3D?line=11'>12</a> )
<a href='vscode-notebook-cell://ssh-remote%2Bkoehr03.navydsrc.hpc.mil/p/home/blaylock/BB_python/Herbie/docs/user_guide/notebooks/data_nam.ipynb#X30sdnNjb2RlLXJlbW90ZQ%3D%3D?line=13'>14</a> ax.set_title(
<a href='vscode-notebook-cell://ssh-remote%2Bkoehr03.navydsrc.hpc.mil/p/home/blaylock/BB_python/Herbie/docs/user_guide/notebooks/data_nam.ipynb#X30sdnNjb2RlLXJlbW90ZQ%3D%3D?line=14'>15</a> f"{ds.model.upper()}: {H.product_description} ({product})\nValid: {ds.valid_time.dt.strftime('%H:%M UTC %d %b %Y').item()}",
<a href='vscode-notebook-cell://ssh-remote%2Bkoehr03.navydsrc.hpc.mil/p/home/blaylock/BB_python/Herbie/docs/user_guide/notebooks/data_nam.ipynb#X30sdnNjb2RlLXJlbW90ZQ%3D%3D?line=15'>16</a> loc="left",
<a href='vscode-notebook-cell://ssh-remote%2Bkoehr03.navydsrc.hpc.mil/p/home/blaylock/BB_python/Herbie/docs/user_guide/notebooks/data_nam.ipynb#X30sdnNjb2RlLXJlbW90ZQ%3D%3D?line=16'>17</a> )
File ~/anaconda3/envs/herbie/lib/python3.10/site-packages/cartopy/mpl/geoaxes.py:318, in _add_transform.<locals>.wrapper(self, *args, **kwargs)
313 raise ValueError(f'Invalid transform: Spherical {func.__name__} '
314 'is not supported - consider using '
315 'PlateCarree/RotatedPole.')
317 kwargs['transform'] = transform
--> 318 return func(self, *args, **kwargs)
File ~/anaconda3/envs/herbie/lib/python3.10/site-packages/cartopy/mpl/geoaxes.py:1796, in GeoAxes.pcolormesh(self, *args, **kwargs)
1785 """
1786 Add the "transform" keyword to :func:`~matplotlib.pyplot.pcolormesh`.
1787
(...)
1792
1793 """
1794 # Add in an argument checker to handle Matplotlib's potential
1795 # interpolation when coordinate wraps are involved
-> 1796 args, kwargs = self._wrap_args(*args, **kwargs)
1797 result = matplotlib.axes.Axes.pcolormesh(self, *args, **kwargs)
1798 # Wrap the quadrilaterals if necessary
File ~/anaconda3/envs/herbie/lib/python3.10/site-packages/cartopy/mpl/geoaxes.py:1825, in GeoAxes._wrap_args(self, *args, **kwargs)
1823 X = np.asanyarray(args[0])
1824 Y = np.asanyarray(args[1])
-> 1825 nrows, ncols = np.asanyarray(args[2]).shape
1826 Nx = X.shape[-1]
1827 Ny = Y.shape[0]
ValueError: not enough values to unpack (expected 2, got 1)

[29]:
ds = Herbie("2022-08-10", model="nam", product="hawaiinest.hiresf").xarray("TMP:2 m")
ds
✅ Found ┊ model=nam ┊ product=hawaiinest.hiresf ┊ 2022-Aug-10 00:00 UTC F00 ┊ GRIB2 @ aws ┊ IDX @ aws
[29]:
<xarray.Dataset> Dimensions: (values: 72225) Coordinates: time datetime64[ns] 2022-08-10 step timedelta64[ns] 00:00:00 heightAboveGround float64 2.0 latitude (values) float64 18.07 18.07 18.07 ... 23.09 23.09 longitude (values) float64 198.5 198.5 198.5 ... 206.1 206.1 valid_time datetime64[ns] 2022-08-10 Dimensions without coordinates: values Data variables: t2m (values) float32 299.8 299.8 299.8 ... 299.0 299.0 gribfile_projection object None 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 model: nam product: hawaiinest.hiresf description: North America Mesoscale - CONUS remote_grib: https://noaa-nam-pds.s3.amazonaws.com/nam.202208... local_grib: /p/cwfs/blaylock/data/nam/20220810/subset_93f271... searchString: TMP:2 m
[35]:
plt.scatter(ds.longitude, ds.latitude, ds.t2m, c=ds.t2m, marker=".")
[35]:
<matplotlib.collections.PathCollection at 0x2b9d74366350>

[46]:
# NOTE: Weirdness with Puerto Rico not returning as a grid, but as a line
H, ds, ax = plot_product("priconest.hiresf")
✅ Found ┊ model=nam ┊ product=priconest.hiresf ┊ 2022-Aug-10 00:00 UTC F06 ┊ GRIB2 @ aws ┊ IDX @ aws
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
/p/home/blaylock/BB_python/Herbie/docs/user_guide/notebooks/data_nam.ipynb Cell 16 in <cell line: 3>()
<a href='vscode-notebook-cell://ssh-remote%2Bkoehr03.navydsrc.hpc.mil/p/home/blaylock/BB_python/Herbie/docs/user_guide/notebooks/data_nam.ipynb#X33sdnNjb2RlLXJlbW90ZQ%3D%3D?line=0'>1</a> # NOTE: Weirdness with Puerto Rico not returning as a grid, but as a line
----> <a href='vscode-notebook-cell://ssh-remote%2Bkoehr03.navydsrc.hpc.mil/p/home/blaylock/BB_python/Herbie/docs/user_guide/notebooks/data_nam.ipynb#X33sdnNjb2RlLXJlbW90ZQ%3D%3D?line=2'>3</a> H, ds, ax = plot_product('priconest.hiresf')
/p/home/blaylock/BB_python/Herbie/docs/user_guide/notebooks/data_nam.ipynb Cell 16 in plot_product(product)
<a href='vscode-notebook-cell://ssh-remote%2Bkoehr03.navydsrc.hpc.mil/p/home/blaylock/BB_python/Herbie/docs/user_guide/notebooks/data_nam.ipynb#X33sdnNjb2RlLXJlbW90ZQ%3D%3D?line=3'>4</a> ds = H.xarray("TMP:2 m above")
<a href='vscode-notebook-cell://ssh-remote%2Bkoehr03.navydsrc.hpc.mil/p/home/blaylock/BB_python/Herbie/docs/user_guide/notebooks/data_nam.ipynb#X33sdnNjb2RlLXJlbW90ZQ%3D%3D?line=5'>6</a> ax = common_features("50m", crs=ds.herbie.crs, figsize=[8, 8]).STATES().ax
----> <a href='vscode-notebook-cell://ssh-remote%2Bkoehr03.navydsrc.hpc.mil/p/home/blaylock/BB_python/Herbie/docs/user_guide/notebooks/data_nam.ipynb#X33sdnNjb2RlLXJlbW90ZQ%3D%3D?line=6'>7</a> p = ax.pcolormesh(
<a href='vscode-notebook-cell://ssh-remote%2Bkoehr03.navydsrc.hpc.mil/p/home/blaylock/BB_python/Herbie/docs/user_guide/notebooks/data_nam.ipynb#X33sdnNjb2RlLXJlbW90ZQ%3D%3D?line=7'>8</a> ds.longitude, ds.latitude, ds.t2m, transform=pc, **cm_tmp(units="K").cmap_kwargs
<a href='vscode-notebook-cell://ssh-remote%2Bkoehr03.navydsrc.hpc.mil/p/home/blaylock/BB_python/Herbie/docs/user_guide/notebooks/data_nam.ipynb#X33sdnNjb2RlLXJlbW90ZQ%3D%3D?line=8'>9</a> )
<a href='vscode-notebook-cell://ssh-remote%2Bkoehr03.navydsrc.hpc.mil/p/home/blaylock/BB_python/Herbie/docs/user_guide/notebooks/data_nam.ipynb#X33sdnNjb2RlLXJlbW90ZQ%3D%3D?line=9'>10</a> plt.colorbar(
<a href='vscode-notebook-cell://ssh-remote%2Bkoehr03.navydsrc.hpc.mil/p/home/blaylock/BB_python/Herbie/docs/user_guide/notebooks/data_nam.ipynb#X33sdnNjb2RlLXJlbW90ZQ%3D%3D?line=10'>11</a> p, ax=ax, orientation="horizontal", pad=0.05, **cm_tmp(units="K").cbar_kwargs
<a href='vscode-notebook-cell://ssh-remote%2Bkoehr03.navydsrc.hpc.mil/p/home/blaylock/BB_python/Herbie/docs/user_guide/notebooks/data_nam.ipynb#X33sdnNjb2RlLXJlbW90ZQ%3D%3D?line=11'>12</a> )
<a href='vscode-notebook-cell://ssh-remote%2Bkoehr03.navydsrc.hpc.mil/p/home/blaylock/BB_python/Herbie/docs/user_guide/notebooks/data_nam.ipynb#X33sdnNjb2RlLXJlbW90ZQ%3D%3D?line=13'>14</a> ax.set_title(
<a href='vscode-notebook-cell://ssh-remote%2Bkoehr03.navydsrc.hpc.mil/p/home/blaylock/BB_python/Herbie/docs/user_guide/notebooks/data_nam.ipynb#X33sdnNjb2RlLXJlbW90ZQ%3D%3D?line=14'>15</a> f"{ds.model.upper()}: {H.product_description} ({product})\nValid: {ds.valid_time.dt.strftime('%H:%M UTC %d %b %Y').item()}",
<a href='vscode-notebook-cell://ssh-remote%2Bkoehr03.navydsrc.hpc.mil/p/home/blaylock/BB_python/Herbie/docs/user_guide/notebooks/data_nam.ipynb#X33sdnNjb2RlLXJlbW90ZQ%3D%3D?line=15'>16</a> loc="left",
<a href='vscode-notebook-cell://ssh-remote%2Bkoehr03.navydsrc.hpc.mil/p/home/blaylock/BB_python/Herbie/docs/user_guide/notebooks/data_nam.ipynb#X33sdnNjb2RlLXJlbW90ZQ%3D%3D?line=16'>17</a> )
File ~/anaconda3/envs/herbie/lib/python3.10/site-packages/cartopy/mpl/geoaxes.py:318, in _add_transform.<locals>.wrapper(self, *args, **kwargs)
313 raise ValueError(f'Invalid transform: Spherical {func.__name__} '
314 'is not supported - consider using '
315 'PlateCarree/RotatedPole.')
317 kwargs['transform'] = transform
--> 318 return func(self, *args, **kwargs)
File ~/anaconda3/envs/herbie/lib/python3.10/site-packages/cartopy/mpl/geoaxes.py:1796, in GeoAxes.pcolormesh(self, *args, **kwargs)
1785 """
1786 Add the "transform" keyword to :func:`~matplotlib.pyplot.pcolormesh`.
1787
(...)
1792
1793 """
1794 # Add in an argument checker to handle Matplotlib's potential
1795 # interpolation when coordinate wraps are involved
-> 1796 args, kwargs = self._wrap_args(*args, **kwargs)
1797 result = matplotlib.axes.Axes.pcolormesh(self, *args, **kwargs)
1798 # Wrap the quadrilaterals if necessary
File ~/anaconda3/envs/herbie/lib/python3.10/site-packages/cartopy/mpl/geoaxes.py:1825, in GeoAxes._wrap_args(self, *args, **kwargs)
1823 X = np.asanyarray(args[0])
1824 Y = np.asanyarray(args[1])
-> 1825 nrows, ncols = np.asanyarray(args[2]).shape
1826 Nx = X.shape[-1]
1827 Ny = Y.shape[0]
ValueError: not enough values to unpack (expected 2, got 1)

[43]:
ds = Herbie("2022-08-10", model="nam", product="priconest.hiresf").xarray(
"TMP:2 m above"
)
ds
✅ Found ┊ model=nam ┊ product=priconest.hiresf ┊ 2022-Aug-10 00:00 UTC F00 ┊ GRIB2 @ aws ┊ IDX @ aws
[43]:
<xarray.Dataset> Dimensions: (values: 168640) Coordinates: time datetime64[ns] 2022-08-10 step timedelta64[ns] 00:00:00 heightAboveGround float64 2.0 latitude (values) float64 15.0 15.0 15.0 ... 22.01 22.01 22.01 longitude (values) float64 284.5 284.5 284.5 ... 297.5 297.5 valid_time datetime64[ns] 2022-08-10 Dimensions without coordinates: values Data variables: t2m (values) float32 nan nan nan nan ... nan nan nan nan gribfile_projection object None 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 model: nam product: priconest.hiresf description: North America Mesoscale - CONUS remote_grib: https://noaa-nam-pds.s3.amazonaws.com/nam.202208... local_grib: /p/cwfs/blaylock/data/nam/20220810/subset_93f271... searchString: TMP:2 m above
[47]:
H, ds, ax = plot_product("afwaca")
✅ Found ┊ model=nam ┊ product=afwaca ┊ 2022-Aug-10 00:00 UTC F06 ┊ GRIB2 @ aws ┊ IDX @ aws

[ ]: