NOAA Storm Events Database 1950–Present
National Centers for Environmental Information (NCEI) — Full History
The NOAA Storm Events Database is the official US record of significant weather events causing deaths, injuries, property damage, or disruption. This dataset covers 2M+ events from 1950 through 2024 across 3 linked tables — parsed from NOAA's gzip-compressed annual files, with damage strings converted to dollars, coordinates normalized, and event types standardized. Ideal for insurance, climate research, real estate risk, and NLP on storm narratives.
Why not pull it directly from NOAA?
NOAA publishes ~225 gzip-compressed CSV files across 3 table types and 75 years. Here's what we handled:
- ✓ 225 .csv.gz files downloaded, decompressed, and concatenated — NOAA publishes one file per year per table type, with varying creation dates; we resolve the latest file per year and merge everything
- ✓ Damage strings parsed to USD — NOAA encodes damage as strings like "50.00K" or "1.2M"; we convert to float dollars for direct numeric analysis
- ✓ Begin/end dates derived — NOAA stores dates as separate YEARMONTH + DAY fields; we derive clean
BEGIN_DATE/END_DATEISO strings - ✓ Total injuries and deaths computed — direct + indirect casualties summed per event
- ✓ Event types and states standardized — raw files use mixed case; we normalize to title case for consistent grouping
- ✓ 3 tables cross-linked by EVENT_ID — fatalities and locations reference the details table; we preserve the join keys and document the schema
- ✓ Parquet output per table — NOAA only provides CSV; columnar Parquet is 5–10× faster for analytical queries on 2M+ rows
⏱ Skip 225 file downloads, gzip decompression, damage string parsing, and schema reconciliation. Ready for analysis in minutes.
2M+
Storm Events
74
Years of Data
25K+
Fatality Records
60+
Event Types
Use Cases
Model property and crop damage by storm type, county, and year. Build actuarial tables for hail, tornado, and flood risk scoring. Cross-reference with location data for precise geographic underwriting.
Analyze 74 years of extreme weather events to identify trends in storm frequency, intensity, and geographic spread. Study decade-over-decade shifts in tornado alley, flood patterns, and hurricane activity.
Score ZIP codes and counties on historical storm exposure — floods, tornadoes, hail, and wind damage — to inform property valuations, mortgage risk, and climate-adjusted pricing.
Build historical baselines for emergency response planning. Identify which counties experience repeated high-damage events and model resource deployment needs based on historical storm patterns.
Analyze DAMAGE_CROPS_USD by state, county, and event type to model agricultural loss risk. Link with USDA crop data to estimate exposure by crop type and planting zone.
The EPISODE_NARRATIVE and EVENT_NARRATIVE fields contain rich free-text descriptions from NWS forecasters — ideal for NLP training data, zero-shot classification, or RAG pipelines focused on weather events.
Schema
Three linked tables delivered as CSV + Parquet. Join on EVENT_ID (and EPISODE_ID for locations).
Details Table — noaa_storm_events_details
Primary storm event records. One row per event.
| Field | Type | Description |
|---|---|---|
| EVENT_ID | int | Unique event identifier (links to fatalities and locations tables) |
| EPISODE_ID | int | Episode identifier grouping related events |
| YEAR | int | Calendar year of the event |
| MONTH_NAME | string | Month name (January–December) |
| BEGIN_DATE | string | Event begin date (YYYY-MM-DD, derived) |
| END_DATE | string | Event end date (YYYY-MM-DD, derived) |
| BEGIN_TIME | string | Begin time (HHMM, local time zone) |
| END_TIME | string | End time (HHMM, local time zone) |
| STATE | string | US state or territory name (title case) |
| STATE_FIPS | int | FIPS code for state |
| CZ_NAME | string | County/zone name |
| CZ_FIPS | int | County/zone FIPS code |
| CZ_TYPE | string | C = County, Z = NWS Forecast Zone, M = Marine |
| EVENT_TYPE | string | Storm event type (title case) — e.g. Tornado, Flash Flood, Thunderstorm Wind |
| INJURIES_DIRECT | int | Direct injuries from the event |
| INJURIES_INDIRECT | int | Indirect injuries |
| INJURIES_TOTAL | int | Total injuries (computed: direct + indirect) |
| DEATHS_DIRECT | int | Direct deaths from the event |
| DEATHS_INDIRECT | int | Indirect deaths |
| DEATHS_TOTAL | int | Total deaths (computed: direct + indirect) |
| DAMAGE_PROPERTY | string | Property damage raw string (e.g. '50.00K', '1.2M') |
| DAMAGE_PROPERTY_USD | float | Property damage in dollars (parsed from string, computed) |
| DAMAGE_CROPS | string | Crop damage raw string |
| DAMAGE_CROPS_USD | float | Crop damage in dollars (parsed, computed) |
| TOTAL_DAMAGE_USD | float | Total damage (property + crops) in dollars (computed) |
| BEGIN_LAT | float | Begin latitude of the event |
| BEGIN_LON | float | Begin longitude of the event |
| END_LAT | float | End latitude |
| END_LON | float | End longitude |
| MAGNITUDE | float | Event magnitude (e.g. wind speed in mph, hail size in inches) |
| MAGNITUDE_TYPE | string | Units of magnitude (EG=estimated gust, EH=estimated hail, etc.) |
| TOR_F_SCALE | string | Tornado Fujita/Enhanced Fujita scale (EF0–EF5) |
| TOR_LENGTH | int | Tornado path length in miles |
| TOR_WIDTH | int | Tornado path width in yards |
| FLOOD_CAUSE | string | Cause of flood event (if applicable) |
| SOURCE | string | Data source (e.g. trained spotter, newspaper, emergency manager) |
| WFO | string | NWS Weather Forecast Office responsible for the event area |
| EPISODE_NARRATIVE | string | Text narrative describing the overall weather episode |
| EVENT_NARRATIVE | string | Text narrative describing the specific storm event |
Fatalities Table — noaa_storm_events_fatalities
Per-fatality records. Multiple rows per event when multiple people died. Available from ~1996.
| Field | Type | Description |
|---|---|---|
| FATALITY_ID | int | Unique fatality identifier |
| EVENT_ID | int | Links to details table EVENT_ID |
| FATALITY_TYPE | string | D = direct, I = indirect |
| FATALITY_DATE | string | Date of death |
| FATALITY_AGE | int | Age of the deceased (nullable) |
| FATALITY_SEX | string | Sex of the deceased (M/F, nullable) |
| FATALITY_LOCATION | string | Location type (e.g. Vehicle, Permanent Home, Outside/Open Areas) |
Locations Table — noaa_storm_events_locations
Additional named location points per event. Useful for precise geospatial analysis.
| Field | Type | Description |
|---|---|---|
| EVENT_ID | int | Links to details table EVENT_ID |
| EPISODE_ID | int | Links to details table EPISODE_ID |
| LOCATION_INDEX | int | Sequence number for multiple locations per event |
| LAT | float | Latitude of this location point |
| LON | float | Longitude of this location point |
| LAT2 | float | Secondary latitude (for areas/paths) |
| LON2 | float | Secondary longitude |
| LOCATION | string | Named location (city, landmark) |
| AZIMUTH | string | Compass direction from a reference point |
| RANGE | string | Distance in miles from a reference point |
Quick Start
import pandas as pd
# Load main events table
details = pd.read_parquet("noaa_storm_events_details.parquet")
fatalities = pd.read_parquet("noaa_storm_events_fatalities.parquet")
locations = pd.read_parquet("noaa_storm_events_locations.parquet")
# Events by year
print(details.groupby("YEAR").size().tail(10))
# Top 10 deadliest storm types (direct deaths only)
print(
details.groupby("EVENT_TYPE")["DEATHS_DIRECT"]
.sum()
.sort_values(ascending=False)
.head(10)
)
# Total property damage by state (all time)
damage_by_state = (
details.groupby("STATE")["DAMAGE_PROPERTY_USD"]
.sum()
.sort_values(ascending=False)
)
print(damage_by_state.head(10))
# Tornado F-scale distribution
tornadoes = details[details["EVENT_TYPE"] == "Tornado"]
print(tornadoes["TOR_F_SCALE"].value_counts())
# Join fatalities to events for age/sex analysis
fat_events = fatalities.merge(
details[["EVENT_ID", "EVENT_TYPE", "STATE", "YEAR"]],
on="EVENT_ID", how="left"
)
print(fat_events.groupby("EVENT_TYPE")["FATALITY_AGE"].mean().sort_values())
# Costliest events ever
top_damage = details.nlargest(20, "TOTAL_DAMAGE_USD")[
["YEAR", "EVENT_TYPE", "STATE", "CZ_NAME", "TOTAL_DAMAGE_USD", "EVENT_NARRATIVE"]
]
print(top_damage)Pairs Well With
Cross-reference NOAA flood events (damage, location, date) with NFIP claims data to validate modeled flood risk, study claim frequency vs. event severity, and identify areas with chronic underinsurance.
Join weather events with FARS crash data by date/state to analyze how severe weather (ice storms, fog, floods) correlates with traffic fatality spikes — useful for road safety research and insurance.
Pricing
Data Provenance
Source: National Oceanic and Atmospheric Administration (NOAA), National Centers for Environmental Information (NCEI) — Storm Events Database
Portal: NOAA Storm Events Database
Coverage: 1950–2024. Details data begins in 1950; fatalities and locations tables begin approximately 1996 when NOAA expanded reporting.
Event types: NOAA added new event type classifications over time — the current 48 standard types replaced older categories in 1996. Pre-1996 data covers only tornadoes, thunderstorm winds, and hail. Post-1996 includes all weather phenomena.
Computed fields: DAMAGE_PROPERTY_USD, DAMAGE_CROPS_USD, and TOTAL_DAMAGE_USD are parsed by ClarityStorm from NOAA's encoded strings (e.g. "50.00K", "1.2M") to float dollars.INJURIES_TOTAL, DEATHS_TOTAL, and BEGIN_DATE / END_DATE are also derived fields.
Update frequency: NOAA releases updated annual files (with corrected creation dates) periodically. Annual subscribers receive updated files when ClarityStorm re-runs the pipeline.
License: NOAA Storm Events data is a US federal government work in the public domain. Paid tiers are licensed under the ClarityStorm Commercial Data License covering our pipeline work (parsing, damage normalization, type standardization, Parquet conversion).
Need custom date ranges, specific event types, or bulk licensing?
Contact Sales