OPENDAP NAM

Open In Colab

# Install required libraries
# !pip install -q xarray_subset_grid@git+https://github.com/asascience-open/xarray-subset-grid.git
# !pip install -q s3fs cftime xarray cf-xarray fsspec dask h5netcdf
import cf_xarray  # noqa
import datetime
import xarray as xr



current_date = datetime.datetime.now().strftime("%Y%m%d")

ds = xr.open_dataset(
    f"https://nomads.ncep.noaa.gov/dods/nam/nam{current_date}/nam1hr_00z", chunks={}
)
ds
/Users/matthew.iannucci/Developer/xarray-subset-grid/venv/lib/python3.10/site-packages/xarray/coding/times.py:170: SerializationWarning: Ambiguous reference date string: 1-1-1 00:00:0.0. The first value is assumed to be the year hence will be padded with zeros to remove the ambiguity (the padded reference date string is: 0001-1-1 00:00:0.0). To remove this message, remove the ambiguity by padding your reference date strings with zeros.
  warnings.warn(warning_msg, SerializationWarning)
<xarray.Dataset> Size: 31GB
Dimensions:         (time: 37, lev: 42, lat: 443, lon: 913)
Coordinates:
  * time            (time) datetime64[ns] 296B 2024-07-24 ... 2024-07-25T12:0...
  * lev             (lev) float64 336B 1e+03 975.0 950.0 925.0 ... 20.0 10.0 5.0
  * lat             (lat) float64 4kB 12.22 12.33 12.44 ... 60.98 61.09 61.21
  * lon             (lon) float64 7kB -152.9 -152.8 -152.7 ... -49.59 -49.47
Data variables: (12/141)
    absvprs         (time, lev, lat, lon) float32 3GB dask.array<chunksize=(37, 42, 443, 913), meta=np.ndarray>
    no4lftx180_0mb  (time, lat, lon) float32 60MB dask.array<chunksize=(37, 443, 913), meta=np.ndarray>
    acpcpsfc        (time, lat, lon) float32 60MB dask.array<chunksize=(37, 443, 913), meta=np.ndarray>
    albdosfc        (time, lat, lon) float32 60MB dask.array<chunksize=(37, 443, 913), meta=np.ndarray>
    apcpsfc         (time, lat, lon) float32 60MB dask.array<chunksize=(37, 443, 913), meta=np.ndarray>
    bmixlhy1        (time, lat, lon) float32 60MB dask.array<chunksize=(37, 443, 913), meta=np.ndarray>
    ...              ...
    vucsh0_6000m    (time, lat, lon) float32 60MB dask.array<chunksize=(37, 443, 913), meta=np.ndarray>
    vvcsh0_6000m    (time, lat, lon) float32 60MB dask.array<chunksize=(37, 443, 913), meta=np.ndarray>
    vvelprs         (time, lev, lat, lon) float32 3GB dask.array<chunksize=(37, 42, 443, 913), meta=np.ndarray>
    weasdaccsfc     (time, lat, lon) float32 60MB dask.array<chunksize=(37, 443, 913), meta=np.ndarray>
    weasdsfc        (time, lat, lon) float32 60MB dask.array<chunksize=(37, 443, 913), meta=np.ndarray>
    wiltsfc         (time, lat, lon) float32 60MB dask.array<chunksize=(37, 443, 913), meta=np.ndarray>
Attributes:
    title:        NAM hourly fcst staring from 00Z24jul2024, download Jul 24 ...
    Conventions:  COARDS\nGrADS
    dataType:     Grid
    history:      Wed Jul 24 02:49:03 UTC 2024 : imported by GrADS Data Serve...

See the size of the dataset

f"Dataset size: {ds.nbytes * 1.0e-9} Gb"
'Dataset size: 30.528576800000003 Gb'

Make sure the grid is recognized

ds.xsg.grid.name
'regular_grid'

Grab out only the composite reflectivity

ds_refd = ds.xsg.subset_vars(['refcclm'])
ds_refd
<xarray.Dataset> Size: 60MB
Dimensions:  (lat: 443, lon: 913, time: 37)
Coordinates:
  * lat      (lat) float64 4kB 12.22 12.33 12.44 12.55 ... 60.98 61.09 61.21
  * lon      (lon) float64 7kB -152.9 -152.8 -152.7 ... -49.7 -49.59 -49.47
  * time     (time) datetime64[ns] 296B 2024-07-24 ... 2024-07-25T12:00:00
Data variables:
    refcclm  (time, lat, lon) float32 60MB dask.array<chunksize=(37, 443, 913), meta=np.ndarray>
Attributes:
    title:        NAM hourly fcst staring from 00Z24jul2024, download Jul 24 ...
    Conventions:  COARDS\nGrADS
    dataType:     Grid
    history:      Wed Jul 24 02:49:03 UTC 2024 : imported by GrADS Data Serve...

Create our region of interest and subset

image.png

bbox = [-93.63283364104035, 16.18222316056857, -67.60864242620244, 34.02542167172069]

ds_refd_subset = ds_refd.xsg.subset_bbox(bbox)
ds_refd_subset
<xarray.Dataset> Size: 5MB
Dimensions:  (lat: 161, lon: 230, time: 37)
Coordinates:
  * lat      (lat) float64 1kB 16.21 16.32 16.43 16.54 ... 33.72 33.83 33.94
  * lon      (lon) float64 2kB -93.58 -93.47 -93.35 ... -67.84 -67.73 -67.61
  * time     (time) datetime64[ns] 296B 2024-07-24 ... 2024-07-25T12:00:00
Data variables:
    refcclm  (time, lat, lon) float32 5MB dask.array<chunksize=(37, 161, 230), meta=np.ndarray>
Attributes:
    title:        NAM hourly fcst staring from 00Z24jul2024, download Jul 24 ...
    Conventions:  COARDS\nGrADS
    dataType:     Grid
    history:      Wed Jul 24 02:49:03 UTC 2024 : imported by GrADS Data Serve...

Plot the first timestep

ds_refd_subset.cf.isel(time=0).refcclm.plot(vmin=0, vmax=80, cmap="Greens")
<matplotlib.collections.QuadMesh at 0x311d7a350>
../_images/1cd5ea5ab486e828b3b1779999d7e1942cce4a0ce8766f3013b74070bb6988a3.png
f"Subset dataset size: {ds_refd_subset.nbytes * 1.0e-6} Mb"
'Subset dataset size: 5.483864 Mb'