92 Years of Kansas City Weather
One airport station, 31,036 days of highs and lows, and five habits that keep a long trend line honest.
Ninety-two years of daily highs and lows at one Kansas City airport. One question: is the gap between day and night closing?
Compare the 2020s with the 1930s and the gap narrowed 3.3%. Compare them with the 1940s and it widened 5.3%.
Same file. Opposite headlines. The honest answer is neither, and the reasons apply to every KPI you track.
The record
The station is USW00013988, Kansas City Downtown Airport, in NOAA's GHCN-Daily archive1. The measure is the daily swing: the high minus the low. A valid day needs both readings present, unflagged, and the high at or above the low. That rule kept 31,036 days between 1934-01-01 and 2026-09-22, and dropped 109 flagged values2.
1. Count the days you do not have
"Ninety-two years" describes the span, not the coverage. The span holds 33,868 calendar days, and 2,832 of them have no valid reading2.
Two gaps do most of the damage. One runs 2,252 days, from November 1972 to December 1978. The other runs 426 days, from November 1993 to December 1994. The 1970s keep just 46 of their 120 months.
A chart labelled "since 1934" with a six-year hole makes a bigger claim than its data. Print the coverage beside the trend.
2. Say the baseline out loud
| Decade | Years | Valid months | Mean high (°F) | Mean low (°F) | Swing (°F) |
|---|---|---|---|---|---|
| 1930s | 1934–39 | 72 | 67.4 | 46.8 | 20.6 |
| 1940s | 1940–49 | 120 | 65.4 | 46.5 | 18.9 |
| 1950s | 1950–59 | 120 | 65.9 | 46.8 | 19.1 |
| 1960s | 1960–69 | 120 | 65.4 | 46.1 | 19.3 |
| 1970s | 1970–79 | 46 | 65.9 | 46.4 | 19.5 |
| 1980s | 1980–89 | 120 | 66.2 | 47.4 | 18.8 |
| 1990s | 1990–99 | 101 | 65.5 | 47.6 | 17.9 |
| 2000s | 2000–09 | 118 | 66.1 | 47.4 | 18.6 |
| 2010s | 2010–19 | 120 | 67.4 | 48.0 | 19.3 |
| 2020s | 2020–26 | 80 | 68.2 | 48.3 | 19.9 |
The "1930s" here are six years, and they hold the widest decade swing in the table. Every later decade sits between 17.9 °F and 19.9 °F. Against each decade from the 1940s to the 2010s, the 2020s run 2.1% to 10.9% wider3.
A start date is a choice. Show it, and show a second one.
3. Ask for the interval, not the slope
Across 79 complete years, the swing's trend is −0.018 °F a decade. Its 95% interval runs from −0.119 to +0.078, and the p-value is 0.644. Allowing for year-to-year carryover moves p to 0.725.
The interval straddles zero. The record shows no significant trend in the swing.
The rule came before the math. The project wrote it down first: call it "narrowing" only if the whole interval sits below zero6. It does not.
An earlier version of this page ran on generated sample figures and told a narrowing story7. The real station file does not support it.
Wording matters as much as arithmetic. "No significant trend" is accurate. "Held steady" claims more than the data can carry.
4. Chart the parts, not only the gap
The swing shows no significant trend because both ends rose by similar amounts. Highs rose 0.173 °F a decade, with a 95% interval of 0.019 to 0.335. Lows rose 0.202 °F a decade, with an interval of 0.075 to 0.3024.
Allowing for carryover, the lows hold firmly at p 0.004. The highs sit at the edge, at p 0.0565.
Every business has this chart. Unit margin holds flat while price and cost both climb. Report only the margin and you miss two moving stories.
5. Treat every system change as a suspect
A changepoint test on annual lows finds a break between 1979 and 1980, with p 0.00168. Lows after it average 1.21 °F higher. Daily records had resumed only in 1979, after the six-year gap. That difference is most of the 1.49 °F the lows gained between the 1930s and the 2020s.
Remove the long-run trend and the break disappears, with p 1.05.
The station also moved 0.3 miles west on 1997-11-139. Its readings arrived through five reporting sources over the decades. The record is not adjusted for either2.
So is the rise in lows real warming or a station change? One station cannot settle it. The audit's working odds are 45% mainly regional warming and 25% mainly a station artifact6. Another 25% goes to both in similar measure, and 5% to something else.
Your Tableau-to-Power BI cutover is a station move. A KPI that steps in the month you switch platforms is a suspect, not a finding.
What survives
The seasonal shape holds. The smoothed median swing peaks near April 11 at 20.4 °F and near October 4 at 21.1 °F. It bottoms near December 22 at 16.1 °F10.
The largest swing on record came on 1953-01-15, from 64 °F to 7 °F. On the unrounded readings, that swing is 57.1 °F. The second largest is recent: 2024-02-27, from 76 °F to 22 °F11.
What this means for your BI team
- Put coverage on the chart: valid days over calendar days, with the gaps named.
- Make the baseline visible, and offer a second one beside it.
- Write the decision rule before anyone runs the numbers.
- Ship every trend with its interval, and ban "held steady" when you mean "not significant".
- When a KPI is a difference or a ratio, chart its parts next to it.
- Mark every system change on the timeline: moves, source switches and platform migrations.
- Start the axis at zero for a quantity like the swing, so a flat line reads flat.
None of this needs new software. It needs a team that writes down what would change its mind, before the chart exists.
Notes
- NOAA NCEI, GHCN-Daily access file USW00013988.csv, downloaded 2026-09-24 CDT (2026-09-25 02:44 UTC) and sha256-hashed in
tableau-sources/manifest.json. ↩︎ tableau-sources/out/kc_weather_daily.json, sections coverage, metadata.qc_dropped and sources; audit claims 1 and 2 intableau/real-data-audit.md. On adjustment, NCEI states that GHCNd is not homogenized and carries no adjustments for changes in instruments or observing practice. Source: the GHCNd product page, accessed 2026-10-17; see also audit claim 9. ↩︎- Decade means from
kc_weather_daily.json(decades), each the mean of twelve calendar-month means so partial decades stay season-balanced; comparisons fromtableau-sources/out/robustness.json. ↩︎ - Theil-Sen slopes with Kendall tests over 79 complete years, 1934 to 2025, in
tableau-sources/out/findings.json(weather.trend_swing, trend_tmax, trend_tmin). ↩︎ tableau-sources/out/robustness.json(weather): autocorrelation-adjusted Mann-Kendall, moving-block bootstrap and detrended Pettitt tests. ↩︎- Pre-registered methods in
plans/2026-09-24_portfolio-real-data.md; H2 intableau/real-data-audit.md. ↩︎ tableau/real-data-audit.md, WHY section and the viz-beauty-weather before/after table. ↩︎- Pettitt test on annual mean lows,
kc_weather_daily.json(pettitt.tmin: last year before the shift 1979, first year after 1980; annual); audit claim 8. ↩︎ - NCEI Historical Observing Metadata Repository station record, read 2026-09-24, as stored in
kc_weather_daily.json(station_history). ↩︎ - Day-of-year percentiles with a ±7-day window, smoothed, in
findings.json(weather.peaks); audit claim 10. ↩︎ kc_weather_daily.json(extremes), ranks 1 and 2; audit claim 12. ↩︎
Sources
Weighing a move between Tableau and Power BI?
Email Daniel