Nameplate or Summer Capacity: Why Power Plant Capacity Totals Disagree
On this page
Problem statement
How much generating capacity does the US have? EIA-860 gives three answers for 2025 β 1,376.7 GW of nameplate capacity, 1,283.8 GW of summer capacity and 1,326.1 GW of winter capacity β and articles, reports and dashboards quote whichever they summed, often without saying. Between nameplate and summer alone the gap runs to tens of gigawatts. The differences are not errors: each column measures something different, and for some technologies the difference is large. This page shows where the gaps come from and when to use which.
Quick answer
Nameplate is the manufacturer's rating; summer and winter capacity are the net output the operator can count on in each season, after the plant's own use and the effect of temperature. Use summer capacity for reliability and peak demand, nameplate when comparing with construction announcements, and state which one you summed.
gen["summer"] = pd.to_numeric(gen["Summer Capacity (MW)"], errors="coerce")
gen["winter"] = pd.to_numeric(gen["Winter Capacity (MW)"], errors="coerce")
tot = gen[["MW", "summer", "winter"]].sum() / 1000
print(f"US operable capacity, 2025: nameplate {tot.MW:,.1f} GW, summer {tot.summer:,.1f} GW, winter {tot.winter:,.1f} GW")
r = gen.groupby("group")[["MW", "summer", "winter"]].sum()
print("summer as a share of nameplate:", (r.summer / r.MW).sort_values().round(3).to_dict())
US operable capacity, 2025: nameplate 1,376.7 GW, summer 1,283.8 GW, winter 1,326.1 GW
summer as a share of nameplate: {'geothermal': 0.663, 'oil': 0.863, 'biomass': 0.884, 'gas': 0.888, 'coal': 0.924, 'other': 0.927, 'nuclear': 0.949, 'solar': 0.994, 'wind': 0.996, 'hydro': 0.999, 'storage': 1.008}
The ratio of summer to nameplate depends on technology. Geothermal plants deliver 0.663 of nameplate in summer, oil 0.863, gas 0.888, coal 0.924 and nuclear 0.949; solar, wind and hydro are at 0.99 or more, and storage slightly above 1.
Where the three capacities differ
1. Three capacities per generator
ex = gen[gen.Technology == "Natural Gas Fired Combustion Turbine"][["MW", "summer", "winter"]]
print(f"gas combustion turbines: nameplate {ex.MW.sum() / 1000:.1f} GW, summer {ex.summer.sum() / 1000:.1f}, winter {ex.winter.sum() / 1000:.1f}")
print(f"turbines whose winter capacity exceeds nameplate: {(ex.winter > ex.MW).mean():.1%}")
gas combustion turbines: nameplate 160.2 GW, summer 135.5, winter 151.9
turbines whose winter capacity exceeds nameplate: 28.9%
Gas combustion turbines show the effect most clearly: 160.2 GW of nameplate, 135.5 GW in summer and 151.9 GW in winter. Turbine output falls as air gets hotter and thinner, so they deliver least exactly when demand peaks. 28.9% of turbines have a winter rating above their nameplate.
2. Blank strings hide in the columns
blank = gen["Summer Capacity (MW)"].astype(str).str.strip().eq("")
print(f"summer capacity left blank: {blank.sum()} generators, {gen.loc[blank, 'MW'].sum():,.0f} MW nameplate; technologies: {gen.loc[blank, 'Technology'].value_counts().head(3).to_dict()}")
summer capacity left blank: 72 generators, 8,793 MW nameplate; technologies: {'Natural Gas Fired Combined Cycle': 56, 'Conventional Hydroelectric': 13, 'Conventional Steam Coal': 2}
72 generators have no summer capacity at all β a blank string, not a number β covering 8,793 MW of nameplate, mostly combined-cycle gas units. Summing the column after errors="coerce" leaves them out, which accounts for part of the summerβnameplate gap; check blanks before attributing the whole gap to derating.
3. Solar's AC and DC
sol = read_860("3_3_Solar_Y2025.xlsx", "Operable")
sol = sol.assign(ac=pd.to_numeric(sol["Nameplate Capacity (MW)"], errors="coerce"), dc=pd.to_numeric(sol["DC Net Capacity (MW)"], errors="coerce"))
print(f"solar: AC nameplate {sol.ac.sum() / 1000:,.1f} GW, DC {sol.dc.sum() / 1000:,.1f} GW; median DC/AC ratio {(sol.dc / sol.ac).median():.2f}")
solar: AC nameplate 154.3 GW, DC 198.5 GW; median DC/AC ratio 1.31
Solar adds a fourth number. EIA-860's solar nameplate is the AC rating of the inverters, 154.3 GW; the panels' DC capacity is 198.5 GW, with a median DC-to-AC ratio of 1.31. Solar industry reports usually quote DC, so they will always look larger than EIA's figures.
4. Pick one and say which
peak = gen.groupby("group")[["MW", "summer"]].sum().div(1000)
peak["gap_GW"] = peak.MW - peak.summer
print(peak.sort_values("gap_GW", ascending=False).head(5).round(1).to_string())
MW summer gap_GW
group
gas 578.4 513.4 65.0
coal 182.5 168.6 13.9
nuclear 103.7 98.4 5.3
oil 32.0 27.6 4.4
biomass 12.5 11.1 1.5
In gigawatts, gas accounts for most of the national gap (65.0 GW), then coal (13.9) and nuclear (5.3).
States and new capacity
The data used on this page
The US Energy Information Administration's EIA-860 for 2025: the operable generators and the solar sheet, saved copies.
import io
import zipfile
from pathlib import Path
import geopandas as gpd
import numpy as np
import pandas as pd
import requests
Path("data").mkdir(exist_ok=True)
# EIA-860 (2025, released September 2026), EIA-923 (2025 final) and EIA-860M (August 2026), saved on 15 October 2026.
# Live: https://www.eia.gov/electricity/data/eia860/xls/eia8602025.zip, .../eia923/xls/f923_2025.zip and
# .../eia860m/xls/august_generator2026.xlsx; the annual files move to archive/xls/ when the next year's data appear.
FILES = {"eia860": "eia-860-2025-2026-10-15.zip", "eia923": "eia-923-2025-final-2026-10-15.zip",
"eia860m": "eia-860m-august-2026-2026-10-15.xlsx"}
for name in FILES.values():
if not Path(f"data/{name}").exists():
Path(f"data/{name}").write_bytes(requests.get(f"https://data.spatialworkflow.io/{name}", timeout=600).content)
def read_860(member, sheet=0):
"""One sheet of an EIA-860 workbook; the first row is a title, the last row of some sheets a note."""
with zipfile.ZipFile(f"data/{FILES['eia860']}") as z:
d = pd.read_excel(io.BytesIO(z.read(member)), sheet_name=sheet, skiprows=1)
return d[pd.to_numeric(d["Plant Code"], errors="coerce").notna()]
def read_923(sheet="Page 1 Generation and Fuel Data"):
with zipfile.ZipFile(f"data/{FILES['eia923']}") as z:
d = pd.read_excel(io.BytesIO(z.read("EIA923_Schedules_2_3_4_5_M_12_2025_Final.xlsx")), sheet_name=sheet, skiprows=5)
d.columns = [c.replace("\n", " ") for c in d.columns]
return d
GROUP = {"Conventional Steam Coal": "coal", "Coal Integrated Gasification Combined Cycle": "coal",
"Natural Gas Fired Combined Cycle": "gas", "Natural Gas Fired Combustion Turbine": "gas",
"Natural Gas Steam Turbine": "gas", "Natural Gas Internal Combustion Engine": "gas",
"Natural Gas with Compressed Air Storage": "gas", "Other Natural Gas": "gas", "Nuclear": "nuclear",
"Onshore Wind Turbine": "wind", "Offshore Wind Turbine": "wind", "Solar Photovoltaic": "solar",
"Solar Thermal with or without Energy Storage": "solar", "Conventional Hydroelectric": "hydro",
"Batteries": "storage", "Hydroelectric Pumped Storage": "storage", "Flywheels": "storage",
"Petroleum Liquids": "oil", "Petroleum Coke": "oil", "Wood/Wood Waste Biomass": "biomass",
"Landfill Gas": "biomass", "Municipal Solid Waste": "biomass", "Other Waste Biomass": "biomass",
"Geothermal": "geothermal"}
gen = read_860("3_1_Generator_Y2025.xlsx", "Operable")
gen["MW"] = pd.to_numeric(gen["Nameplate Capacity (MW)"], errors="coerce")
gen["group"] = gen.Technology.map(GROUP).fillna("other")
plants = read_860("2___Plant_Y2025.xlsx")
print(f"{len(plants):,} plants, {len(gen):,} operable generators, {gen.MW.sum() / 1000:,.1f} GW nameplate")
17,349 plants, 27,918 operable generators, 1,376.7 GW nameplate
Example 1: a state's capacity three ways
az = gen[gen.State == "AZ"][["MW", "summer", "winter"]].sum() / 1000
print(f"Arizona: nameplate {az.MW:.1f} GW, summer {az.summer:.1f} GW, winter {az.winter:.1f} GW")
mn = gen[gen.State == "MN"][["MW", "summer", "winter"]].sum() / 1000
print(f"Minnesota: nameplate {mn.MW:.1f} GW, summer {mn.summer:.1f} GW, winter {mn.winter:.1f} GW")
Arizona: nameplate 40.5 GW, summer 37.2 GW, winter 38.1 GW
Minnesota: nameplate 19.9 GW, summer 18.4 GW, winter 19.3 GW
Arizona's fleet is 40.5 GW on nameplate and 37.2 GW in summer; Minnesota's 19.9 GW and 18.4 GW. In both, winter capacity sits between the two.
Example 2: capacity added in 2025, three ways
new = gen[pd.to_numeric(gen["Operating Year"], errors="coerce") == 2025][["MW", "summer", "winter"]].sum() / 1000
print(f"added in 2025: nameplate {new.MW:.1f} GW, summer {new.summer:.1f} GW, winter {new.winter:.1f} GW")
added in 2025: nameplate 57.7 GW, summer 56.6 GW, winter 56.8 GW
For capacity added in 2025 the three figures are close β 57.7 GW nameplate, 56.6 summer, 56.8 winter β because new capacity was mostly solar and batteries, whose ratings barely change with season.
Three ratings, three questions
Nameplate capacity is the rated output of the generator as built, gross of the plant's own consumption. Net summer capacity is what the plant can deliver to the grid at its summer peak, tested or estimated by the operator; net winter capacity the same in winter. Thermal plants lose output in heat, because turbines take in less air and cooling water is warmer, and all thermal plants use some of their own output for pumps and fans.
Grid operators plan reliability on summer (and increasingly winter) capacity, because the question is whether there is enough at the peak. Developers, press releases and EIA's "capacity added" tables often use nameplate. Capacity factors can use either, and they come out differently: nuclear's rises noticeably when summer capacity is the denominator.
Other capacity pitfalls
- Storage capacity is power (MW), not energy (MWh); EIA-860 reports energy capacity in the storage sheet.
- Combined cycle units are reported as separate generators (gas turbine and steam turbine parts); sum them, do not take one.
- Retired and standby units are in the operable sheet with status codes; filter if you want capacity in use.
- Wind nameplate is the sum of turbine ratings, which can exceed what the interconnection allows.
Internal links
- How to calculate capacity factors from EIA data β where the denominator matters
- Capacity factor explained β the concept
- How to map US power plants from EIA-860 β capacity by plant
FAQ
What is the difference between nameplate and summer capacity?
Nameplate is the generator's rating as built; summer capacity is the net output it can deliver at the summer peak. For US plants in 2025 the totals were 1,376.7 GW and 1,283.8 GW.
Why is solar capacity different in EIA data and industry reports?
EIA-860 reports solar in AC (154.3 GW in 2025); industry reports usually use DC panel capacity (198.5 GW).