ERCOT logo

Fuel Mix (Unified)

Realized ERCOT generation in megawatts by fuel type (coal, hydro, nuclear, storage, solar, wind, gas, other), one row per (event_time, fuel_type, quality).

Native record
ERCOT system x fuel type x 5-minute (live) or 15-minute (settled) interval
5-minute (live only, pending settled backfill) publication cadence
Evidence
Observed market data
Published observations from the named source
Time basis
Point-in-time records
UTC · event_time

Overview

Long-format unification of the live 5-minute feed and the settlement-grade Fuel Mix Report — but quality='settled' is TEMPORARILY DISABLED: ercot.fuel_mix_report's gen_mw was found to be ~4x too low (ERCOT publishes MWh delivered per 15-min interval, not average MW, and the writer didn't convert). The write-path bug is fixed, but existing report rows are still wrong pending a full historical backfill, so this view currently emits quality='live' only (the 5-minute feed, which reads a separate MW-native source and is correct). The settled branch will return once the backfill is verified. Always filter by event_time; this is a view, and an unbounded scan is expensive. This is the table the SQL agent actually queries; ercot_fuel_mix_report and ercot_fuel_mix_5min remain in the public catalog as the underlying raw sources.

Query contract

Select one exact event_time and one quality ('live' or 'settled'); never mix quality within one snapshot or sum across it. gen_mw is already the collapsed, revision-resolved value for that (event_time, fuel_type, quality) — no further argMax/vintage reduction is needed or correct.

Analysis rules

  • For a current fuel mix, use every fuel_type row at the same latest event_time and quality; do not combine values from different snapshots or different quality levels.
  • Calculate shares against the sum of gen_mw across fuel_type at that (event_time, quality).

Interpretation

  • quality='settled' is temporarily unavailable (returns no rows): the underlying ercot.fuel_mix_report source had a ~4x unit bug (MWh-per-interval stored as if it were average MW). Only quality='live' is currently exposed. Do not describe historical/settled fuel-mix data as unavailable in general — this is a known, temporary gap being backfilled, not a product boundary.
  • gen_mw for fuel_type='storage' is net fleet output: positive is discharging into the grid, negative is charging from the grid.

Schema4

Column
Type
event_timeDateTime64(6, 'UTC')
fuel_typeString
gen_mwNullable(Float64)
qualityString

Sample data

event_timefuel_typegen_mwquality
2026-09-05 23:15:00.000000coal10712.4970703125live
2026-09-05 23:15:00.000000hydro63.4370002746582live
2026-09-05 23:15:00.000000nuclear4956.189453125live
2026-09-05 23:15:00.000000storage2474.01000976562live
2026-09-05 23:15:00.000000solar15855.0732421875live
2026-09-05 23:15:00.000000wind8779.23046875live
2026-09-05 23:15:00.000000gas39617.64739990235live
2026-09-05 23:15:00.000000other76.0999984741211live
2026-09-05 23:10:00.000000coal10759.8740234375live
2026-09-05 23:10:00.000000hydro64.4290008544922live
2026-09-05 23:10:00.000000nuclear4960.56982421875live
2026-09-05 23:10:00.000000storage2251.4033203125live
2026-09-05 23:10:00.000000solar16332.01171875live
2026-09-05 23:10:00.000000wind8609.4130859375live
2026-09-05 23:10:00.000000gas39570.85180664064live
2026-09-05 23:10:00.000000other71.9000015258789live
2026-09-05 23:05:00.000000coal10758.13671875live
2026-09-05 23:05:00.000000hydro64.4380035400391live
2026-09-05 23:05:00.000000nuclear4956.0859375live
2026-09-05 23:05:00.000000storage1593.31359863281live
2026-09-05 23:05:00.000000solar17004.146484375live
2026-09-05 23:05:00.000000wind8632.8896484375live
2026-09-05 23:05:00.000000gas39578.07701110839live
2026-09-05 23:05:00.000000other69.8000030517578live
2026-09-05 23:00:00.000000coal10760.5400390625live

Coverage

100.0% complete0 gap days89 days with data
Show coverage history ▾
Coverage: 100.0%Days with data: 89Gaps: 0
2026
gaplessmore