GardenTrack frost-station extract NOAA NCEI U.S. Climate Normals 1991-2020, freeze/frost probabilities ===================================================================== File: frost-station-normals-1991-2020.csv Rows: 7,305 stations (one per row) + 1 header row Columns: 117 Size: 4,486,887 bytes (about 1 MB compressed in transit) SHA-256: 8990adb0ade7ac651592ea4f5b6f4e6cc8c96ea1cfb4d18e9e09d84c6c31f873 Version: v1, released 2026-07-16 (data baked 2026-07-13) Home: https://gardentrack.app/data/frost-station-normals/ Method: https://gardentrack.app/how-we-research/frost-dates/ WHAT THIS IS ------------ Every station in NOAA NCEI's U.S. Climate Normals 1991-2020 that carries freeze/frost probability normals, extracted from the by-station archive into one flat CSV: last spring freeze, first fall freeze, and growing-season length at 36, 32, and 28 deg F, at nine probability levels (10% through 90%), plus NOAA's data-quality flags and our per-station status classification. The archive holds 15,616 station files; 8,311 carry no freeze/frost columns (precipitation-only stations and similar). The remaining 7,305 are all here. SOURCE + PROVENANCE ------------------- Product: NOAA NCEI U.S. Climate Normals 1991-2020, Annual/Seasonal Normals, v1.0.1 (c20230404), by-station multivariate CSVs. Archive (pinned): https://noaa-normals-pds.s3.amazonaws.com/normals-annualseasonal/1991-2020/archive/us-climate-normals_1991-2020_v1.0.1_annualseasonal_multivariate_by-station_c20230404.tar.gz Decoding documentation (same bucket, normals-annualseasonal/1991-2020/doc/): Readme_By-Variable_By-Station_Normals_Files.txt Normals_ANN_Documentation_1991-2020.pdf Extraction: GardenTrack's stage-0 bake script, run 2026-07-13. Decoding was verified against the NCEI REST Access Data Service for station USW00024127 (Salt Lake City) before release. COLUMN DICTIONARY ----------------- station GHCN station ID, 11 characters. The first two characters are the FIPS country code: US = 50 states + DC (7,247 stations); RQ / VQ = Puerto Rico / US Virgin Islands; GQ / AQ / CQ = Guam / American Samoa / Northern Marianas; FM / RM / PS / WQ / JQ = Pacific affiliates; plus one CA (Egbert, Ontario - a Canadian station NCEI ships in the product). 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% subset of dates: has_dates_full18 all 18 headline dates present (2 events x 3 thresholds x 3 percentiles) - 6,567 stations has_dates_partial some but not all - 550 stations censored_warm too warm to compute; the freeze is too rare - 137 stations censored_cold year-round frost risk (NOAA V flag) - 51 stations Then nine groups of 12 columns - {lst, fst, gsl} x {28, 32, 36}: lstNN_fp10..fp90 Last SPRING freeze at <= NN deg F, as "MM/DD". DIRECTION IS INVERTED - see decode note 1. fstNN_fp10..fp90 First FALL freeze at <= NN deg F, as "MM/DD". Intuitive direction: fpYY = the date by which the first freeze has occurred in YY% of years. fp10 early, fp90 late. gslNN_fp10..fp90 Growing-season length in days at NN deg F: the length with a YY% probability of a season at least that long. fp10 = long/optimistic, fp50 = median, fp90 = short. *_meas_flags NOAA measurement flags seen anywhere in that group's nine values: Y = insufficient values to compute (includes warm stations where the freeze rarely or never happens); V = year-round frost risk ("too cold to compute" a freeze-free season). *_comp NOAA completeness code for the group's median (fp50) value: S standard / R representative / P provisional / E estimated. Exact definitions are in the NCEI readme above; prefer S, and check *_years for the actual count. *_years Years of record behind the group's median value (2 to 30 in this file). occ28_pct Percent of years the threshold occurs at all (any day occ32_pct at or below 28 / 32 / 36 deg F). Key West at 32 deg F occ36_pct = 0.0. DECODE NOTES - THE GOTCHAS -------------------------- These are the things we had to figure out (and verify against NOAA's own REST service) before we trusted our own decoding. Read them before using the dates. 1. SPRING IS INVERTED. For last-spring-freeze (lst) columns, NOAA's percentile direction is the reverse of fall: lstNN_fp10 is the LATEST date (a freeze after it happens in only 10% of years - the conservative "plant-safe" date) and lstNN_fp90 is the EARLIEST (90% of years still see a freeze after it). Equivalently: lstNN_fpYY = the date past which a spring freeze still occurs in YY% of years. Verified for USW00024127 (Salt Lake City), 32 deg F: fp10 = 04/30, fp50 = 04/08, fp90 = 03/17. Fall runs the intuitive way at the same station: fst32 fp10 = 10/17, fp50 = 10/31, fp90 = 11/13. Practical reading: the familiar "average last frost" is lst32_fp50; the conservative planting date (10% chance of a later freeze) is lst32_fp10. 2. EMPTY MEANS CENSORED, NEVER ZERO. NOAA publishes -9999 plus a measurement flag where a value can't be computed. In this CSV those are empty cells, with the flag letter preserved in the group's *_meas_flags column. Never parse an empty cell as a date, and never trust a date-like value without checking the flags. 3. GROWING-SEASON LENGTH RUNS "INVERTED" TOO. gslNN_fpYY is the season length with a YY% chance of at least that length - so fp10 is the LONG season you get 1 year in 10, fp90 the short season you can bank on 9 years in 10. Also: censored-warm stations report gsl = 365.0 with empty date columns and occ = 0.0 - the threshold basically never happens there and the "season" never ends (e.g. Pago Pago, Key West at 32 deg F). 4. DATES ARE MM/DD WITH NO YEAR, AND SEASONS CAN WRAP. In warm climates the last "spring" freeze can fall in Nov-Dec (it belongs to the previous winter - real at coastal California stations) and the first "fall" freeze can land in Jan-Jun of the following year. If you convert MM/DD to day-of-year and compute your own season arithmetic, handle the wrap or you will produce spring-after-fall nonsense. 5. runtime_status IS OURS, NOT NOAA'S. It is a convenience classification we computed during extraction (see the dictionary above). Everything else in the file keeps NOAA's raw semantics. COVERAGE, HONESTLY ------------------ - US only (plus territories and one Canadian border station). No international coverage. - Stations are sparse exactly where frost behavior changes fastest. In our own validation work: northern Utah has about 1.35 stations per 1,000 km2 (median distance to the nearest station 9.6 km); central Nevada has about 0.41 (median distance 24 km). Mountain and rural-West gardens are often 20+ km from the nearest station, at a different elevation. - 1991-2020 normals describe that 30-year window, not this year's weather, and not a forecast. - 738 of 7,305 stations are partial or censored (see runtime_status). That is NOAA being honest, and we kept it: a censored station is not a missing station. LICENSE + CITATION ------------------ The underlying data is a work of the United States Government (NOAA NCEI), in the public domain. We claim no copyright over NOAA's data or facts, and NOAA/NCEI does not endorse this extract. Our compilation - the extraction, decoding, flag consolidation, and station classification in this file and this README - is offered under CC BY 4.0 (https://creativecommons.org/licenses/by/4.0/). Requested citation: GardenTrack frost-station extract, gardentrack.app/data/frost-station-normals/, derived from NOAA NCEI U.S. Climate Normals 1991-2020. CHANGELOG --------- v1 (2026-07-16) Initial release. 7,305 stations from the c20230404 archive; decoding verified against the NCEI REST service; spring inversion, censoring semantics, and season wrap documented above.