Open data · CC BY 4.0
Frost Station Normals, 1991–2020: the Extract, Free
One CSV, 7,305 NOAA weather stations: official 1991–2020 last-spring and first-fall freeze probabilities at 36, 32, and 28°F, plus growing-season length — extracted from NOAA NCEI’s normals archive, decoded, and documented. The underlying data is US public domain; our extract is free under CC BY 4.0 — drop your email below and the download unlocks instantly.
Download
You're in — thanks. We'll give you a shout when this dataset gets a refresh.
7,305 stations · 117 columns · one header row · v1, released July 16, 2026.
SHA-256: 8990adb0ade7ac651592ea4f5b6f4e6cc8c96ea1cfb4d18e9e09d84c6c31f873
What this is
NOAA’s National Centers for Environmental Information publishes freeze/frost probability normals — the official “last frost” and “first frost” odds — for US weather stations. The catch: they ship as 15,616 separate per-station files inside a tar archive, with encoding quirks that are documented, but scattered and easy to get wrong.
This is that data, done once, properly: every station that carries freeze normals (7,305 of the 15,616 — the rest are precipitation-only and similar), extracted into one flat CSV. Per station: last spring freeze, first fall freeze, and growing-season length at 36, 32, and 28°F, each at nine probability levels from 10% to 90%, plus NOAA’s quality flags and a per-station status classification we added. Our decoding was verified against NOAA’s own REST service before release.
It exists because we needed it ourselves — it’s the station baseline and validation ground truth behind our free frost date lookup, and the first release from the pipeline described on our frost methodology page.
Who it’s for
- Developers building anything with a “when is my frost date?” feature — this is the lookup table, ready to load, censoring handled.
- Researchers and students who want station freeze climatology without writing a tar-archive parser and re-deriving the flag semantics.
- Garden writers and educators who want real numbers for a region — every date in here is NOAA’s, traceable to a named station.
- Skeptics of our tool — this is the ground truth we validate against, so you can check our published accuracy numbers yourself.
- Anyone who wants the study we built from it — we used this file to measure how wrong the nearest weather station is about your frost date. Median disagreement between neighboring stations: 5 days. Worst pair: 114 days, 7.7 miles apart.
Column dictionary
117 columns: 6 identity/status columns, then nine 12-column groups — three variables (lst last spring freeze, fst first fall freeze, gsl growing-season length) × three thresholds (28, 32, 36°F) — then three occurrence columns. The same dictionary ships in the README that comes with the download.
Identity + status
| Column | Meaning |
|---|---|
station | GHCN station ID, 11 characters. First two = FIPS country code (US = 50 states + DC; RQ/VQ = Puerto Rico / US Virgin Islands; GQ/AQ/CQ = Guam / American Samoa / N. Marianas; FM/RM/PS/WQ/JQ = Pacific affiliates; one CA border station). |
name | Station name as published: “PLACE, ST CC”. |
lat, lon | Decimal degrees. |
elev_m | Station elevation, meters. |
runtime_status | Our classification (not NOAA’s), computed on the 10/50/90% dates: has_dates_full18 (all 18 headline dates — 6,567 stations), has_dates_partial (550), censored_warm (freeze too rare — 137), censored_cold (year-round frost risk — 51). |
The nine variable groups (NN = 28, 32, or 36)
| Column pattern | Meaning |
|---|---|
lstNN_fp10 … fp90 | Last spring freeze at ≤ NN°F, as MM/DD. Direction is inverted — see the decode notes. |
fstNN_fp10 … fp90 | First fall freeze at ≤ NN°F, as MM/DD. Intuitive: fpYY = date by which the first freeze has occurred in YY% of years (fp10 early, fp90 late). |
gslNN_fp10 … fp90 | Growing-season length in days: the length with a YY% chance of a season at least that long. fp10 long, fp50 median, fp90 short. |
*_meas_flags | NOAA measurement flags seen in the group: Y = insufficient values to compute (includes warm stations where the freeze rarely happens); V = year-round frost risk. |
*_comp | NOAA completeness code for the group’s median value: S standard / R representative / P provisional / E estimated (exact definitions in the NCEI readme — prefer S). |
*_years | Years of record behind the group’s median value (2–30 in this file). |
occ28_pct, occ32_pct, occ36_pct | Percent of years the threshold occurs at all. Key West at 32°F = 0.0. |
Decode notes — the gotchas we had to figure out
These four things are where honest use of this data lives. We verified each against NOAA’s REST service before trusting our own extraction; they’re in the README too, so they travel with the file.
- Spring is inverted. For last-spring-freeze columns, NOAA’s percentile direction is the reverse of fall:
lst32_fp10is the latest date — a freeze after it happens in only 10% of years, the conservative “plant-safe” date — andlst32_fp90the earliest. Salt Lake City (USW00024127) at 32°F: fp10 = 04/30, fp50 = 04/08, fp90 = 03/17. Fall runs the intuitive way: fp10 = 10/17, fp50 = 10/31, fp90 = 11/13. The familiar “average last frost” islst32_fp50; read fp10 when you want the safe planting date. - Empty means censored, never zero. Where NOAA can’t compute a value it publishes −9999 plus a flag. In this CSV those are empty cells, with the flag preserved in
*_meas_flags— Y for insufficient values (including warm stations where the freeze rarely happens), V for year-round frost risk. Never parse an empty cell as a date. - Season length runs “inverted” too.
gsl32_fp10is the long season you get 1 year in 10; fp90 the short one you can bank on 9 years in 10. And censored-warm stations report a 365-day season with empty date columns and occurrence 0.0 — at Pago Pago or Key West, a 32°F “season” simply never ends. - Dates are MM/DD with no year, and seasons can wrap. In warm climates the last “spring” freeze can land in November–December (it belongs to the previous winter — real at coastal California stations) and the first “fall” freeze in January–June of the following year. Convert to day-of-year without handling the wrap and you’ll compute spring-after-fall nonsense.
Coverage, honestly
- US only. 7,247 stations across the 50 states and DC, 57 in Caribbean and Pacific territories, and one Canadian border station NOAA ships in the product. No international coverage.
- Sparse exactly where frost gets weird. Stations thin out in mountains and the rural West — in our validation regions, northern Utah has about 1.35 stations per 1,000 km² (median distance to the nearest: 9.6 km) while central Nevada has 0.41 (median: 24 km). A station 20+ km away at a different elevation is a real error source; that gap is why we built an elevation-corrected surface on top of this data.
- 738 stations are partial or censored. That’s NOAA being honest about what 30 years of record can support, and we kept it —
runtime_statustells you which rows, and the flags tell you why. - Normals, not forecasts. These are 1991–2020 climatological odds. They describe that window, not this year’s weather.
License and citation
The underlying data is a work of the United States Government (NOAA NCEI) and is in the public domain. We claim no copyright over NOAA’s data or facts, and NOAA does not endorse this extract.
Our compilation — the extraction, decoding, flag consolidation, and station classification — is offered under CC BY 4.0: use it anywhere, including commercially. The license’s one condition is credit, and we’ve made that a copy-paste:
Using this data? Credit is required by the license — here's the copy-paste, both flavors:
GardenTrack frost-station dataset, https://gardentrack.app/data/frost-station-normals/ — derived from NOAA NCEI 1991–2020 normals. Licensed CC BY 4.0.
<a href="https://gardentrack.app/data/frost-station-normals/">GardenTrack frost-station dataset</a>, derived from NOAA NCEI 1991–2020 normals
Source archive (pinned): NOAA NCEI U.S. Climate Normals 1991–2020, Annual/Seasonal Normals, v1.0.1 (c20230404), by-station multivariate CSVs · decoding docs in the NCEI readme.
Versioning
This is v1, extracted July 13, 2026 from NOAA’s c20230404 archive and released July 16, 2026. The file at the download URL only changes with a version bump, noted here and in the README changelog. Two more releases are planned behind it — the per-station validation tables from our accuracy work, and a downsampled copy of our frost surface once national validation is done. Neither has a link yet because neither is live yet; they’ll appear here and on the methodology page the day they are.
Want the answer instead of the dataset? The frost date lookup is free, no signup — it combines these stations with an elevation-corrected surface, and shows its work. How that surface is built, and how accurate we measured it to be, is on the methodology page; the build stories are on the blog.
GardenTrack itself — the garden app that remembers your garden and watches for frost — is in beta now. Join the beta.