U.S. Climate Normals 1991-2020
Available since v0.11.0 as noaa:climate-normals.
Normals are 30-year averages of hourly, daily, monthly, and annual/seasonal station
statistics, served by the anonymous NCEI Access Data Service datasets
normals-monthly-1991-2020, normals-daily-1991-2020, and
normals-annualseasonal-1991-2020, plus normals-hourly-1991-2020. The adapter reuses GHCN station discovery,
transport, and 50-station CSV chunks. Choose the dataset with period:
monthly (default), daily, annualseasonal, or hourly. Hourly support is
available since v0.23.0. Pass either stations or a
location/bbox, not both. units is metric (default) or standard, recorded in
the frame's attrs["usdata"]["properties"]["units"] since the CSV does not state
it; unknown parameters and text queries are rejected.
Dates are optional because normals are not observations. For hourly, daily, and
monthly, an optional start/end pair selects a calendar window by month
and day; the year is ignored and sent as the placeholder 2020, a leap year so
February 29 is valid. Without dates the whole year is requested. Datetimes with
an offset are converted to UTC before the month and day are taken, and a window
whose start falls after its end in the calendar (crossing the new year) is
rejected: split it into two sources. annualseasonal accepts no dates. Assets
carry the 1991-2020 normals period as their time bounds, not the calendar window;
the window is part of the asset id and URL.
Hourly normals
period: hourly returns every hour of the selected calendar days, not an
instant range. The same UTC normalization of query dates applies before the
month and day are selected; use plain dates to avoid a timezone shift changing
the day. Returned DATE labels are MM-DDTHH:MM:SS in the station's local
standard time, without a year or offset. They are not UTC and do not follow
daylight saving time. Keep them as text with item.open_csv(dtype={"DATE": "string"})
and align them explicitly with observations.
Hourly normals have no February 29 values. A February 28–March 1 request returns 48 hours; a February 29-only request has no hourly values. The adapter does not interpolate missing days. NCEI computes each normal from a 15-day window around that calendar day across 30 years, rather than only that date's 30 observations. See the hourly documentation.
usdata fetch noaa:climate-normals -p period=hourly -p stations=USW00013967 \
--start 2024-05-06 --end 2024-05-06 --vars HLY-TEMP-NORMAL
HLY-TEMP-NORMAL was checked in both unit systems on 2026-09-21: all 24
values for May 6 at USW00013967 converted correctly from Fahrenheit to
Celsius under units=metric. This does not establish conversion correctness
for other hourly variables. NCEI documents -9999 as missing or insufficient
data; mask it before arithmetic. The hourly anomalies example
matches routine LCD observations to the nearest normal within ten minutes,
reports unmatched values, and verifies restoration into a fresh cache.
Station discovery and values
Geographic discovery searches the selected period's dataset for stations with normals coverage over 1991-2020 inside the box. Not every GHCN station has normals; stations that do are listed by the NCEI normals product page.
CSV DATE is MM for monthly and MM-DD for daily normals; annual/seasonal
files have no DATE column. Use item.open_csv(dtype={"DATE": "string"}) to keep
the labels as text with the pandas reader. Variables are NCEI data type codes
such as MLY-TMAX-NORMAL, DLY-PRCP-NORMAL, or ANN-TAVG-NORMAL; see the
NCEI normals documentation
for the full list. The service does not reject unknown data types: an
unknown code yields an empty column, so check spelling against that list.
The service default is standard units, which usdata overrides with
units=metric; standard-unit values retain the source's leading spaces.
units=metric is not uniformly correct, and variables reaches the whole
NCEI data-type list, so verify any code you have not probed rather than assuming
Celsius. Two failures were reproduced on 2026-09-11 at USW00013967 and
USW00014739:
MLY-TAVG-NORMALis not converted at all. It returns the same space-padded degrees-Fahrenheit value under bothunits=metricandunits=standard. Convert it yourself before comparing it with Celsius observations, as the anomalies notebook does.- Derived temperature quantities are converted as absolute temperatures.
The diurnal range
*-DUTR-*and the*-STDDEVcodes are differences in degrees, butunits=metricapplies the full absolute-temperature formula(F - 32) x 5/9, so they come back negative and wrong.USW00013967January returnedMLY-DUTR-NORMAL-5.3,MLY-TAVG-STDDEV-16.2, andMLY-TMAX-STDDEV-15.8 underunits=metricagainst 22.4, 2.8, and 3.6 underunits=standard. Read these fromunits=standardand scale by5/9with no offset: 22.4 F is 12.4 C, matching the metricMLY-TMAX-NORMALminusMLY-TMIN-NORMALspread.
In the same probe MLY-TMAX-NORMAL, MLY-TMIN-NORMAL, MLY-PRCP-NORMAL,
DLY-TAVG-NORMAL, and ANN-TAVG-NORMAL did convert: metric temperatures are
degrees Celsius and precipitation is millimeters. Station columns are included
with includeStationLocation=1.
Normals are republished about once a decade; the 1991-2020 files can still be corrected. Retain the cache as well as the manifest and lockfile. See the service research notes for dated probes.
Metadata sources
Every value in the catalog entry's resolution, cadence, citation, terms, variables, and limits comes from one of these pages. A field the agency does not publish is left empty rather than estimated.
- Resolution, updates, terms, and citation: the NCEI U.S. Climate Normals product
page and
the per-period dataset records it links, such as the annual and seasonal
record,
whose maintenance frequency is "as needed" and whose use constraint is the Palecki et
al. (2021) citation. The entry points
termsat the product page because the constraints and DOI differ per period. - Variables: the monthly normals
documentation
for the data-type codes, with the units this guide's 2026-09-11 probe found, including
the codes
units=metricdoes not convert. The code list is open. - Latency is empty: normals are 30-year averages, and NCEI publishes no lag for them.
Reference
noaa:climate-normals · Released · Included since usdata 0.11. U.S. Climate Normals 1991-2020.
At a glance
- Files: CSV
- Selection: Hourly, daily, monthly, or annual/seasonal normals per station; optional month-day window except annual/seasonal; hourly returns whole days
- Required inputs: Station IDs or a geographic query; dates optional
- Open locally:
usdata[pandas]· Reader guide - On usdata.dev: 30-year station climate normals, with a walkthrough
- Studies: Was 2024 warmer or wetter than normal?; How warm was Oklahoma City on 6 May 2024 compared with its hourly normals?
Parameters
Pass these as --param name=value to the CLI, as params: entries in a manifest, or as keyword arguments to build_query.
| Parameter | Meaning |
|---|---|
period |
monthly (default), daily, annualseasonal, or hourly. |
stations |
Station ids, comma-separated or a list; otherwise a location selects them. |
units |
metric (default) or standard. |
Variables
| Variable | Units | Meaning |
|---|---|---|
HLY-TEMP-NORMAL |
degrees Celsius | Hourly normal mean temperature (metric units); local standard time |
MLY-TMAX-NORMAL |
degrees Celsius | Monthly normal maximum temperature |
MLY-TMIN-NORMAL |
degrees Celsius | Monthly normal minimum temperature |
MLY-PRCP-NORMAL |
mm | Monthly normal precipitation total |
MLY-TAVG-NORMAL |
degrees Fahrenheit | Monthly normal mean temperature; units=metric does not convert it |
MLY-DUTR-NORMAL |
degrees Fahrenheit | Monthly normal diurnal temperature range; read it from units=standard |
MLY-TAVG-STDDEV |
degrees Fahrenheit | Standard deviation of monthly mean temperature; read it from units=standard |
MLY-TMAX-STDDEV |
degrees Fahrenheit | Standard deviation of monthly maximum temperature; read it from units=standard |
DLY-TAVG-NORMAL |
degrees Celsius | Daily normal mean temperature |
DLY-PRCP-NORMAL |
mm | Daily normal precipitation |
ANN-TAVG-NORMAL |
degrees Celsius | Annual normal mean temperature |
Catalog facts
- Availability: since 0.11
- Domain: Climate
- Spatial resolution: U.S. land surface stations with 1991-2020 normals coverage
- Temporal resolution: Hourly, daily, monthly, or annual and seasonal normals, chosen with the period parameter
- Updates: As needed; the normals are republished about once a decade
- Terms of use: https://www.ncei.noaa.gov/products/land-based-station/us-climate-normals
- Citation: Palecki, Michael; Durre, Imke; Applequist, Scott; Arguez, Anthony; Lawrimore, Jay (2021). U.S. Climate Normals 2020 (1991-2020). NOAA National Centers for Environmental Information; cite the record for the period used
- Geographic bounds (WGS84): west -180°, south -90°, east 180°, north 90°
- Catalog date range: 1991-01-01 to 2020-12-31
- Coverage varies by station, product, and date; the range above does not guarantee observations.
- Upstream documentation
- License: US Government Work (public domain)
- Transport:
http - Adapter:
usdata.providers.noaa.normals:ClimateNormals