The Weather Football Index
The Weather Football Index (WFI) is a single 0–100 score expressing how strongly the weather is expected to affect a football game — where 0 is a climate-controlled dome and 100 is a blizzard or gale that fundamentally changes how the game can be played. It is built to be transparent, reproducible, and calibrated against decades of outcomes, not a black box.
The components
WFI is the sum of four weather components, then scaled down for roof type. Each component is bounded so no single factor can silently dominate.
Wind
up to 45 ptsThe single biggest on-field factor — it degrades the deep passing and kicking game. Sustained speed plus a gust premium. We also resolve the wind against each stadium's surveyed orientation and report the along-field and cross-field components — but they do not enter the score, and the reason is below.
Precipitation
up to 30 ptsWhat fell is observed, not guessed: present weather from the ASOS station nearest each stadium. Rain saturates — once the ball and field are wet, more rain adds little — while snow keeps accumulating, so rain enters as a square root of its rate and snow linearly. A point of snow costs about twice a point of rain, though the record does not pin that down tightly.
Cold
up to 25 ptsSub-freezing air stiffens the ball and hands and lowers kick distance. Driven by wind-chill, not just air temperature.
Heat
up to 8 ptsExtreme heat and humidity drive fatigue and cramping, especially early season. Driven by heat index. Cut from 20 points in v1.2 — it is the one component the record does not support; see below.
The formula
raw = wind_pts + precip_pts + cold_pts + heat_pts
wind_pts = clamp((sustained_mph − 5) × 2.2 + gust_premium, 0, 45)
// gust_premium = clamp((gust_mph − sustained_mph − 8) × 0.8, 0, 8)
precip_pts = clamp( 57.0 × √(rain_in_hr)
+ 19.7 × snow_in_hr, 0, 30) // √ for rain, linear for snow — measured, see below
cold_pts = clamp((32 − wind_chill_F) × 0.9, 0, 25)
heat_pts = clamp((heat_index_F − 88) × 0.52, 0, 8)
// Where a station watched the game, snow_in_hr is the observed depth rate.
// Otherwise frozen precip arrives as water equivalent (NBM apcp, ERA5 tp)
// and is converted to depth — Kuchera, on surface temperature as the proxy:
snow_in_hr = snow_water_equiv_in_hr × clamp(12 + 1.111 × (28.4 − temp_F), 5, 20)
// and whether it IS frozen is decided on the wet bulb, not the dry bulb:
// snow cools itself toward the wet bulb as it falls, so it reaches the ground
// at air temperatures into the 40s in dry air. Centred at 33°F, which is where
// 185,000 observed hours of snow and rain put it.
frozen_fraction = ramp(wet_bulb_F, all frozen ≤ 31.5, all liquid ≥ 34.5)
// roof scaling: controlled environments crush the score
roof_factor = { open/outdoors: 1.0, retractable-open: 1.0,
retractable: 0.55, retractable-closed: 0.15,
closed: 0.15, dome: 0.05 }
// `retractable` is the unknown-state default — open often enough
// to matter, sealed often enough not to score it as open air.
WFI = round( clamp(raw × roof_factor, 0, 100) )
Data sources
- Games, stadiums, roof type & historical conditions — nflverse (Pro-Football-Reference) for the NFL back to 1999, and cfbfastR-data (keyless nightly parquet) for FBS college.
- Live forecasts — hourly conditions at exact stadium coordinates from our own weather.city hub, built on the National Blend of Models (NBM) with wind, gust, precipitation, temperature and humidity, out to eleven days.
- Forecast snowfall — the National Digital Forecast Database, the grids the local forecast offices actually sign off on. NDFD publishes a snowfall depth — the same quantity the observed archive supplies and the same one the engine scores — so inside its reach the forecast reads what a forecaster said would fall rather than inferring it. It runs about 60 hours, which in practice means it lights up on Friday for a Sunday game.
- Observed present weather — hourly METAR from the Iowa Environmental Mesonet ASOS archive, at the nearest qualifying station to each stadium (median 6 miles, none beyond 18), back to 1999. This is what decides whether a game was snow, rain, freezing rain or ice — and how hard — rather than a temperature threshold on a modelled field.
- Historical reanalysis — Copernicus ERA5-Land (ARCO analysis-ready store) for temperature, precipitation and humidity, blended with ERA5 single-level wind gust, and with observed Pro-Football-Reference wind where recorded. All keyless and openly licensed.
Update frequency. Live game forecasts refresh hourly from the latest NBM cycle. The historical archive and validation tables are rebuilt after each completed week during the season. This page's spec is versioned; weight or source changes are logged below.
Does it actually work?
The component weights were chosen from the physics and then checked against the historical record — which makes this calibration, not independent validation. Weather inputs contain no scores, so the predictors are independent of the outcome; the test is not, because the same games were available to us while the weights were being set. We state the distinction plainly because it changes how much the curve below is worth: it shows the index is consistent with the record, not that it was proven against data it had never seen.
Across every outdoor NFL game since 1999, scoring does fall as the index rises:
| Band | Games | Pts/game | 95% interval | |
|---|---|---|---|---|
| negligible | 4,067 | 44.2 | 43.7 – 44.6 | |
| minor | 1,113 | 41.5 | 40.7 – 42.3 | |
| notable | 254 | 40.3 | 38.5 – 42.0 | |
| high THIN | 22 | 31.3 | 23.7 – 38.9 | |
| extreme THIN | 5 | 30.4 | 22.4 – 38.4 |
7,276 games scored: 3,595 on full inputs from the reanalysis — observed temperature and wind, ERA5-Land gust and humidity, and precipitation from the station where one watched (OBS); 3,381 on full inputs taken entirely from the station nearest the stadium (STA); 300 on temperature and wind alone (LEG), which is all that can be had for them. They are different measurements and are labelled per game on the Seasons board.
Read the intervals before the averages. Genuinely severe weather is rare — the high band is 19 games in 27 seasons, and its 95% interval overlaps the notable band, so the two are not statistically distinguishable. Above it sits an extreme band of three games, which is not a measurement of anything and should be read as a label rather than an average. The direction is not stable in every recut either: cut to 2023–2025 alone, notable sits above minor, on twenty games. That is consistent with noise at that sample size, but it is not evidence for the index, and we would rather show it than pick the cuts that flatter us. Both halves of the record (1999–2012, 2013–2022) and both scoring states do decline monotonically from negligible through high.
Nothing here is out-of-sample. Every season through 2025 existed when the index was designed, so no split of it — however it is labelled — is a true holdout. The first genuinely prospective test is the 2026 season, and it is being recorded now: from eight days before each kickoff we archive the forecast at fixed leads and never revise it, so next year this section can report skill against games the index had never seen. The full table and the worst-weather games are on the Index board; the warm-vs-cold acclimation cut is on Stadium Weather Impact.
Limitations & honest caveats
The WFI is a decision aid, not a crystal ball. Where it is weak, we say so:
- Where a game has no station, it is because none exists. Every stadium in the record now has a nearest qualifying station, including three that had none at all: the Raiders in Oakland, the Chargers in San Diego and the Rams in St Louis, whose franchises moved and took their abbreviations with them, leaving 456 games with no coordinates. Each venue also carries ranked alternates, because a station can pass a two-season coverage check and still have a multi-day outage across the exact afternoon a game was played — 70 games are scored from a second or third choice for that reason. What is left on temperature and wind alone is 300 games: the whole of 1999, for which nflverse records no kickoff time for a single game, and 41 played abroad, where the home team's station is on the wrong continent.
- Snow is observed now, and it changed the answer. Precipitation type used to be inferred with one line — frozen if the air was at or below 34 °F — on a reanalysis field averaged over a 25 km grid box. That is wrong in both directions, and a box that size cannot resolve a lake-effect band at all: for the 2017 Bills–Colts whiteout it gives 0.14 in/hr while the airport four miles away was reporting half-mile visibility in moderate snow. We now read the station: what fell, how hard, and how far you could see. Across the archive 400 games changed score, and the games that moved most are the ones people remember. One limit remains: the station is a few miles from the stadium and cannot see a band that sets up over one and not the other. The 1999–2005 gap is closed — those seasons are now scored from the station directly, which is what took the temperature-and-wind-only count from 3,681 games to 790.
- A reanalysis was held against the observations, and it lost on the thing that matters. ERA5 partitions rain and snow by model physics through the whole depth of the atmosphere, so it is a genuinely independent witness — and its verdict is instructive. Over 6,142 game windows at all thirty venues it agreed that snow fell in 113 of the 153 games the station reported, missed 40, and claimed 52 the station did not see: Heidke 0.703 on occurrence, which is respectable. But among the games both call snow, the two only loosely rank the same games as the heavy ones — rank correlation 0.37 — and the reanalysis reads just 46% of the observed rate. Averaged over a 25 km box it dilutes precisely the narrow bands football remembers. Had the index taken snowfall from the reanalysis, it would have been poorly equipped to tell a whiteout from a flurry.
- The wet-bulb rule holds up against something that has never seen a METAR. For the games no station watched, the phase rule is all there is, so it needs a check that does not come from the ASOS hours it was tuned on. Against ERA5's own frozen fraction, over the 881 games with meaningful reanalysis precipitation, the rule agrees 98.0% of the time — Heidke 0.884, with fifteen games where we said frozen and ERA5 said liquid and three the other way. A third line agrees: ERA5's snowpack, in water equivalent, deepened during the game on 95.9% of the games consistently with what the station reported falling (Heidke 0.771). Three methods sharing no inputs and no thresholds landing in the same place is the strongest evidence on this page that the phase call is sound.
- Getting ERA5's snowfall at all took three attempts, and the third is worth naming. Neither Copernicus ARCO time-series product carries it — ERA5-Land accepts 19 variables and ERA5 single-levels 23, and snowfall is in neither; it lives in the gridded products, which are chunked one whole global map per hour, a million grid points read to use one. Earthmover publish ERA5 as an open Icechunk store with a second copy of every field rechunked for time series, and a 27-year hourly point series reads in about a second. The snowpack that comes with it is also context in its own right: 960 of those 6,142 games were played with snow on the ground, 825 of them with nothing falling at kickoff. That describes the setting, not the surface — a model land tile is not a tarped, heated, plowed football field.
- Snow intensity comes from the observer, not the gauge — deliberately. A heated tipping bucket undercatches snow in wind, which is exactly the condition football cares about. Measured over 152 observed snow games, the gauge reads 33% of what the present-weather code implies overall: 54% in light wind, and 15% once the wind reaches 10 knots. So snowfall rate is taken from the reported intensity band, which is defined by visibility and is what the eye actually grades.
- The weights are set by what each component does to football. We regress nine football outcomes at once — points, pass rate, completion %, yards and air yards per attempt, passing EPA, yards per carry, turnovers and field-goal % — on all five components together, rain and snow entering separately, over the 6,685 games where every input was measured. Counting outcomes moved at 2 sigma or better: wind 7 of 9, rain 6, cold 5, snow 5, heat 0. Expressed as cap per outcome moved that is 6.4 for wind, 5.0 rain, 5.0 cold and 6.0 snow — four components inside a range of 5 to 6.4, which is as close to internally consistent as this kind of index gets. Heat is the exception and stays on watch: on a smaller sample it moved two outcomes, and on this one both drifted just under the bar, to 1.8 and 1.9 sigma. That is noise either side of a threshold rather than a new finding, so its cap stays at 8 — already the lowest — rather than moving again because the sample grew. Heat was the one that was wrong: it sat at 20.0, three times the others, on one field-goal result 3.2 sigma out of 36 tests that points the wrong way physically. Its cap is now 8, and not zero because this data cannot see the physiological load that is heat's real claim on the game.
- Rain saturates; snow accumulates — and the engine now says so. The precipitation term was linear in rate for both, which is a modelling convenience rather than a finding. Fitting completion percentage, pass rate, yards per attempt and passing EPA on rate against square-root-of-rate, over 6,213 games, rain fits better as a square root on all four (completion 7.6 sigma against 5.3, yards per attempt 5.9 against 3.6) and snow fits better linear on all four (pass rate 5.2 against 4.5). The football reading is that rain is mostly a switch — once the ball and the field are wet, more rain adds little — whereas snow keeps covering the lines, the ball and the footing.
- Snow is worth more than rain. How much more, we cannot yet say. On the current scale a point of snow costs about twice what a point of rain costs, and 96% of bootstrap resamples agree it costs more than one. But the 95% interval on that multiple runs from 0.93 to 3.45, and the two halves of the archive disagree inside it — 1.7 on the reanalysis-graded games, 3.3 on the station-graded ones, a gap driven mostly by rain measuring weaker before 2006 rather than by snow measuring stronger. The engine's calibration sits inside that interval, so there is nothing here to act on. An earlier version of this page put the figure at 2.2× on half the sample and stated it more firmly than half a sample deserved; 134 snow games is not enough to pin a coefficient down, and saying so is the honest position until more seasons arrive. Together with the observations, this took the index's correlation with scoring from −0.114 to −0.133 — 95% bootstrap interval [−0.028, −0.011], and an improvement in 2,000 of 2,000 resamples — across the 3,595 games the change can touch.
- The level of the precipitation term is a choice, and we say which one. The regressions fix the shape and the rain-to-snow ratio; they cannot fix what 30 points means. We set it so the worst precipitation game in the archive still reaches the cap. Choosing it to maximise correlation with scoring instead would put it roughly twice as high — because most of what that correlation sees is simply wet against dry — and would flatten every rainy game onto the cap, throwing away all resolution within precipitation.
- Cold survives because points alone was the wrong test. Judged on the scoreboard, cold looks like nothing — 0.04 sigma. Judged on how the game is played it is unmistakable: it cuts completion percentage (3.4 sigma) and passing EPA (2.2), pushes teams off the pass (2.7) and raises yards per carry (3.0). Offenses adapt to the cold, so the score barely moves while the football changes completely. Weighting the index on total points — the obvious thing to do, and what this page validated against for its whole life — would have gutted a component that is plainly real.
- Visibility is measured, not scored — and the reason is instructive. Being unable to see is a plausible mechanism of its own, so we tested it as a sixth term. Against the old linear precipitation it looked real: completion percentage down 2.9 sigma, yards per attempt 2.6. Against the corrected precipitation term it dissolved, and on the full 6,213 games it now moves none of the nine outcomes at 2 sigma. It had been standing in for a misspecified precipitation curve rather than measuring a separate effect — which is the cleanest example on this page of why a plausible mechanism and a real coefficient are different things. It is still computed and archived on every game.
- Crosswind is measured, not scored. A wind straight across the field ought to hurt kicking more than the same wind straight down it, so we tested exactly that: 3,534 outdoor games since 1999, wind direction from the reanalysis 10-metre components, resolved against each stadium's orientation. Wind speed costs 0.36 points a game per mph at 5.8 sigma — solid. Going from a fully aligned wind to a fully crossing one costs a further 1.3 points at just 1.74 sigma, and among the 43 games above 18 mph the gap is 6.6 points at 1.41 sigma. The effect points the way the physics says it should and it is not established, so putting a coefficient on it would be inventing one. The components are computed, shown and archived; if 2026 and beyond firm the signal up, it earns its way in.
- Reanalysis wind is smoothed. Gridded models under-represent gusts and stadium-specific channeling. Our hybrid layer restores observed wind where Pro-Football-Reference recorded it; where it didn't, windy games can be under-scored. This is a floor on the index, not a ceiling. Gust is ERA5's 10-metre maximum across the whole archive, 1999 onward, rather than the station's — a METAR reports a gust only when it clears a threshold, so an absent one is silence, not calm, and reading it as calm had been under-scoring windy games in the seasons the reanalysis gust cache did not reach.
- The forecast measures snow the same way the history does — inside two and a half days. This site spent a lot of effort making its history read observed snowfall rather than infer it, and that would be worth little if its forecasts still guessed. NDFD publishes snowfall as a depth (GRIB discipline 0, category 1, parameter 29, in metres), which is exactly the input the engine takes, so within NDFD's reach the live score and the historical score are the same measurement and the edge lookup compares like with like. Beyond it, the NBM's single liquid-equivalent number is split by the wet-bulb rule — which is no longer a guess either: it agrees with ERA5's own physically derived partition on 98% of games. Every dashboard row records which of the two fed it.
- The archive says the units are metres; the archive also says they are unknown. The zarr store reports
units=unknownfor every NDFD precipitation field, so the units were read from the raw GRIB on the NWS feed instead. Since nothing downstream would notice if that ever changed — and a silent factor of thirty-nine in a snow rate would score every snow game as a blizzard, invisibly, until December — the extract re-checks itself on every run: a snowfall rate above 8 in/hr is not physical and the block is dropped, and where snow and liquid are both forecast the implied snow-to-liquid ratio is reported and flagged if it leaves the range such a ratio can occupy. - Forecast uncertainty grows with lead time. A Sunday score posted on Wednesday can shift by kickoff. Every live game forecast carries a reliability flag (below); trust the number more inside 24 hours.
- Small samples at the extremes. Blizzard- and gale-tier games number in the dozens across 25 seasons. Individual-game inferences at WFI 70+ are illustrative, not statistically settled.
- Weather is one input among many. Injuries, scheme, and matchup dwarf weather in most games. The index isolates the weather signal; it does not claim to predict outcomes on its own.
Forecast reliability
Live game scores carry a reliability tier based on lead time and cross-model agreement, so you know how much weight the number can bear:
- ● High — inside 24 h, models agree. The WFI is unlikely to move more than a band.
- ● Moderate — 1–3 days out, or some model spread. Direction is reliable; the exact number may drift.
- ● Low — 3+ days out, or forecasts diverge. Treat as a heads-up, not a hard read; re-check near kickoff.
Edge cases
- Domes & retractable roofs. Fixed domes are scaled to 5% of raw impact and retractable-closed to 15% — never exactly zero, because HVAC, open end-zones and door drafts leave a residue. A retractable-open game is scored as fully outdoor; roof state at kickoff, when known, overrides the default.
- Cold-weather CFP & neutral sites. College playoff and bowl games at domes or warm neutral sites correctly score near zero regardless of the home cities' climates — the game is played where it's played, not where the team is from.
- Blizzards & hurricanes. The scale saturates at 100 by design; a true whiteout and a merely brutal cold-wind game can both pin the meter. When a named storm or a warning-level event coincides with a game, we annotate it explicitly rather than letting a capped number imply the two are equivalent.
- Missing or conflicting observations. Games with no recorded wind and no reliable reanalysis are marked low-confidence rather than silently scored zero.
This spec is versioned. Material changes to weights or sources will be logged here. Current: WFI v0.1 — 2026-07-21.