PJM logo

PJM Hourly Actual Load

Actual hourly electricity demand in PJM, one row per hour with a system total and one column per load area.

Native record
one row per operating hour, wide by sub-area
hourly publication cadence
Evidence
Observed market data
Published observations from the named source
Time basis
Interval-start records
UTC · event_time

Overview

75,672 hours, 2017-12 to now. Columns: system_mw plus aep_mw, ap_mw, atsi_mw, dayton_mw, deok_mw, dominion_mw, duquesne_mw, ekpc_mw, mid_atlantic_mw, northern_illinois_mw. system_mw is DERIVED as the sum of the ten areas, but unlike NYISO it has been checked: against PJM's own published RTO total over 517 overlapping hours the mean difference is 0.009% and the maximum 0.938%. Wide rather than long, so "load right now" and "the 10 load area shares of it" are one row, not 11. Every market's load table in this catalog shares the system_mw column and the same hourly grain, so a cross-market demand comparison needs no reshaping.

Query contract

One row is the canonical hourly value; the refresh already collapsed the source's restatements. Read the hour you want and use its columns together.

Analysis rules

  • Take every value for one hour from that hour's single row. Never combine a system total from one hour with area values from another.
  • An area's share of demand is <area>_mw / system_mw within the same row. Do not sum the 10 area columns and system_mw together — that double-counts the whole market.

Related analysis

  • forecast error for a delivered hour · join on event_time, one forecast vintage at a time

Interpretation

  • This is PJM's PRELIMINARY hourly series and PJM restates it; the refresh always takes the latest restatement. It publishes about a day behind, so the newest row is typically 12 to 24 hours old. For PJM demand right now use pjm.inst_load.
  • system_mw is derived by summing the area columns, so the identity system_mw = sum(areas) proves nothing about either. Do not present it as an independent cross-check.

Access

Query from your own tools

Use the guarded HTTP endpoint directly, or connect an MCP client and load the dataset contract with describe_data before calling query_data.

HTTP endpoint
POST /api/v1/datasets/pjm_load/query

Need the full history of this dataset in Snowflake, Databricks or your own storage? Data services delivers it on a schedule.

Schema12

Column
Type
event_timeDateTime64(6, 'UTC')
system_mwNullable(Float64)
aep_mwNullable(Float64)
ap_mwNullable(Float64)
atsi_mwNullable(Float64)
dayton_mwNullable(Float64)
deok_mwNullable(Float64)
dominion_mwNullable(Float64)
duquesne_mwNullable(Float64)
ekpc_mwNullable(Float64)
mid_atlantic_mwNullable(Float64)
northern_illinois_mwNullable(Float64)

Sample data

event_timesystem_mwaep_mwap_mwatsi_mwdayton_mwdeok_mwdominion_mwduquesne_mwekpc_mwmid_atlantic_mwnorthern_illinois_mw
2026-10-11 03:00:00.00000078193.5999999999914394.34407.26158.71479.22234.614551.611161223.6229939635.4
2026-10-11 02:00:00.00000081372.314850.44613.16406.915552342.814935.61160.11267.824208.310032.3
2026-10-11 01:00:00.00000084295.9999999999915360.747906622.41626.82436.915303.91181.61300.625302.210370.9
2026-10-11 00:00:00.0000008647515680.44923.26809.716822513.815679.91216.31347.126028.910593.7
2026-10-10 23:00:00.00000087519.615882.14990.76882.61700.1254515770.51231.9132526522.210669.5
2026-10-10 22:00:00.00000086495.2000000000115733.14896.46832.31678.62489.215612.71220.91253.826191.610586.6
2026-10-10 21:00:00.00000085253.7000000000115674.94813.567941684.32474.915435.51214.91190.825427.510543.4
2026-10-10 20:00:00.00000084286.115721.54725.76735.21682.42482.215347.81217.61181.124730.510462.1
2026-10-10 19:00:00.00000082772.115514.84696.66698.61679.42483.615247.41218.91181.923816.410234.5
2026-10-10 18:00:00.00000081998.7999999999915505.54692.46777.71695.32482.1151341223.61201.223239.510047.5
2026-10-10 17:00:00.00000081032.1154984690.76768.11704.52498.615031.41212.51280.722547.69800
2026-10-10 16:00:00.00000080453.8000000000215473.14684.367801708.2250515005.51204.31230.322349.59513.6
2026-10-10 15:00:00.00000080081.715529.94699.86824.91703.42486.614904.41176.61177.322374.39204.5
2026-10-10 14:00:00.00000079856.9154394752.46744.71688.52445.814765.31174.11143.222755.98948
2026-10-10 13:00:00.00000079431.5999999999915156.647586601.41659.72394.114602.211631134.523053.48908.7
2026-10-10 12:00:00.00000078719.514759.64692.16502.31602.22301.814336.91140.41166.223222.78995.3
2026-10-10 11:00:00.0000007689114450.34550.16355.31546.9220913958.41109.11116.422754.28841.3
2026-10-10 10:00:00.00000074278.114002.74357.361721468.4211413545.11063.61042.721935.78576.6
2026-10-10 09:00:00.00000071947.713711.241925931.81412.6202813204.110571043.220982.38385.5
2026-10-10 08:00:00.00000070938.3134154098.95809.51391.22002.313049.31042.9100620714.98408.3
2026-10-10 07:00:00.00000071381.5999999999913373.64075.15788.91395.22018.713095.61036.2100921002.58586.8
2026-10-10 06:00:00.00000072505.213550.34100.25878.11424.32071.813239.51053.21093.521283.68810.7
2026-10-10 05:00:00.00000073996.2999999999913767.24137.56013.91465.72154.513462.91047.71102.121766.49078.4
2026-10-10 04:00:00.00000076293.114160.94236.46225.51533.62261.813841.61085.41037.122487.79423.1
2026-10-10 03:00:00.00000079918.114804.444316408.81637.8240714327.81128.71219.323633.89919.5

Coverage

100.0% complete0 gap days5,529 days with data
Show coverage history
Coverage: 100.0%Days with data: 5,529Gaps: 0
2026
2025
2024
2023
2022
2021
2020
2019
2018
2017
2016
2015
2014
2013
2012
2011
gaplessmore