Methodology · frost dates
How We Compute Frost Dates
Our frost dates come from 26 years of NASA Daymet daily low temperatures (1995–2020), reduced to 10/50/90% frost odds per square kilometer, then downscaled to ~250 m cells and corrected for each cell’s actual elevation using USGS 3DEP terrain. We validate against held-out NOAA stations: about 6 days median-date error, published in full below.
This page is the long version of the method behind the frost date lookup: every step, every data source with its license, and the accuracy we actually measured — including the parts that didn't go our way. If a number appears on the tool, its provenance is here.
The method, in three steps
- Start with the stations. NOAA publishes official frost probabilities for ~7,300 US weather stations. Gold standard where a station sits — sparse exactly where frost gets weird.
- Build a surface between the stations. 26 years of NASA Daymet daily lows on a 1 km grid, reduced to empirical frost odds for every cell.
- Correct for elevation. Each 1 km cell is split into ~250 m cells, and each one's odds are shifted for its actual elevation using USGS terrain.
Then everything gets computed once, offline, and baked into a lookup grid. When you use the tool, nothing is modeled live — your answer is read straight from the baked surface.
Step 1 — the station baseline
NOAA's National Centers for Environmental Information publishes 1991–2020 climate normals, including freeze probabilities, for about 7,300 US stations. For each station: the date by which the last spring freeze is done in 1 in 10 years, in half of years (the median), and in 9 in 10 years — at 36, 32, and 28°F. First fall freeze runs the same way. That 1-in-10 / median / 9-in-10 framing is NOAA's, and we use it everywhere.
Station normals are the most trustworthy frost numbers that exist — at the station. The problem is between stations. They're sparse in mountains and valleys, where frost behavior changes fastest, and the nearest one to you can sit hundreds of feet above or below your garden. Snapping you to it — which is what almanac-style ZIP lookups do — bakes that elevation gap into your answer.
We measured how much that costs, using NOAA's own file: across 6,191 station pairs, a station and its nearest neighbor disagree about the last spring frost by a median of 5 days, and 13.1% of stations within ten miles of each other disagree by two weeks or more. The full study, including where the method beats us, is how wrong the nearest weather station is.
So stations play three roles for us: the on-page cross-check next to every surface answer, the fallback where the surface has no data, and the held-out ground truth for the accuracy numbers below. The cleaned extract of all 7,305 stations is also our first open-data release — download it free.
Step 2 — the 26-year Daymet surface
Daymet V4 is NASA/ORNL's daily weather grid for North America: 1 km cells, every day since 1980. We use daily minimum temperature, 1995–2020 — 26 years. (Why it stops at 2020 is in the limits section. Short version: the open-access archive ends there.)
For every 1 km cell and every year, we find the last spring day and the first fall day at or below each threshold — 36, 32, and 28°F. That gives up to 26 real dates per cell per event per threshold. The 10/50/90% dates are the empirical percentiles of those dates: no fitted curves, no assumed distributions. Leap years are folded onto a 365-day calendar so February 29 can't skew a percentile.
Where a threshold doesn't happen in enough years — coastal California and a 28°F freeze, say — the cell is censored: it reports no data instead of a fabricated date, and the tool falls back to stations and says so.
Step 3 — the ~250 m elevation correction
A 1 km cell can hide 300 m of relief, and roughly 300 m of elevation is worth about 1.2°C on a typical night — call it 4 to 6 frost-days. So the last step splits each 1 km cell into a grid of ~250 m cells and shifts each one's frost odds from the parent cell's mean elevation to that fine cell's actual elevation, both computed from USGS 3DEP terrain data.
The shift uses a locally estimated lapse rate — how fast nighttime lows change with elevation — found by regressing Daymet's own temperatures against elevation over a neighborhood around each cell. Where the regression is unstable, we use a default of 4.0°C/km, clamped to a physical range. Measured medians in our pilot regions: 3.29°C/km (Utah) and 4.00°C/km (Nevada). Deliberately much shallower than the textbook 6.5°C/km free-air rate — night air near the ground doesn't behave like free air.
One honest wrinkle the regression exposes: in some cells the fit comes back near zero or negative — meaning cold air is pooling below warm slopes, the opposite of the simple elevation story. Those cells get flagged and take the default rate. What the flag means for accuracy is covered in the limits section, because it matters.
Baked once, served small
Everything above runs offline, once, on the whole lower 48. The output is a fixed-layout binary grid — 1,147 tiles, 6.32 GB — holding the 18 dates per cell (2 events × 3 thresholds × 3 percentiles) as day-of-year integers. A lookup reads the 36 bytes for your cell. No live weather API, no per-request modeling, nothing that can silently change your answer between visits. When the surface changes, it's a versioned rebake, and this page changes with it.
How we measured accuracy
The test: hide real NOAA stations from the model, predict frost dates at each hidden station's location from the surface, and score the predictions against what the station's published 1991–2020 normals say. Errors are in days, on the median (50%) dates, averaged over all six event × threshold combinations.
The baseline we compare against is a leave-one-out nearest-station lookup — for each held-out station, the answer its nearest surviving neighbor would give. That's effectively what a ZIP or almanac lookup does, so beating it is the whole point. "Complex terrain" means at least 100 m of relief inside the station's 1 km cell.
We ran two pilot regions on purpose: one station-dense (northern Utah — Wasatch Front, Cache Valley, west desert; 69 stations) where nearest-station is a strong opponent, and one station-sparse (central Nevada basin-and-range; 34 stations) that looks like the rural US, where nearest-station has to reach 30 km for an answer.
Utah pilot — station-dense (69 stations)
| Terrain | Our surface (250 m), MAE | Daymet 1 km base, MAE | Nearest-station baseline, MAE | Error cut vs baseline |
|---|---|---|---|---|
| All stations | 6.74 days | 6.59 days | 9.21 days | 26.8% |
| Flat | 7.36 days | 7.34 days | 7.87 days | 6.5% |
| Complex | 6.26 days | 6.00 days | 10.25 days | 38.9% |
10–90% band held in 92% of station × event × threshold cases (n = 376). Sanity: 0 percentile-order inversions in 4,915,008 checks; 0 spring-after-fall violations in 819,168.
Central Nevada pilot — station-sparse (34 stations)
| Terrain | Our surface (250 m), MAE | Daymet 1 km base, MAE | Nearest-station baseline, MAE | Error cut vs baseline |
|---|---|---|---|---|
| All stations | 6.77 days | 6.74 days | 11.05 days | 38.7% |
| Flat | 7.19 days | 7.12 days | 11.03 days | 34.8% |
| Complex | 6.12 days | 6.15 days | 11.06 days | 44.7% |
10–90% band held in 94% of cases (n = 168). Sanity: 0 percentile-order inversions in 8,000,244 checks; 0 spring-after-fall violations in 1,333,374.
What the two pilots say together
| Utah (dense) | Nevada (sparse) | |
|---|---|---|
| NOAA stations in region | 69 | 34 |
| Station density (per 1,000 km²) | 1.347 | 0.408 |
| Median distance to nearest station | 9.6 km | 24.0 km |
| Median distance the baseline reached | 10.0 km | 30.4 km |
| Our surface error, complex terrain | 6.26 days | 6.12 days |
| Nearest-station error, complex terrain | 10.25 days | 11.06 days |
| 10–90% band held | 92% | 94% |
Read the two middle rows against the two below them. The surface's own error barely moves between regions — 6.26 vs 6.12 days — because it doesn't know or care where stations are. The nearest-station error grows as stations thin out. That's the whole case in one table: the surface is about 5 days more accurate than a nearest-station or ZIP lookup in complex and station-sparse terrain, with honest probability bands.
And the flip side, said plainly: on flat ground near a good station, a station lookup does fine — in dense-station Utah flatland we beat it by all of 6.5%. That's why the tool shows your nearest stations next to every answer, with the agreement measured in days, instead of asking you to trust the surface.
The lower-48 validation — 7,006 stations, the whole country
We promised the national numbers would land here whichever way they pointed. They landed 2026-07-17. Every NOAA station inside the lower-48 grid — 7,006 of them — was held out, and the 6,857 with scoreable normals were graded the same way as the pilots (the rest sit on cells too warm to ever freeze, or lack a usable normal; every exclusion is counted in the report, never silently dropped).
| Population | Stations | Our surface error (MAE) | Nearest-station error | Error cut |
|---|---|---|---|---|
| All terrain, lower 48 | 6,857 | 6.0 days | 7.2 days | 16.8% |
| Complex terrain | 1,297 | 7.6 days | 11.0 days | 31.2% |
| Complex terrain, nearest station > 20 km | 491 | 8.5 days | 13.1 days | 35.4% |
The 10–90% band held in 94.3% of cases nationally — every season-and-threshold combination cleared 92%. Ordering never broke: zero cases anywhere of the 10% date landing after the 50%, or spring landing after fall, across all 156.9 million land cells.
What the country-scale test adds to the pilot story, honestly told:
- The advantage lives where terrain is complex and stations are sparse — not everywhere. Across the flat, station-dense East, a nearest-station lookup is genuinely good, and the surface beats it only modestly. In the South it doesn't beat it at all: the surface measured 0.21 days behind a plain station lookup there. That's why the tool shows your nearest stations next to every answer — where they're good, you see it.
- The pilots' "40% error cut" does not generalize nationally, and we're correcting the record. Distance alone doesn't break a station lookup — distance plus terrain does. The 40%-class cut shows up only where both coincide (35.4% at >20 km, 39.3% at >30 km). The right national claim is the one in the table: roughly 4–5 days more accurate in complex, station-sparse terrain.
- Complex-terrain error is regime-dependent. East and interior mountains run 4.7–6.3 days — inside the pilot-anchored 6–7-day expectation. The Pacific states don't: excluding California, Oregon, and Washington, national complex-terrain error is 6.25 days; including them it's 7.6.
- The weakest places are marginal-frost coasts — for every method. Where a 32°F freeze happens in only 80–99 years out of 100, spring median-date error inflates to ~15 days — and the station-based baseline degrades just as badly (~15 days). It's a property of the question, not the tool: when frost barely happens, its "usual date" barely exists. Coastal California and the marine Northwest are where this bites, and where the band — not the median — is the honest answer.
One more thing the national run taught us, because this page is about method: our own first draft of the national report was wrong, and the adversarial audit we run before publishing caught it. NOAA counts the frost season August through July, so a coastal Florida station's "first fall freeze" can legitimately land in January — and our validator was scoring those as ~360-day misses instead of single-digit ones. Every fall error number you see above is from the corrected run. The uncorrected version made our surface look worse than it is; we'd still rather tell you it happened.
Pilot numbers are from the Stage-1 pilot validation reports (Utah and central Nevada, 2026-07-13); national numbers are from the CONUS national validation report (2026-07-17, v2 post-audit), all generated directly from the pipeline's run artifacts. The per-station tables are part of the planned open-data release below.
The accuracy bar we set — and the one we changed
Our original acceptance bar said the surface had to beat the nearest-station baseline by at least 50% in complex terrain. Both pilots failed it: 38.9% in Utah, 44.7% in Nevada.
The pilots also showed why the bar was wrong, not just missed. The surface's error floor is about 6 days — that's the Daymet 1 km base's own error at stations, which no downscaling can fix. And the baseline only degrades to about 11 days even when it's reaching 30 km for a donor station. Six over eleven caps the possible error cut near 45%. The 50% bar was arithmetic the physics couldn't reach — holding it would have meant either fudging the measurement or throwing away a genuinely useful surface.
So on 2026-07-13 we re-anchored the bar in absolute terms: median-date error of 6–7 days or better in complex terrain, at least a 40% error cut where the baseline has to reach past 20 km, no degradation on flat ground, and the 10–90% band holding at least 90% of the time. Both pilots pass that bar, and it's the one this page reports against. We're publishing the miss and the change rather than quietly moving the goalposts — the failed 50% bar is in the validation reports too.
The national run then measured the whole country against that bar — with one thing said plainly: the bar was pre-registered for the pilots, so nationally this is a measurement, not a pass/fail claim. Two of the four expectations held everywhere (flat ground never degrades; bands over 90%), one held outside the Pacific marine regime (complex-terrain error: 6.25 days excluding CA/OR/WA, 7.6 including), and one didn't generalize — the 40% cut only exists where sparse and complex coincide. Those national numbers, not the pilot ones, are now the claims on the tool page.
The cold-air experiments — pre-registered, results public, nothing shipped
The cold-air-drainage correction (the fix for the pooling problem below) is being developed as pre-registered experiments: the pass/fail bar is published before each run, and the result is published either way. The record so far:
- Attempt 1 (2026-07-16): 5 of 6 criteria passed — verdict FAIL. Cache Valley came in at 42.2% of the real 45-day spread against a declared 50% line. The bar didn't move. Full results; the bar itself is in the pre-registration.
- Attempt 2 (2026-07-16): 6 of 6 by the letter — pass rejected, verdict NO-GO. The decisive criterion's pass appeared only in held-out test folds, where a fallback coefficient the shipping model would never use produced the number; the model we would actually ship measures 45.6% — still under the bar. Both pre-registered mechanisms failed honestly: the pool-height coefficient fit to ~zero, and the tail hypothesis was falsified by measurement. Artifact-free progress: 42.2% → 45.6%. The attempt loop's stop clause fired; a redesign gets a fresh public pre-registration before anything runs again. Detailed numbers live in the validation reports (both attempts) in our repository's validation records, summarized in the attempt-2 results post on the blog.
Through all of it, the tool serves only the validated Stage-1 surface. The correction ships when — and only when — it beats that surface in held-out validation with the artifact class above ruled out.
What this method can't see (yet)
- Cold-air pooling — the big one. Elevation is corrected; cold-air drainage is not. The clearest measured case: in Utah's Cache Valley, NOAA ground truth puts a 45-day frost-free-season gap between the Utah State University bench and the Trenton valley floor — and the bench sits higher yet stays warmer, because cold air drains off it and pools on the floor. Our elevation-only surface reproduces 0 of those 45 days. In the Nevada pilot, 36% of 1 km cells were inversion-flagged — cold air pooling below warm slopes. A cold-air-drainage correction is the next stage of this tool, and it ships only after it beats the current surface in held-out validation. Until then, we don't claim it.
- The record caps at 2020. The open-access Daymet daily archive ends December 30, 2020, so the surface window is 1995–2020. Station cross-checks run 1991–2020. An extension rebake is planned.
- A ~250 m cell is not your exact bed. Walls, berms, dense canopy, and other man-made frost traps are invisible to a bare-earth terrain model. Your own logged frosts beat any model at your exact spot.
- Climatology is not a forecast. These are odds from 26 years of records, not a prediction for this year. Any single season can swing two weeks either way. Check the live forecast the week you plant — and for planting decisions that matter, it's worth checking your county extension office's local recommendations too.
Data sources and licenses
Every input, what it does, and the license terms it's used under:
- NOAA NCEI — U.S. Climate Normals 1991–2020, freeze/frost probabilities ~7,300 stations' first/last freeze dates at 10–90% probability. The on-page cross-check, the fallback where the surface has no data, and the held-out validation ground truth. License: US federal public domain.
- Daymet V4 — daily minimum temperature, 1 km (NASA / ORNL DAAC) The base climate record: 26 years (1995–2020) of daily gridded lows. License: public domain (CC0-equivalent); citation requested, and given — Thornton et al., Daymet V4, ORNL DAAC. Accessed for the bake via the openly accessible Microsoft Planetary Computer archive, which ends 2020-12-30 (the window cap).
- USGS 3DEP — 1 arc-second (~30 m) elevation The terrain behind the elevation correction. License: US federal public domain, "no use restrictions."
- Copernicus DEM GLO-30 Fallback elevation at a small number of documented 3DEP coverage gaps, mostly coastal. License: free to use with mandatory attribution; because we derive lapse-corrected values from it, the required modified-data notice applies: contains modified Copernicus DEM GLO-30 data © DLR e.V. 2010–2014 and © Airbus Defence and Space GmbH 2014–2018, provided under COPERNICUS by the European Union and ESA; all rights reserved.
- US Census Bureau — Census Geocoder Turns the address you type into coordinates, and ZIPs into centroids, at lookup time. License: public domain. It's the only external service in the live path, and it never sees anything but the location you ask about.
Sharing the data and the learnings
Live now: the station freeze-normals extract — the cleaned NOAA station data from step 1, all 7,305 stations in one documented CSV with a plain-text column dictionary covering the decode traps (the inverted spring percentiles, the censoring flags). Free download — an email on that page unlocks it instantly, and the license is unaffected: the NOAA data is public domain, our compilation is CC BY 4.0 with a copy-paste citation provided.
Still to come, in order: the per-station validation tables behind the accuracy numbers above, so anyone can check our math. Then a downsampled copy of the frost surface itself, once the national validation blesses it. The pipeline and the full-resolution surface stay in a private repo for now, and each release gets linked from this page the day it's actually live — no placeholder links.
The learnings aren't waiting on any of that — the method, the measured errors, and the bar we had to change are all on this page now.
FAQ
How are frost dates calculated?
Ours come from counting, not curve-fitting. For every spot we take 26 years of daily low temperatures (1995–2020) and find, for each year, the last spring day and first fall day at or below 36, 32, and 28°F. The 10/50/90% dates are the actual percentiles of those years, shifted for your spot’s elevation.
How accurate are these frost dates?
Measured against 7,006 held-out NOAA stations across the lower 48: median-date error of about 6 days nationally, and roughly 4–5 days better than a nearest-station lookup where terrain is complex and stations are sparse (8.5 vs 13.1 days). The 10–90% band held in 94% of cases. Where the land is flat and stations dense, a good nearby station ties the surface — the tool shows both.
Is a frost date a forecast?
No. A frost date is climatology — the odds built from decades of records, using NOAA’s 1-in-10 / median / 9-in-10 framing. It tells you when frost usually ends or starts at your spot. Any single year can swing two weeks either way, so the week you plant, check the live forecast. Every time.
Can I download the data?
Yes — the first release is live. The cleaned NOAA station extract — 7,305 stations, official 1991–2020 freeze probabilities in one documented CSV — is free at gardentrack.app/data/frost-station-normals/ (public-domain NOAA data; our compilation CC BY 4.0). Next, in order: the validation tables behind our accuracy numbers, then a downsampled copy of the surface once national validation is done.
Why does the data stop at 2020?
The open-access Daymet daily archive we bake from ends December 30, 2020, so the surface window is 1995–2020 — 26 years. Station cross-checks use NOAA’s 1991–2020 normals. Frost climatology moves slowly, so 26 recent years is a solid base, and an extension rebake is planned. We’d rather tell you the cap than hide it.
We're building this in public — the misses included, as you may have noticed. The build stories behind this page live on the blog, starting with the tile-naming bug that nearly shipped wrong coastal frost dates.
To actually use all this: the frost date lookup is free, no signup. The rest of the free garden tools live alongside it.
This same surface is the data behind the frost alert we're building into GardenTrack, the garden app in beta now — it'll know your garden's frost odds and watch your local forecast so you get a heads-up when frost's actually coming. Want in when it ships? Join the beta.