---
title: Correct 2020 nfl_games kickoff times
type: task
status: completed
description: >-
  nfl_games.kickoff_at for 2020 is 4-5 hours late, which breaks any kickoff cut on 2020 data,
  including the point-in-time projection panel.
base_uri: user:task/league/correct-2020-nfl-games-kickoff-times.md
created_at: '2026-10-29T20:26:56.101Z'
entity_id: d34f6550-4150-4a6c-afb7-f24e8138fd16
finished_at: '2026-10-29T23:49:07.055Z'
observations:
  - ████████████████████████████████████████████████
owner_identity_uri: █████████████████████████
priority: Medium
public_read: true
relations:
  - relates [[███████████████████████-████-███████████-████-██████-██████-██████████]]
started_at: '2026-10-29T22:38:56.498Z'
tags:
  - user:tag/league-xo-football.md
updated_at: '2026-10-29T23:49:07.055Z'
visibility_analyzed_at: '2026-11-05T23:48:38.511Z'
---

## Problem

`nfl_games.kickoff_at` for 2020 is 4-5 hours late: a 1pm ET game is stored as 23:00Z (EST weeks) or 21:00Z (EDT weeks), against 18:00Z or 17:00Z. Correcting with `(kickoff_at AT TIME ZONE 'America/New_York') AT TIME ZONE 'UTC'` matches true kickoffs (TEN@GB week 16 reads `2020-12-28T06:20Z` against a true 01:20Z). 2021-2026 are correct. Any kickoff cut on 2020 is off: 231 leaked 2020 ESPN rows look pre-kickoff under the raw values. Found 2026-10-29.

## Plan

- [x] Find the importer or migration that wrote 2020 kickoffs as Eastern wall-clock time labelled UTC. Done 2026-10-29: `import-nfl-games-nfl.mjs` as first committed (`1083ac5b6`, 2022-08) wrote the feed's UTC time into `date` and `time_eastern`; fixed in `94719ea80` (2023-09). `kickoff_at` is derived from those strings, so they are what needs correcting, for 2013-2020 REG and POST and 2013-2015 PRE (2,333 rows).
- [x] Correct the 2020 rows, and check every other timestamp column on 2020 games. Done 2026-10-29 for all 2,333 affected 2013-2020 games (`date`, `time_eastern`, `kickoff_at`); `day` recomputed by `process-nfl-games`, which first needed fixing (league `94a8d7052`); the other timestamp columns are null for 2020.
- [x] List the consumers that cut on `kickoff_at` (the weekly projection panel, backtests) and re-run any 2020 result they persisted. Done 2026-10-29: only the production-incidence model persists one; its refit graded worse held-out, so the committed model stays. The rest read live and persist nothing.

## Done when

2020 `kickoff_at` values are true UTC kickoffs, and the 2020 results that depended on them are re-run.
