🌦️ weather¶
U.S. weather and climate data from NWS (weather.gov), NOAA Climate Data Online (CDO v2), and NOAA bulk observation feeds. NWS tables provide weather station metadata and active severe weather alerts by state (no auth required). CDO tables provide historical monthly and annual climate summaries (GSOM/GSOY) with temperature, precipitation, and snowfall metrics (requires NOAA_CDO_TOKEN). All state-level tables join with geo.state_ref via state_abbr or state_fips; county-grain tables join geo.counties via county_fips. (EPA AQS air-quality data now lives in the environment schema.)
17 datasets · 160 columns
weather_daily_by_county · table¶
Pre-aggregated county-level daily weather derived from ghcnd_daily joined to ghcnd_stations_with_county. One row per county per day. Simple mean of all reporting stations in the county. Primary join anchor for cross-schema research: join on county_fips + date to correlate with SEC filings, BLS wages, FEC contributions, census demographics, and health data.
View — columns are resolved by the query engine at runtime.
nws_stations · table¶
NWS weather station metadata from weather.gov. Includes station ID, name, coordinates, elevation, timezone, and zone IDs. One row per station. Cross-references geo.state_ref via state_abbr. No authentication required.
| Column | Type | Null | Description |
|---|---|---|---|
station_ |
string | no | NWS station ID (e.g., 'KORD') |
station_ |
string | yes | Station name |
state_ |
string | no | 2-letter state abbreviation (e.g., 'CA') |
latitude |
double | yes | Station latitude |
longitude |
double | yes | Station longitude |
elevation_ |
double | yes | Elevation in meters |
timezone |
string | yes | IANA timezone (e.g., 'America/Chicago') |
forecast_ |
string | yes | NWS forecast zone ID |
county_ |
string | yes | NWS county zone ID |
nws_alerts · table¶
NWS active weather alerts from weather.gov. Includes alert type, severity, certainty, urgency, and temporal bounds. Snapshot of current alerts per state. Cross-references geo.state_ref via state_abbr. No authentication required.
| Column | Type | Null | Description |
|---|---|---|---|
alert_ |
string | no | NWS alert identifier |
state_ |
string | no | 2-letter state abbreviation (e.g., 'CA') |
event |
string | yes | Event type (e.g., 'Tornado Warning') |
severity |
string | yes | Extreme, Severe, Moderate, Minor, Unknown |
certainty |
string | yes | Observed, Likely, Possible, Unlikely |
urgency |
string | yes | Immediate, Expected, Future, Past |
headline |
string | yes | Alert headline |
description |
string | yes | Full description |
onset |
string | yes | ISO datetime of onset |
expires |
string | yes | ISO datetime of expiration |
sender_ |
string | yes | Issuing office |
affected_ |
string | yes | Comma-separated zone IDs |
cdo_stations · table¶
NOAA CDO weather station metadata (GHCND and COOP network stations). Includes CDO station ID, name, coordinates, elevation, data coverage date range (min_date/max_date), and coverage fraction (datacoverage). One row per station. Cross-references geo.state_ref via state_fips. Requires NOAA_CDO_TOKEN environment variable. Unlike ghcnd_stations_with_county (no auth required), this table carries no county_fips — use ghcnd_stations_with_county for county-level station joins.
| Column | Type | Null | Description |
|---|---|---|---|
station_ |
string | no | CDO station ID (e.g., 'GHCND:USW00094846', 'COOP:110050') |
station_ |
string | yes | Station name |
state_ |
string | no | 2-digit state FIPS code (e.g., '06' for California) |
latitude |
double | yes | Station latitude |
longitude |
double | yes | Station longitude |
elevation |
double | yes | Elevation (nullable) |
min_ |
string | yes | Earliest data available (ISO date) |
max_ |
string | yes | Most recent data available (ISO date) |
datacoverage |
double | yes | Coverage fraction 0-1 |
cdo_monthly_summaries · table¶
NOAA CDO Global Summary of the Month (GSOM) data. Includes temperature (TAVG, TMAX, TMIN), precipitation (PRCP), snowfall (SNOW), and other monthly climate metrics per station. One row per station+month+datatype. Monthly companion to cdo_annual_summaries (GSOY, same station network at annual grain). Cross-references geo.state_ref via state_fips and cdo_stations via station_id. No auth needed. Loaded from NCEI's GSOM bulk archive (gsom-latest.tar.gz); state_fips is the station's own state from ghcnd-stations.txt, and stations outside the 50 states and DC are not included.
| Column | Type | Null | Description |
|---|---|---|---|
state_ |
string | no | 2-digit state FIPS code (e.g., '06' for California) |
station_ |
string | yes | CDO station ID |
year |
integer | no | Calendar year |
month |
integer | yes | Month (1-12) |
datatype |
string | yes | Measurement type (TAVG, TMAX, TMIN, PRCP, SNOW, etc.) |
value |
double | yes | Value in standard units |
attributes |
string | yes | Quality flags |
date |
string | yes | ISO date of measurement period |
cdo_annual_summaries · table¶
NOAA CDO Global Summary of the Year (GSOY) data — annual temperature, precipitation, and other climate metrics (see the datatype column for the specific element code of each row) per station. One row per station+datatype+year. Annual companion to cdo_monthly_summaries (GSOM, same station network at monthly grain — use that table for TAVG/TMAX/TMIN/PRCP/SNOW by month). Cross-references geo.state_ref via state_fips and cdo_stations via station_id. No auth needed.
| Column | Type | Null | Description |
|---|---|---|---|
state_ |
string | no | 2-digit state FIPS code (e.g., '06' for California) |
station_ |
string | yes | CDO station ID |
year |
integer | no | Calendar year |
datatype |
string | yes | Measurement type |
value |
double | yes | Value in standard units |
attributes |
string | yes | Quality flags |
date |
string | yes | ISO date |
ghcnd_stations_with_county · table¶
NOAA GHCN-Daily station inventory enriched with county_fips via nearest Census county centroid assignment. One row per US station. Prerequisite for all cross-schema joins using ghcnd_daily and weather_daily_by_county. No auth needed. county_fips is assigned by nearest Euclidean distance to Census TIGER county centroids. state_fips is derived from the 2-letter state code in the station file. data_start_year and data_end_year come from ghcnd-inventory.txt.
| Column | Type | Null | Description |
|---|---|---|---|
station_ |
string | no | GHCND station ID (e.g., 'USW00094846') |
station_ |
string | yes | Station name |
state_ |
string | no | 2-digit state FIPS code (e.g., '06' for California) |
county_ |
string | yes | 5-digit county FIPS (nearest Census county centroid) |
latitude |
double | yes | Station latitude |
longitude |
double | yes | Station longitude |
elevation_ |
double | yes | Elevation in meters |
data_ |
integer | yes | First year of observations (from ghcnd-inventory.txt) |
data_ |
integer | yes | Most recent year of observations (from ghcnd-inventory.txt) |
distance_ |
double | yes | Distance used for nearest-county centroid assignment |
ghcnd_daily · table¶
NOAA GHCN-Daily station observations from NCEI annual bulk files (https://www.ncei.noaa.gov/pub/data/ghcn/daily/by_year/YYYY.csv.gz). One row per station per day (station-level grain): tmax_c, tmin_c, tavg_c, prcp_mm, snow_mm, snwd_mm, and awnd_ms, in metric units (°C, mm, m/s). Q_FLAG-filtered (only rows that passed all NCEI quality checks are included). Cross-references ghcnd_stations_with_county via station_id for county_fips joins; the weather_daily_by_county view pre-aggregates this table to county-level daily means for anyone who wants county grain instead of per-station rows. No auth needed.
| Column | Type | Null | Description |
|---|---|---|---|
station_ |
string | no | GHCND station ID (e.g., 'USW00094846') |
state_ |
string | no | 2-digit state FIPS code (e.g., '06' for California) |
date |
string | no | Observation date (ISO format YYYY-MM-DD) |
year |
integer | no | Calendar year |
month |
string | no | 2-digit month (01-12), derived from date |
tmax_ |
double | yes | Maximum temperature in °C (NCEI TMAX, tenths-of-°C ÷ 10) |
tmin_ |
double | yes | Minimum temperature in °C (NCEI TMIN, tenths-of-°C ÷ 10) |
tavg_ |
double | yes | Average temperature in °C (NCEI TAVG, tenths-of-°C ÷ 10) |
prcp_ |
double | yes | Precipitation in mm (NCEI PRCP, tenths-of-mm ÷ 10) |
snow_ |
double | yes | Snowfall in mm (NCEI SNOW, native mm) |
snwd_ |
double | yes | Snow depth in mm (NCEI SNWD, native mm) |
awnd_ |
double | yes | Average wind speed in m/s (NCEI AWND, tenths-of-m/s ÷ 10) |
tmax_ |
string | yes | Measurement flag for tmax |
tmin_ |
string | yes | Measurement flag for tmin |
prcp_ |
string | yes | Measurement flag for prcp |
drought_monitor_weekly · table¶
National Drought Monitor weekly county-level drought severity from the USDM API at droughtmonitor.unl.edu, which itself has published data since 2000 — but this table's own observedCoverage below is the source of truth for what's actually loaded here; check it rather than assuming a 2000 floor. Includes D0-D4 drought category percentages (exclusive area fractions) and the Drought Severity and Coverage Index (DSCI, range 0-500). week_date is the Tuesday release date. Cross-references geo.counties via county_fips and geo.state_ref via state_abbr. No authentication required.
| Column | Type | Null | Description |
|---|---|---|---|
county_ |
string | no | 5-digit county FIPS code |
state_ |
string | no | 2-digit state FIPS code (e.g., '06' for California) |
state_ |
string | no | 2-letter state abbreviation (e.g., 'CA') |
county_ |
string | yes | County name |
year |
integer | no | Calendar year |
week_ |
string | no | Tuesday release date of the drought report (YYYY-MM-DD) |
valid_ |
string | yes | Start date of the drought week period (YYYY-MM-DD) |
valid_ |
string | yes | End date of the drought week period (YYYY-MM-DD) |
none_ |
double | yes | % of county area with no drought |
d0_ |
double | yes | % Abnormally Dry (exclusive D0 only) |
d1_ |
double | yes | % Moderate Drought (exclusive D1 only) |
d2_ |
double | yes | % Severe Drought (exclusive D2 only) |
d3_ |
double | yes | % Extreme Drought (exclusive D3 only) |
d4_ |
double | yes | % Exceptional Drought (exclusive D4) |
dsci |
double | yes | Drought Severity and Coverage Index (0-500, sum of cumulative D0+D1+D2+D3+D4) |
hms_smoke_daily · table¶
NOAA Hazard Mapping System (HMS) satellite smoke detection aggregated to county level. Daily smoke coverage by density category (smoke_coverage_pct, heavy_smoke_pct, medium_smoke_pct, light_smoke_pct). NESDIS's own polygon archive is available from 2005, but this table's own observedCoverage below is the source of truth for what's actually loaded here — check it rather than assuming a 2005 floor or full year-to-year continuity (there is currently a 2014 gap). Downloads daily smoke polygon shapefiles from NESDIS (https://satepsanone.nesdis.noaa.gov/pub/FIRE/web/HMS/Smoke_Polygons/Shapefile/), performs a JTS spatial intersection against TIGER/Line county boundaries, and emits per-county coverage percentages. One batch per year+month; each batch processes all days in that month. The raw smoke plume polygon geometries (WKT) behind these percentages are retained separately in hms_smoke_polygons for spatial re-analysis against other boundaries. Uses HmsSmokeSpatialJoinProvider.
| Column | Type | Null | Description |
|---|---|---|---|
county_ |
string | no | 5-digit county FIPS code |
state_ |
string | no | 2-digit state FIPS code (e.g., '06' for California) |
date |
string | no | Observation date (YYYY-MM-DD) |
year |
integer | no | Calendar year |
month |
string | no | 2-digit month (01-12) |
smoke_ |
double | yes | % of county covered by any smoke |
heavy_ |
double | yes | % of county covered by heavy smoke |
medium_ |
double | yes | % of county covered by medium smoke |
light_ |
double | yes | % of county covered by light smoke |
hms_smoke_polygons · table¶
Raw NOAA HMS smoke plume polygon geometries retained for spatial re-analysis. One row per smoke polygon per day. Geometry stored as WKT for direct use with DuckDB ST_GeomFromText() or re-joining against any boundary table (tracts, zip codes, watersheds, etc.) without re-downloading from NESDIS. Produced in the same pass as hms_smoke_daily — the HmsSmokeSpatialJoinProvider caches polygon rows during the hms_smoke_daily batch and emits them here.
| Column | Type | Null | Description |
|---|---|---|---|
date |
string | no | Observation date (YYYY-MM-DD) |
year |
integer | no | Calendar year |
month |
string | no | 2-digit month (01-12) |
density |
string | no | Smoke density classification: Light, Medium, or Heavy |
geometry |
string | yes | WKT polygon geometry of the smoke plume in WGS84 (EPSG:4326) |
climate_normals_monthly · table¶
NOAA CDO Monthly Climate Normals (NORMAL_MLY dataset, 1981-2010 period). One row per station per month (all 12 months per station). Each state is fetched, paged and pivoted as one unit and stored as its own partition. Values are in metric units (°C, mm). CDO's raw response is in its "standard" units (tenths of °F for temperature, hundredths of an inch for precipitation, tenths of an inch for snowfall); ClimateNormalsTransformer converts each to metric with the correct formula per field (absolute temperatures use (°F-32)×5/9; the two stddev columns are a delta and use ×5/9 with no -32 offset). county_fips is joined from ghcnd_stations_with_county. Requires NOAA_CDO_TOKEN. Static dataset — update logic is not needed until NOAA releases a new 30-year period. Cross-references ghcnd_stations_with_county via station_id.
| Column | Type | Null | Description |
|---|---|---|---|
station_ |
string | no | GHCND station ID |
state_ |
string | no | 2-digit state FIPS code (e.g., '06' for California) |
county_ |
string | yes | 5-digit county FIPS (from ghcnd_stations_with_county join) |
month |
integer | no | Month (1-12) |
normal_ |
double | yes | 30-year normal daily max temperature (°C) |
normal_ |
double | yes | 30-year normal daily min temperature (°C) |
normal_ |
double | yes | 30-year normal daily mean temperature (°C) |
normal_ |
double | yes | 30-year normal daily precipitation (mm) |
normal_ |
double | yes | 30-year normal daily snowfall (mm) |
tmax_ |
double | yes | Standard deviation of daily tmax (°C) |
tmin_ |
double | yes | Standard deviation of daily tmin (°C) |
prcp_ |
double | yes | Standard deviation of daily prcp (mm); NULL if not available from CDO |
asos_observations · table¶
Sub-daily surface observations (one row per METAR report) for the 15 US airport ASOS stations that prediction-market daily-high-temperature contracts settle on: KLAX, KMIA, KAUS, KATL, KSFO, KSEA, KHOU, KLGA, KNYC (Central Park), KMDW, KORD, KDEN, KBKF, KDFW, KDAL. Source is the Iowa Environmental Mesonet ASOS archive (https://mesonet.agron.iastate.edu/cgi-bin/request/asos.py), a university-hosted mirror of NWS/FAA ASOS and MADIS METAR feeds, not an agency endpoint; re-verify if it starts failing. report_type separates three feeds: 'routine' (hourly METAR, ~minute :53), 'special' (SPECI, issued when conditions change), and '5min' (MADIS high-frequency METAR, every 5 minutes, available from about 2016). Years before a feed existed return no rows for it. observation_time_utc is UTC. Temperatures are kept as reported: air_temp_f / air_temp_c are IEM's parse of the METAR body (whole degrees; null on 5min rows), temp_c_tgroup is the exact tenths-of-a-degree Celsius from the METAR remarks T-group (present on most rows, including 5min), and metar is the full raw report text. A 5-minute and a routine report can share one minute, so (station_id, observation_time_utc, report_type) is not unique; add metar for a unique key. -61 C in temp_c_tgroup (METAR 'M61/M61') is the ASOS sensor-missing marker, kept as reported; filter it when taking daily maxima/minima. air_temp_f/air_temp_c occasionally disagree with the raw report, so prefer temp_c_tgroup when precision matters. The daily maximum over observation_time_utc rows differs from the official NWS daily climate-report maximum (ghcnd_daily tmax_c); this table is the record needed to reproduce the highest-observation-of-the-day measure. Use observation_date (UTC day) to group, not local day. No auth needed.
| Column | Type | Null | Description |
|---|---|---|---|
station_ |
string | no | 4-letter ICAO station identifier (e.g., 'KMIA') |
observation_ |
string | no | Observation time in UTC, 'YYYY-MM-DD HH:MM' |
observation_ |
string | no | UTC calendar date of the observation (YYYY-MM-DD) |
year |
integer | no | Calendar year |
report_ |
string | no | Feed: 'routine' (hourly METAR), 'special' (SPECI), or '5min' (MADIS 5-minute METAR) |
air_ |
double | yes | Air temperature in whole degrees F as parsed from the METAR body; null on 5min rows |
air_ |
double | yes | Air temperature in degrees C as parsed by IEM from the METAR body; null on 5min rows |
temp_ |
double | yes | Air temperature in degrees C to tenths, from the METAR remarks T-group; null when the report has no T-group |
metar |
string | yes | Full raw METAR report text |
coops_stations · table¶
NOAA CO-OPS tide gauges that report water level and tides: 238 tidal stations (NWLON and others) on US coasts, territories and a few foreign/Pacific sites, from the CO-OPS Metadata API (api.tidesandcurrents.noaa.gov/mdapi, keyless, public domain). One row per station with name, state, coordinates, tide type (semidiurnal, mixed, diurnal) and time zone. state is as CO-OPS publishes it; state_abbr and state_fips are populated only for the 50 states, DC, PR, VI and American Samoa (null for Guam, Midway, Wake, Kwajalein and Bermuda). Great Lakes stations are excluded. Joins geo.state_ref via state_abbr or state_fips; coops_station_datums, coops_high_low and coops_tide_predictions join on station_id.
| Column | Type | Null | Description |
|---|---|---|---|
station_ |
string | no | CO-OPS station id (7 digits, e.g., '8518750' The Battery, NY) |
station_ |
string | no | Station name |
state |
string | yes | State as published by CO-OPS: 2-letter code for states and most territories, otherwise a country or area name |
state_ |
string | yes | 2-letter abbreviation (50 states, DC, PR, VI, AS); null where CO-OPS gives no US state |
state_ |
string | yes | 2-digit state FIPS code; null where state_abbr is null |
latitude |
double | no | Station latitude (decimal degrees) |
longitude |
double | no | Station longitude (decimal degrees, negative west) |
affiliations |
string | yes | Network affiliations (e.g., 'NWLON', 'NWLON,PORTS') |
tide_ |
string | yes | Tide regime as published: Semidiurnal, Mixed, Mixed Diurnal or Diurnal |
timezone |
string | yes | Local time zone abbreviation (e.g., 'EST') |
timezone_ |
integer | no | Standard-time offset from UTC in hours |
observes_ |
boolean | no | Whether local time observes daylight saving |
storm_ |
boolean | no | Whether CO-OPS publishes a storm surge forecast for the station |
coops_station_datums · table¶
Tidal datum elevations per CO-OPS tide gauge, in meters above station datum (STND), from the Metadata API datums.json. One row per station. Water levels in coops_high_low and coops_tide_predictions are meters above MLLW, so mllw_m converts them to station datum and navd88_m (when published) ties them to NAVD88. Columns hold the current published epoch (epoch, e.g. '1983-2001'): MHHW, MHW, MTL, MSL, MLW, MLLW, NAVD88, plus LAT/HAT where published. A datum a station does not publish is null.
| Column | Type | Null | Description |
|---|---|---|---|
station_ |
string | no | CO-OPS station id (joins coops_stations.station_id) |
epoch |
string | yes | National Tidal Datum Epoch the datums are computed over (e.g., '1983-2001') |
orthometric_ |
string | yes | Orthometric datum the station is tied to (e.g., 'NAVD88') |
datums_ |
string | yes | Date the current datums were accepted (as published, e.g., 'Nov 19 2012') |
stnd_ |
double | yes | Station datum elevation, meters (reference 0) |
mhhw_ |
double | yes | Mean Higher-High Water, meters above station datum |
mhw_ |
double | yes | Mean High Water, meters above station datum |
mtl_ |
double | yes | Mean Tide Level, meters above station datum |
msl_ |
double | yes | Mean Sea Level, meters above station datum |
mlw_ |
double | yes | Mean Low Water, meters above station datum |
mllw_ |
double | yes | Mean Lower-Low Water, meters above station datum (the reference for coops_high_low and coops_tide_predictions) |
navd88_ |
double | yes | North American Vertical Datum 1988, meters above station datum; null when not tied |
lat_ |
double | yes | Lowest Astronomical Tide, meters above station datum; null when not published |
hat_ |
double | yes | Highest Astronomical Tide, meters above station datum; null when not published |
coops_high_low · table¶
Observed high and low water events (tide extremes) from NOAA CO-OPS NWLON tide gauges, one row per event per station: roughly 2 to 4 per station per day (H/L semidiurnal, HH/LL on mixed tides). Source is the CO-OPS Data API (product=high_low, api.tidesandcurrents.noaa.gov, keyless, public domain; requests are limited to 365 days, so the ETL pulls one station-year per call). Heights are meters above MLLW (current tidal epoch) in UTC time, as verified (preliminary for recent months). Stations inactive in a year return no rows. Pair with coops_tide_predictions: observed minus predicted extreme is the storm-surge / anomaly signal, precomputed in the coops_daily_surge view. Join coops_stations on station_id for state_fips, latitude and longitude, and to geo.state_ref; coastal flooding in the disasters schema joins on state. Great Lakes stations are excluded (no tides); currents are not included.
| Column | Type | Null | Description |
|---|---|---|---|
station_ |
string | no | CO-OPS station id (joins coops_stations.station_id) |
event_ |
string | no | Time of the high or low water event in UTC, 'YYYY-MM-DD HH:MM' |
event_ |
string | no | UTC calendar date of the event (YYYY-MM-DD) |
year |
integer | no | Calendar year |
water_ |
double | yes | Observed water level of the high/low event in meters above MLLW (Mean Lower-Low Water, the station's current tidal epoch). Comparable across stations only via coops_station_datums |
event_ |
string | no | H = high water, L = low water, HH = higher high water, LL = lower low water (HH/LL appear on mixed and diurnal tide stations) |
quality_ |
string | yes | CO-OPS data flags 'inferred,exceedsMax/Min,rateOfChange,limits' as 0/1 (e.g. '0,0') |
coops_tide_predictions · table¶
Predicted high and low tide times and heights from NOAA CO-OPS harmonic prediction (product=predictions&interval=hilo), one row per predicted extreme per tidal station. Predictions are astronomical only (no weather), so water_level_m from coops_high_low minus the matching prediction isolates storm surge and other non-tidal anomaly; see the coops_daily_surge view. Heights are meters above MLLW (current tidal epoch), time in UTC. Source: api.tidesandcurrents.noaa.gov Data API, keyless, public domain, 365 days per call so the ETL pulls one station-year per call. Join coops_stations on station_id for state and coordinates. Currents predictions are not included.
| Column | Type | Null | Description |
|---|---|---|---|
station_ |
string | no | CO-OPS station id (joins coops_stations.station_id) |
event_ |
string | no | Time of the high or low water event in UTC, 'YYYY-MM-DD HH:MM' |
event_ |
string | no | UTC calendar date of the event (YYYY-MM-DD) |
year |
integer | no | Calendar year |
water_ |
double | yes | Predicted tide height of the high/low event in meters above MLLW (Mean Lower-Low Water, the station's current tidal epoch). Comparable across stations only via coops_station_datums |
event_ |
string | no | H = high water, L = low water, HH = higher high water, LL = lower low water (HH/LL appear on mixed and diurnal tide stations) |