How SoilStack predicts last-spring-frost dates
Documentation of the data, methods, and citations behind every frost outlook on a SoilStack zone page.
01What this is
Every SoilStack zone page shows a section called NOAA Frost Probability with three dates: an earliest, a typical, and a latest. Those three dates come from a NOAA dataset called the 1991–2020 Annual/Seasonal Climate Normals — a 30-year statistical baseline that climatologists update once a decade. We refer to it as the Normals below.
This page documents exactly how those three dates are derived, what each one means, what the underlying data covers, and where it doesn't. It also documents the one subtle place where NOAA's labeling convention runs opposite to most gardening literature — a detail we surface here so anyone digging into the source data understands why the numbers we display might look like they're in reverse order.
The station-level probability dates are NOAA's; the ZIP and zone composite dates are SoilStack-derived aggregates of them. SoilStack's contribution is the presentation layer: aggregating thousands of weather stations into per-USDA-zone composites, translating the probability percentiles into plain-English headlines, and surfacing the citation chain so any AI engine, journalist, or researcher can verify our numbers against the primary source in two clicks.
What “last spring frost” means here. Throughout
this page (and on every SoilStack zone page) “last spring frost”
refers specifically to the last calendar date the minimum temperature
reaches 32°F or below — the freezing point of
pure water and the temperature NOAA uses for its primary frost
climatology element (TMIN-PRBLST-T32F). This is a hard
scientific threshold, not a biological one: some crops can be damaged
at temperatures above 32°F depending on duration of exposure,
humidity, wind, and the crop's individual cold sensitivity. These
dates are the freezing-threshold benchmark, not a universal
“safe to plant” signal. NOAA also publishes probability
dates at five other thresholds (16°F, 20°F, 24°F,
28°F, and 36°F) for stations and applications that need
different cutoffs — see Section 2 for the full element catalog.
Spring and autumn. This page is written around the last spring frost because that is the date most planting decisions turn on, but the same method covers the first fall frost as well. SoilStack derives autumn first-frost probabilities from the matching NOAA variable in the same Normals dataset, aggregates them into per-zone composites the same way, and applies the same live-forecast blending in the opposite direction as autumn approaches (Section 5). Everything this page documents about sourcing, aggregation, the percentile convention, cross-validation accuracy, and limitations applies equally to the autumn dates; only the direction of the season differs.
02Data sources
Primary: NOAA NCEI 1991–2020 Annual/Seasonal Climate Normals
Published in 2021 by NOAA's National Centers for Environmental Information.
Dataset identifier gov.noaa.ncdc:C01619. Covers approximately
15,000 U.S. weather stations and reports last-spring-frost (and first-fall-frost)
probability dates at six temperature thresholds — 16°F, 20°F,
24°F, 28°F, 32°F, and 36°F — for nine probability
percentiles each. Released under the
NOAA Open Data Dissemination license
(public domain). Update cycle: every ten years.
We pulled this dataset via NCEI's Access Data Service in May 2026 and catalogued 15,492 U.S. stations. Of those, 7,247 carry usable frost-normal data, and 6,948 publish the primary 32°F last-spring-frost percentiles this page is built on. The remaining stations are catalogued but carry no frost normals to ingest: NOAA does not publish frost probabilities for every station in its network (many are precipitation-only or have records too short for the 30-year climatology). We do not compute or infer values for those stations; a station is used only if NOAA itself published its frost normals. This is the completeness filter, and it is NOAA's, applied at the source rather than by us.
Supporting: USDA ZIP-to-zone lookup
Which USDA hardiness zone a ZIP code belongs to is not something we compute. We use the USDA's own published ZIP-code-to-zone lookup derived from the 2023 Plant Hardiness Zone Map, which assigns each of the roughly 39,900 U.S. ZIP codes to a single zone. Because the assignment is USDA's, any handling of a ZIP that physically straddles two zones (mountainous terrain, coastal gradients) is USDA's methodology, not ours; we read the assignment directly and do not perform our own spatial join. This keeps the zone boundaries on SoilStack identical to the official USDA map a gardener would look up.
Supporting: US Census Bureau 2024 ZCTA Gazetteer
To map weather stations to ZIP codes we needed ZIP-code centroids. Those come from the U.S. Census Bureau's 2024 ZIP Code Tabulation Area (ZCTA) Gazetteer — the canonical public-domain ZIP-to-coordinate reference. 33,791 ZCTA centroids were used to build a ZIP-to-station crosswalk via great-circle (Haversine) distance with inverse-distance-squared weighting. Median nearest-station distance across all U.S. ZIPs ended up at 11.85 km.
Supporting: USDA 2023 Plant Hardiness Zone Map
The Plant Hardiness Zone Map released by USDA in 2023 defines which
5-digit ZIP code maps to which hardiness zone (e.g. 47403 →
Zone 6b). We use that mapping to aggregate per-ZIP frost composites
into per-zone composites.
Live forecast: NWS public forecast API (V2)
V2 of the Frost Prediction Engine adds a second, live data source on top of the climatological baseline above: the National Weather Service's public forecast API. When a visitor enters a ZIP code, we query the NWS forecast for that ZIP's own coordinates and read the overnight low for each night the forecast covers, about the next seven days. The forecast is always for the visitor's location, never a stand-in city standing in for a whole zone.
This source is used narrowly and only when it is honest to do so. The optional live freeze outlook on a zone page appears only when a freeze is within roughly a week, the range where the NWS point forecast genuinely reaches. Without a ZIP, or outside that window, no forecast is consulted and the climate normal stands alone. The blending rule is documented in full in Section 5.
03How NOAA calculates frost-date probabilities
Here is the procedure NOAA applies to every station in the network, plain-spoken:
- Take 30 years of daily minimum-temperature observations from a single weather station — for the current product, calendar years 1991 through 2020.
- Build a serially complete daily minimum-temperature record for the station: NOAA fills short gaps using anomalies from nearby stations and adjusts the series to stay consistent with its homogenized monthly temperatures, so the daily record has no missing days and no discontinuities.
- From that complete record, generate 10,000 simulated annual temperature cycles by resampling monthly temperature sequences (with date offsets and imposed monthly means). NOAA simulates the underlying temperature, not the freeze dates directly — this is the “bootstrapping” step, and it smooths the jaggedness of a short 30-year sample.
- For each simulated year, read off the last day at or below the 32°F threshold, then across all 10,000 simulations compute, for each calendar date, the probability that the last spring freeze has not yet occurred — reported at the 10%, 20%, … 90% levels. That set of probability dates is the last-freeze probability curve for the station.
Repeat across approximately 15,000 stations and you have the dataset SoilStack draws from. The full procedure, with all the statistical caveats around station completeness, missing-data interpolation, and quality-control flagging, is documented in NOAA's Normals Calculation Methodology (2020); the dataset itself is cited as Palecki et al. (2021) — see Section 9.
04What P10, P50, and P90 mean for planting decisions
Most gardening references give a single "last frost date" per location. That's a useful headline number — it's the median, the date by which half of years see their final frost — but it conceals the actual year-to-year variability. The P10/P50/P90 framing surfaces that variability directly.
The clearest way to read the three levels is at a single NOAA station, where the probabilities hold exactly. At one station:
- Earliest (P10) — the date by which roughly 10% of years at that station have already seen their last freeze. Planting tender crops this early succeeds in about 1 year in 10 and loses to a late freeze in the other 9. Aggressive gardeners with row cover and a willingness to replant target this date.
- Typical (P50) — the median. Half of years at that station have their last freeze on or before this date. This is the date most one-number "last frost" references give. Reasonable target for unprotected tender crops in an average year.
- Latest (P90) — the date by which roughly 90% of years at that station have seen their last freeze. Waiting until this date cuts the freeze risk to roughly 1 year in 10 — low, but not zero — at the cost of compressing your growing season. Conservative gardeners in cold-hardy climates target this date.
On a SoilStack zone page, the three dates carry these same Earliest / Typical / Later labels, but the number shown is a regional composite: a ZIP-count-weighted average, across the zone, of the corresponding station-level date. The exact “X% of years” reading above holds at an individual station; for the zone composite, treat the three dates as a typical regional window rather than as an exact probability for any one location. Section 6 explains why an average of percentile dates does not itself carry that exact coverage, and how to get a place-specific number.
Zone 6b's composite shows Earliest Apr 9, Typical Apr 23, Latest May 10. Each is the ZIP-count-weighted average, across Zone 6b, of the corresponding station-level date — so Apr 23 is the zone's typical last-freeze center, not a guaranteed 50% date for every location in the zone. Read the three together as a broad regional window: tender crops planted near the Earliest date face the most risk, the Typical date is the regional center most gardens orient to, and the Latest date is the conservative end. For odds tied to a specific place, drop to the per-ZIP or per-station figures. The roughly month-long span from Earliest to Latest is the “frost window” the zone-page chart visualizes.
05The percentile convention (read this if dates look backwards)
NOAA and the gardening literature use the same probability framework but label their percentiles from opposite sides. NOAA's calculation methodology defines last-spring-freeze probability dates from the remaining-risk side — the probability that the last spring freeze occurs on or after a given date. This convention conversion applies first at the station data level; SoilStack then aggregates the converted station dates into ZIP and zone summaries. SoilStack displays the same dates from the complementary gardener-facing side — the probability that frost is already done by that date. This section explains the mismatch so anyone comparing a SoilStack zone page to a NOAA data file sees why labels flip.
Convention 1 — "probability frost still to come" (NOAA NCEI)
NCEI's dataset is labeled in terms of probability that frost is still to come. Under this convention:
P10means “10% chance frost is still to come on or after this date.” That's the latest plausible last-frost date.P50means “50% chance frost is still to come.” The median.P90means “90% chance frost is still to come.” That's the earliest plausible last-frost date.
Convention 2 — "probability frost is done by" (gardener-facing)
Gardening references, university extension publications, and most consumer-facing frost calculators label things in the opposite direction — probability that frost is already done:
P10means “10% chance frost is already done by this date.” The earliest plausible last-frost date.P50means “50% chance frost is already done.” Same median.P90means “90% chance frost is already done by this date.” The latest plausible last-frost date.
The two conventions describe the same physical reality — the distribution of last-frost dates over a 30-year period — from complementary angles. The median (P50) is the same in both. The two endpoints swap labels.
NCEI publishes the following three values for last-spring-frost at 32°F for this high-elevation California station:
ann-tmin-prblst-t32fp10: 06/09 — June 9. NCEI's Convention-1 P10 means "10% chance frost is still to come on or after June 9," so this is the latest plausible last-frost date.ann-tmin-prblst-t32fp50: 05/27 — May 27. The median.ann-tmin-prblst-t32fp90: 05/06 — May 6. NCEI's Convention-1 P90 means "90% chance frost is still to come on or after May 6," so this is the earliest plausible last-frost date.
On a SoilStack page, the same three numbers display as Earliest May 6, Typical May 27, Latest June 9 — Convention 2, gardener-friendly. Same data; same dates; opposite labels.
You can verify the NCEI values directly with this command:
curl "https://www.ncei.noaa.gov/access/services/data/v1?dataset=normals-annualseasonal-1991-2020&stations=USC00040741&format=csv&dataTypes=ANN-TMIN-PRBLST-T32FP10,ANN-TMIN-PRBLST-T32FP50,ANN-TMIN-PRBLST-T32FP90"
SoilStack stores values in Convention 1 (matching the NCEI source attribution chain in our database) and displays them in Convention 2 (matching gardener expectations). The conversion happens in exactly one place in our code — the per-zone aggregation step — and is documented inline alongside the conversion itself. The result: anyone tracing the station-level inputs back to NCEI sees parity with the source data, with SoilStack's interpolation and display-convention conversion documented separately.
Live forecast blending (V2)
Everything above describes the V1 climatological baseline. V2 adds an optional live freeze outlook that pairs that baseline with the live NWS forecast for a visitor's ZIP. It is designed around one honest constraint: a genuine short-range forecast only exists about a week out, so that is the only window in which a live forecast can add anything to the climate normal.
Outside the forecast horizon, the line is the climate baseline. Months before a zone's frost date, the line sits exactly on the P50 median as a climatological baseline — not a year-specific prediction. This is deliberate: with no forecast in range, 30 years of climate data is the most reliable single reference available, and it already expresses the full probability distribution. We do not invent a more precise number than the science supports.
Within the forecast window, a live freeze signal appears. Once the frost date is inside the NWS forecast window, we read the overnight lows the forecast covers. If a forecast night is at or below the freezing threshold, the outlook shows that forecast freeze, labeled as forecast-based and distinct from the climate baseline. What a forecast freeze establishes is a lower bound: the season's final freeze cannot fall earlier than a forecast freeze night, though later freezes remain possible beyond the forecast horizon. Beyond the forecast horizon the estimate decays back to the climate normal, because no forecast can reliably see further out.
Why an early warm spring does not move the estimate earlier
A tempting but incorrect approach would be to pull the frost estimate earlier whenever a spring runs warm, or to narrow the window as soon as no frost appears in the near-term forecast. We deliberately do not do this. The date of the last frost does not reliably track how warm the early season has been: warm springs are frequently interrupted by a late cold snap, and acting on early warmth is exactly how a false spring damages a garden. The estimate only moves earlier when a forecast actually shows a freeze within the horizon, which raises the lower bound on the final-freeze date, never on the mere absence of forecast frost or on general seasonal warmth. A short-range forecast cannot observe the rest of the season, so it can confirm the season is not yet freeze-free but cannot establish that any given freeze is the last one.
The same blending applies to the autumn first-frost estimate, as a provisional upper-bound signal: it holds on the fall climate normal until a forecast freeze night appears within the horizon, then shows that forecast freeze. As in spring, a forecast freeze does not establish that it is the season's first — an earlier freeze may still occur.
06How we compute per-zone composites
NOAA publishes data per weather station. A USDA hardiness zone covers many ZIP codes, and each ZIP code is served by several nearby stations. To go from station-level data to zone-level data we apply three aggregation steps, in this order:
Step 1 — Station-to-ZIP crosswalk
For every U.S. ZIP code, find the nearest weather stations by great-circle (Haversine) distance to the ZIP centroid, and weight each station's contribution to that ZIP by inverse distance squared. A station 5 km away counts four times as much as one 10 km away. Stations beyond 150 km of a ZIP are not used.
The crosswalk runs once per data refresh and produces a per-ZIP lookup: for every U.S. ZIP, here are the top contributing stations with their weights. Median nearest-station distance across all covered ZIPs is 11.85 km; 95% of ZIPs are within 26 km of a usable station. 191 ZIPs (chiefly bush Alaska) have no usable station within 150 km and are excluded.
99.7% of ZIPs with a frost composite are within 30 miles of a contributing station (median 7.4 miles). The 89 that are not are mostly in remote Alaska, with a scattering across the interior West; the farthest is 92 miles.
Every one of the 33,600 retained ZIPs draws on more than one station: there are no single-station ZIPs in the crosswalk. This matters because it means a ZIP composite is never a single station standing alone. Using multiple stations reduces, but does not eliminate, sensitivity to any one station: under inverse-distance-squared weighting a very close station can still receive most of the weight, and nearby stations may share the same regional or elevation bias. Still, a ridge-top or urban-heat-island station is blended with neighbors rather than being the sole input for a ZIP, so its microclimate bias is dampened rather than passed straight through.
Step 2 — Per-ZIP composite
For each ZIP, combine its contributing stations into a single composite frost prediction. Frost dates are aggregated using a weighted circular mean — the standard technique for averaging calendar dates, which handles year-boundary wraparound correctly (relevant for warm zones where last frost falls in January or February of the same calendar year). Numeric values like growing-season length are aggregated with a weighted arithmetic mean.
If a contributing station happens to be missing a specific measurement (some stations record temperature thresholds others don't), the remaining stations' weights are renormalized for that element rather than backfilled with neighbors. The result: honest nulls when no coverage exists; no quiet interpolation.
Step 3 — Per-zone composite
For each USDA hardiness zone, average the per-ZIP composites across every ZIP assigned to that zone in the USDA 2023 map. This is an equal-weight average across ZIPs — ZIP-level weighting already accounted for station distance in step 1, so the zone-level step doesn't re-weight by station count.
Weighting every ZIP equally makes this a ZIP-count-weighted composite: each ZIP gets one vote regardless of its population or land area. This is neither strictly population-weighted nor area-weighted. Because ZIP codes are more numerous where settlement is denser, the composite leans somewhat toward populated areas, but it is not a true population weighting — a 500-resident rural ZIP and a 50,000-resident urban ZIP count equally. We state this plainly rather than overclaim it: the zone figure is a summary across the zone's ZIPs, and anyone who needs a number tied to actual population or to their specific location should use the per-ZIP and per-station figures below the zone level. (Note also that the ZIP units here are Census ZCTAs, which are generalized approximations of USPS ZIP delivery areas, not the USPS codes themselves.)
What the zone composite is, and is not. Each zone date is an average of station-level probability dates, not a recomputed zone-wide percentile. This distinction matters. Averaging several stations' median (P50) last-freeze dates does not produce a date with an exact 50% probability for the zone: if one location's median is April 1 and another's is May 1, their average is April 16, but nothing guarantees April 16 carries 50% odds for either place or for the two combined. The crisp “X% of years” odds are a real property of each individual NOAA station's probability date; they do not transfer unchanged to an average of many such dates across a geographically diverse zone. So the zone figures are best read as typical regional summaries — the average of local NOAA dates — rather than as a single probability distribution that every location in the zone shares. The precision varies by level: at an individual NOAA station, the exact percentile meaning holds directly; a per-ZIP value is a more locally relevant estimate but is itself an interpolated average of several stations, so it does not carry an exact percentile guarantee either; and the zone value is a broader regional composite of those ZIP estimates. For the strict NOAA probability interpretation the station-level figure is the one that holds; the ZIP figure is the most locally relevant estimate for a specific place.
Reference values per zone (current build)
The 16 USDA hardiness zones with a NOAA frost composite. SoilStack covers 18 zones — the full lower-48 range 3a–11b — but zones 11a and 11b are frost-free by definition (their winter minimum of 40–50°F never reaches freezing), so NOAA publishes no frost dates for them and they carry no composite to report here. Their zone pages explain that directly instead. The three dates are the zone's Earliest, Typical, and Latest composite last-freeze dates — each one the ZIP-count-weighted average, across the zone's ZIPs, of the corresponding NOAA station-level probability date (gardener P10, P50, and P90 respectively). These labels summarize the aggregated station probabilities; they are not a claim that exactly 10%, 50%, or 90% of years across the whole zone fall by these dates (see the note below on why an average of percentile dates does not itself carry that exact coverage). These are the same values shown on each zone's page. Click any zone code to see the full chart.
| Zone | Earliest | Typical | Latest | Contributing ZIPs | Total ZIPs |
|---|---|---|---|---|---|
| 3A | May 8 | May 22 | Jun 7 | 5 | 5 |
| 3B | May 5 | May 18 | Jun 1 | 196 | 204 |
| 4A | May 1 | May 14 | May 28 | 742 | 783 |
| 4B | Apr 28 | May 11 | May 25 | 1,178 | 1,256 |
| 5A | Apr 23 | May 7 | May 21 | 2,257 | 2,393 |
| 5B | Apr 20 | May 4 | May 18 | 2,580 | 2,865 |
| 6A | Apr 15 | Apr 29 | May 15 | 4,570 | 5,183 |
| 6B | Apr 9 | Apr 23 | May 10 | 4,562 | 5,263 |
| 7A | Apr 2 | Apr 17 | May 4 | 4,006 | 4,856 |
| 7B | Mar 22 | Apr 7 | Apr 23 | 3,034 | 3,840 |
| 8A | Mar 11 | Mar 30 | Apr 15 | 2,596 | 3,421 |
| 8B | Feb 27 | Mar 20 | Apr 8 | 2,648 | 3,375 |
| 9A | Feb 5 | Mar 4 | Mar 27 | 1,767 | 2,199 |
| 9B | Jan 6 | Feb 7 | Mar 9 | 1,474 | 2,085 |
| 10A | Dec 24 | Jan 18 | Feb 17 | 792 | 1,234 |
| 10B | Dec 19 | Jan 11 | Feb 10 | 473 | 751 |
Warm zones (9A and 9B) show last-frost dates in January, February, and early March of the same calendar year — those climates see their final frost in winter, not spring. The aggregation handles this year-wrap explicitly via a 365-day circular calendar internally; the dates above are correct.
6.5How accurate the interpolation is (cross-validation)
Documenting a method is one thing; measuring how close it lands is another. To put a number on the accuracy of the station-to-location interpolation in Step 1 above, we ran a standard leave-one-out cross-validation across every in-scope weather station.
What we tested
The procedure mirrors what the engine does for a real ZIP that has no weather station of its own — it estimates from the neighbors. We took each of the 6,923 NCEI stations the run evaluated, removed that station from the network, re-derived its location's last-spring-frost dates (Earliest / Typical / Latest at 32°F) using only the remaining stations, and compared the estimate to the station's own published normals. Because a held-out station never contributes to its own estimate, the comparison is honest: it measures how well the inverse-distance method fills a gap, which is exactly the job it does in production.
Of those, 6,745 fall in zones 3A–10B and carry a USDA hardiness-zone assignment; across all three percentiles they yield the 20,235 predicted-versus-actual comparisons reported below. The remaining 178 are excluded from the per-zone figures because they have no zone to be grouped under: they crosswalked to ZIP codes — chiefly university and military campus codes such as 86011, 85721 and 93943 — that USPS issues but the USDA hardiness map does not cover, because that map is built on Census ZIP Code Tabulation Areas and a single-building ZIP has no tabulation area. As in Section 2, that boundary is USDA's, not ours.
The result
Across zones 3A–10B, the interpolation reproduces a held-out station's last-spring-frost dates to a median absolute error of 5 days and a mean absolute error of 7.0 days (RMSE 11.1 days). Across all 20,235 comparisons the mean signed error is −0.48 days, so predictions run about half a day early on average — negligible against the 7-day mean absolute error. ⚠ That pooled figure does, however, average over a real sign change by region — the per-zone column in the table below shows the temperate zones running slightly early and the warmest zones running late. The paragraph after the table sets out what that means and what it does not.
For context, the interpolation error is smaller than the P10–P90 frost-date spread shown in the zone composites — within a single zone the Earliest-to-Latest window is a month or more (see Section 4). That does not make the estimate a year-specific forecast, but it does mean the interpolation error is modest relative to the climatological frost window the product is built to summarize — though, as the table below shows, that accuracy varies by region.
Accuracy by zone
Accuracy is not uniform across the country. It is tightest in the cold and temperate zones — 4A is the most accurate multi-station zone in the country at 4.6 days — degrades southward to a maximum at 9B, then partially recovers in 10A and 10B. ⚠ The gradient is therefore not monotonic, and an earlier version of this page described it as though it were. That pattern is consistent with winter-timed freeze events, sparser effective station coverage, coastal gradients, and microclimate effects, but the table below should be read as an empirical error summary rather than a full causal diagnosis. The figures are the held-out-station errors grouped by the zone each station falls in — a regional breakdown of interpolation error, not a measurement of the zone-wide composite.
The station count is given for every row because the zones differ by three orders of magnitude in sample size. Zone 3A rests on a single station (International Falls, Minnesota — the zone covers just five ZIP codes nationally), so its figures are one observation per percentile, not an average over a distribution. They are reported for completeness and should not be read as comparable to a zone summarising several hundred stations. Mean absolute error and mean signed error by zone:
| Zone | Stations | Mean absolute error (days) | Mean signed error (days) |
|---|---|---|---|
| 3A | 1 | 4.0 | −4.0 |
| 3B | 72 | 5.2 | −1.6 |
| 4A | 256 | 4.6 | −0.6 |
| 4B | 395 | 5.2 | −0.5 |
| 5A | 614 | 5.0 | −0.4 |
| 5B | 586 | 5.2 | −0.4 |
| 6A | 782 | 5.2 | −0.5 |
| 6B | 772 | 6.5 | −0.5 |
| 7A | 771 | 7.2 | −0.2 |
| 7B | 529 | 6.8 | −0.4 |
| 8A | 564 | 7.5 | −0.8 |
| 8B | 574 | 9.1 | −1.2 |
| 9A | 386 | 11.5 | −1.9 |
| 9B | 289 | 13.3 | +1.1 |
| 10A | 136 | 10.7 | +2.4 |
| 10B | 18 | 7.1 | +3.1 |
Computed from the published residuals file, generated August 17, 2026.
2,157 of the 20,235 comparisons — 10.7%, or roughly one in nine — missed by more than two weeks; these outliers cluster overwhelmingly in the warm zones and in the high-elevation and coastal microclimates described in Section 7. We report them rather than trim them — a station in a frost pocket or on a mountainside is genuinely hard to predict from its neighbors, and the larger error there is real information, not noise to be hidden.
The signed-error column is the direct check on whether the method runs systematically early or late in any one zone, and it shows a real regional pattern rather than uniform noise. Zones 4A through 8A — which hold about three quarters of all stations tested — sit within a day of zero and lean slightly early. From 8B the early lean deepens (8B −1.2, 9A −1.9), then the sign flips: 9B +1.1, 10A +2.4 and 10B +3.1 all run late. The two smallest samples sit at the extremes — 3A at −4.0 days on one station and 10B at +3.1 on eighteen.
⚠ This means the pooled −0.48 figure should not be read as evidence that per-zone bias is uniformly small. An earlier version of this page made exactly that claim, and the wider zone coverage disproves it: the pooled number is dominated by the densely sampled temperate middle, and the warm-zone positives partially offset the temperate negatives. What the data supports is narrower and worth stating plainly — bias is small and consistently slightly early where most stations are, turns late in the warmest zones, and is largest in absolute terms exactly where the sample is thinnest. A reader planting in 10A or 10B should treat the estimate as running a few days late rather than assume the pooled figure applies to them. The magnitudes otherwise track the same warm-zone difficulty already visible in the absolute-error column.
What this does and doesn't establish
This tests the station-to-location interpolation — how
well the inverse-distance step (Step 1 above) reconstructs a point from
its neighbors. It does not separately validate the zone-wide
composite average (Step 3), an individual ZIP centroid, or a specific
backyard, all of which carry their own additional uncertainty. Nor
does it independently validate NOAA's underlying station normals: NCEI
is the sole published source for those, and NCEI's own records already
use neighboring stations to fill gaps, so the figures describe how
faithfully SoilStack reproduces NOAA's numbers at a withheld point, not
an independent check of NOAA. The cross-validation is reproducible
from the published data via the frost:cross-validate and
frost:analyze-cross-validation commands, and the full
per-station residuals — observed and predicted dates, signed and
absolute error, contributing-neighbor count, and nearest-neighbor
distance for every station tested — are published as a
downloadable CSV:
frost-cv-residuals.csv.
07Limitations
What this dataset does well, what it doesn't, and where it should be cross-checked with local knowledge:
It's a 30-year baseline, not a single-year forecast
The dates on this page describe the distribution of last-frost dates across 30 years (1991–2020). They are not a prediction of when last frost will occur in any one calendar year. For a specific year's forecast you need a short-range weather prediction; the V2 blending described in Section 5 is the intended next layer.
Microclimate variation is not captured at the zone level
If your garden sits at the bottom of a frost pocket, against a south-facing brick wall, or 800 feet up a hillside above your town, your actual last-frost date can be one to three weeks off the zone-wide composite. The dataset is calibrated to weather stations sited per WMO observation standards, which is roughly "open, level, away from heat sources" — not the typical backyard. The composite is a good starting estimate; your own yard's record over multiple seasons is the ultimate authority for your site.
Station density varies by region
Eastern U.S. zones have dense station coverage. Bush Alaska, high-elevation western U.S., and parts of the desert Southwest have substantially sparser coverage. The "Contributing ZIPs" column in the reference table above tells you how much ZIP-level coverage each zone composite has; a lower number means the zone composite is based on fewer mapped ZIPs and should be interpreted with more caution.
Data revision cadence is 10 years
NCEI updates the Climate Normals once per decade. The current product is the 1991–2020 release; the next refresh covering 2001–2030 will arrive around 2031. In a warming climate, an official 1991–2020 baseline may lag current conditions in some locations — a consequence of using decadal 30-year climate normals, not a site-specific current-year forecast.
No NOAA endorsement
NOAA publishes the source data and does not endorse SoilStack's presentation of it. The dataset is in the public domain under NOAA's Open Data Dissemination license; SoilStack's aggregation and presentation are our own work.
08Data freshness
Several timestamps relate to a SoilStack frost page; here's what each one means.
- The underlying NCEI dataset covers 1991–2020 and was published in 2021. It is refreshed by NOAA once per decade.
- Our ingestion timestamp — when we pulled the dataset into our database — is May 2026 for this V1 release.
- The per-zone "Composite generated" line on each zone page reflects when we last recomputed the zone composite from the ingested station data. That changes only when the aggregation logic itself changes or when station data is re-ingested.
- This methodology page's "Updated" timestamp — the stamp at the top — reflects when the methodology document last changed. That's separate from the data refresh cycle. See Section 11 for the methodology version history.
Because the underlying NCEI dataset only refreshes once per decade, the climatological baseline on SoilStack frost pages does not regenerate daily; it is stable climatology, not a daily forecast. The V2 live-forecast layer (Sections 2 and 5) moves on a much faster cadence, refreshing from the NWS forecast, so a zone page carries two timescales at once: a decade-stable climate baseline and a near-term forecast that updates within its short forecast window.
09Citation chain
The NCEI 1991–2020 Normals product is published as a dataset
(identifier gov.noaa.ncdc:C01619; dataset citation:
Palecki, Durre, Applequist, Arguez, & Lawrimore, 2021), with its
production methods described in NOAA's Normals Calculation Methodology
(2020) and the peer-reviewed literature behind the established normals
algorithms. We list the load-bearing references below.
Primary source and methodology documentation
-
Palecki, M., Durre, I., Applequist, S., Arguez, A., & Lawrimore, J. (2021).
U.S. Climate Normals 2020: U.S. Annual/Seasonal Climate Normals (1991–2020).
Dataset, NOAA National Centers for Environmental Information
(identifier
gov.noaa.ncdc:C01619). ncei.noaa.gov/products/land-based-station/us-climate-normals - NOAA National Centers for Environmental Information (2020). Normals Calculation Methodology 2020. Documents the production methods for the 1991–2020 Normals, including the bootstrapped frost-freeze probability procedure.
Supporting normals methodology
- Applequist, S., Arguez, A., Durre, I., Squires, M., Vose, R., & Yin, X. (2012). 1981–2010 U.S. hourly climate normals. Bulletin of the American Meteorological Society, 93(11), 1637–1640.
- Arguez, A., Durre, I., Applequist, S., Vose, R. S., Squires, M. F., Yin, X., Heim, R. R., & Owen, T. W. (2012). NOAA's 1981–2010 U.S. climate normals: An overview. Bulletin of the American Meteorological Society, 93(11), 1687–1697.
- Durre, I., Squires, M. F., Vose, R. S., Yin, X., Arguez, A., & Applequist, S. (2013). NOAA's 1981–2010 U.S. climate normals: Monthly precipitation, snowfall, and snow depth. Journal of Applied Meteorology and Climatology, 52(11), 2377–2395.
- World Meteorological Organization (2017). WMO Guidelines on the Calculation of Climate Normals (No. 1203).
Climate-trend context
- McCabe, G. J., Betancourt, J. L., & Feng, S. (2015). Variability in the start, end, and length of frost-free periods across the conterminous United States during the past century. International Journal of Climatology, 35(15), 4673–4680.
- Kukal, M. S., & Irmak, S. (2018). U.S. agro-climate in 20th century: Growing degree days, first and last frost, growing season length, and impacts on crop yields. Scientific Reports, 8(1), 6977.
10For developers and researchers
Every per-zone frost page emits a schema.org/Dataset JSON-LD entity with the full citation chain machine-readable. The entity ID pattern is:
https://soilstack.net/zone/{zone}#frost-dataset
where {zone} is one of 3a through 10b.
Each Dataset declares isBasedOn → the NCEI source
dataset, citation → the NOAA/NCEI dataset and
calculation-methodology documentation, license → the NOAA Open Data
Dissemination URL, and isPartOf → this methodology
page (https://soilstack.net/frost/methodology#article),
along with three PropertyValue entries for the
P10/P50/P90 dates with the NCEI element keys documented.
This page emits a corresponding
schema.org/TechArticle
entity that lists the Dataset entities via mentions.
An AI engine or knowledge-graph crawler traversing either node
lands in a complete, self-consistent subnet for SoilStack's
NOAA-cited frost data.
The cross-validation residuals behind Section 6.5 are published as a
flat CSV at
/data/frost-cv-residuals.csv
— one row per station and percentile, with observed and predicted
dates, signed and absolute error in days, the contributing-neighbor
count, and the nearest-neighbor distance. It regenerates from the same
frost:cross-validate run that produces the Section 6.5
figures.
Citing SoilStack
If you cite a SoilStack zone-page frost prediction in writing, please attribute the underlying data to NOAA NCEI and link this methodology page so readers can verify the chain. A workable short form:
"Last-spring-frost composite per
SoilStack's frost methodology
(derived from NOAA NCEI 1991–2020 Climate Normals, dataset
gov.noaa.ncdc:C01619; dataset citation Palecki et al.
2021; methods documented in NOAA NCEI Normals Calculation
Methodology 2020)."
Or you can cite NCEI directly for the underlying data and skip us — NOAA's dataset and methodology documentation handle the rigor on their own.
11Version history
This page is versioned. When the methodology itself materially changes, the version number bumps and a row is added below. Wording-only edits don't bump the version.
- v2.2 —
- Figure sourcing. All Section 6 accuracy figures now derive from the published residuals file rather than from transcribed literals: the 16-row per-zone table, the median and mean absolute error, RMSE, the signed bias, and the comparison count. The figures themselves are unchanged — the mean signed error remains −0.48 days, about half a day early. A provenance line beneath the table names the source file and its generation date. The station-proximity and crosswalk figures in Section 3 are computed the same way.
- v2.1 —
- Lower-48 coverage completed. Frost composites extended from 10 zones (5a–9b) to 16 (3a–10b), adding 3a, 3b, 4a, 4b, 10a and 10b. SoilStack now covers all 18 lower-48 zones, 3a–11b; zones 11a and 11b are frost-free by definition and carry no composite, which Section 6 documents. The cross-validation in Section 6.5 was re-scoped to match, with no change to the aggregation method and no re-run of the underlying leave-one-out pass — the June run already evaluated every eligible station nationally, so this is a wider read of the same measurement. Median absolute error holds at 5 days; mean absolute error improves from 7.18 to 7.01 days because the newly added cold zones interpolate unusually well (4A is the most accurate multi-station zone in the country at 4.6 days). Section 6.5 also gains a per-zone station count, a correction to the claim that accuracy degrades monotonically southward — it peaks at 9B and partially recovers in 10A and 10B — and a correction to the claim that per-zone signed error is uniformly small, which the wider coverage disproves. 178 stations that crosswalk to campus and institutional ZIP codes carrying no USDA zone assignment are now documented rather than silently absent.
- v2.0 —
- Live forecast blending added. The engine now blends the NOAA climatological baseline with the National Weather Service public forecast (Sections 2 and 5). An optional live freeze outlook sits on the P50 climate normal until the frost date is within about a week, then incorporates the live NWS forecast as a lower bound on the final-freeze date; beyond that horizon it holds at the normal. By design the estimate never moves earlier on early-season warmth alone, only on a forecast freeze that raises the lower bound, since a short-range forecast cannot establish that any freeze is the season's last. This guards against false-spring planting mistakes. The same blending extends to the autumn first-frost estimate in the opposite direction. The V1 climatological method and its cross-validation are unchanged; V2 adds a live layer on top of them.
- v1.1 —
- Empirical validation added. Section 6.5 reports leave-one-out cross-validation accuracy (median 5-day, mean ~7-day absolute error across zones 5A–9B) measured by holding out each NCEI station and predicting its last-frost dates from its neighbors, with the full per-station residuals (17,601 observations) published as a downloadable CSV for external auditing. The aggregation method itself is unchanged — this is a measurement of the existing method, not a modification of it.
- v1.0 —
- Initial methodology release. Documents the Frost Prediction Engine V1 build: NOAA NCEI 1991–2020 Climate Normals as the sole data source, station-to-ZIP crosswalk via inverse-distance-squared Haversine weighting, per-ZIP composites via weighted circular mean, per-zone composites via equal-weight average. Documents the NCEI percentile convention bridge (Section 5).
The autumn first-frost extension shipped alongside V2 and uses the same methodology applied to the autumn variables in the same NCEI dataset.