Time zones and DST create duplicated or missing hours on the axis
Aliases: DST artifacts · duplicated hours
What it is
The time axis looks continuous and uniform, but clock time carries two man-made fissures. DST transitions: spring forward leaves a 23-hour day — the curve cliffs at the switch moment; fall back produces a 25-hour day where the same clock time occurs twice — 01:30-to-02:30 data folds and doubles, spiking on the chart. Time zones: when multi-region data aggregate onto one axis, "9 a.m. everywhere" is not one moment, and cross-region comparison reads phase-shifted patterns. These are real data-pipeline artifacts; left untreated before plotting, the axis's "anomalies" get explained as business events.
Why it happens
Clock time is a policy artifact, not a physical quantity: DST transitions create discontinuity (spring jump) and multi-valuedness (autumn fold) in clock coordinates, and line charts register both — the jump renders as a cliff, the fold as a double-height spike. Clock-hour statistics (orders per hour) distort on switch days by construction: 23-hour days run low, the doubled hour runs twice. The timezone problem is a coordinate mismatch: UTC-stored timestamps localized to different zones drift the day boundary ("when does a day begin") by region, and daily or weekly aggregates change with the chosen zone — the same data yields different "daily active" in UTC versus local time by a stretch of morning traffic.
Where it stops holding
Strategy follows the audience: a single-timezone audience gets local clock time (intuitive), with switch days annotated; cross-timezone or technical audiences unify on UTC (eliminating folds and jumps) at the cost of readers converting "what local time." The hybrid (store UTC, display localized, aggregation basis declared) is the product default. Regions without DST (China, for instance) produce no local artifacts but still meet them in global pipelines. Sub-hourly granularities are most sensitive; daily and coarser mostly dilute it away.
Applying it
- Sanitize the data layer first: store UTC, flag DST switch days (
is_dst_shift_day), and normalize clock-hour aggregates on switch days to 23/25 hours or exclude with a declaration. - Annotate the chart layer: a vertical reference line at the switch labelled "DST transition"; shaded doubled-hour stretches labelled "double-counted."
- Verification: inspect the curve around each year's two switch days; an unannotated cliff or spike calls for the calendar before any business explanation.
Related
- Same group: U3.06.1 Uneven sampling plotted at even spacing distorts rates of change · U3.06.2 Gaps in a series should appear as gaps on the axis, not be skipped over · U3.06.3 Months have unequal lengths; equal-width monthly bars are not directly comparable · U3.06.5 Temporal granularity decides which periodicities become visible
- Nearby: U3.06.5 Temporal granularity decides which periodicities become visible · U8.03.1 Data-quality traps from timezones and DST
- Search terms:
daylight saving time·timezone·UTC normalization·hourly aggregation
Cards in the same group
- U3.06.1Uneven sampling plotted at even spacing distorts rates of change
- U3.06.2Gaps in a series should appear as gaps on the axis, not be skipped over
- U3.06.3Months have unequal lengths; equal-width monthly bars are not directly comparable
- U3.06.5Temporal granularity decides which periodicities become visible