Starting Daylight Saving Time in Python – How DST Begins and Affects Datetimes in 2026
Daylight Saving Time (DST) begins each spring when clocks are set forward by one hour. This “spring forward” transition is one of the most important events to handle correctly in data science because it can cause missing or duplicated hours in your timestamps. In 2026, Python’s zoneinfo module automatically manages DST transitions, but understanding how it works is essential for building reliable time-based features and avoiding subtle bugs.
TL;DR — DST Start Rules (2026)
- United States & Canada: Second Sunday in March at 2:00 AM local time → clocks jump to 3:00 AM
- European Union: Last Sunday in March at 1:00 AM UTC → clocks jump to 2:00 AM
zoneinfohandles the jump automatically- One hour is “lost” — timestamps between 2:00–3:00 AM do not exist on that day
1. How Python Handles DST Start
from datetime import datetime
from zoneinfo import ZoneInfo
# New York DST start in 2026 (second Sunday in March)
ny_tz = ZoneInfo("America/New_York")
# Just before DST start
before = datetime(2026, 3, 8, 1, 59, 59, tzinfo=ny_tz)
print(before)
# After the jump (2:00 AM becomes 3:00 AM)
after = datetime(2026, 3, 8, 3, 0, 0, tzinfo=ny_tz)
print(after)
2. Real-World Data Science Examples
import pandas as pd
# Demo file so this example runs as-is (in your project this is your real export)
times = pd.date_range("2026-03-06 12:00", periods=40, freq="3h")
pd.DataFrame({
"order_id": range(1001, 1041),
"order_time": times.strftime("%Y-%m-%d %H:%M:%S+00:00"),
"order_date": times.strftime("%Y-%m-%d %H:%M:%S"),
"delivery_date": (times + pd.Timedelta(days=3)).strftime("%Y-%m-%d %H:%M:%S"),
"amount": [round(50 + 11.5 * k, 2) for k in range(40)],
}).to_csv("sales_data.csv", index=False)
df = pd.read_csv("sales_data.csv", parse_dates=["order_time"])
# Convert to timezone-aware (zoneinfo handles DST automatically)
df["order_time_ny"] = df["order_time"].dt.tz_convert("America/New_York")
# Detect DST transition day
dst_start_day = df["order_time_ny"].dt.date == pd.Timestamp("2026-03-08").date()
print("Number of orders on DST start day:", len(df[dst_start_day]))
3. Best Practices in 2026
- Always use
zoneinfo.ZoneInfo— it knows when DST starts and ends - Store all internal timestamps in UTC to avoid DST-related issues
- Convert to local time only at the final display/reporting stage
- Be aware that on DST start day, one hour (usually 2:00–3:00 AM) is skipped
- Test your pipelines around DST transition dates every year
What Actually Happens at the Spring-Forward Moment
At the start of daylight saving time the local clock skips an hour. In New York on 8 March 2026, the clock goes from 01:59:59 straight to 03:00:00, and the UTC offset changes from -05:00 to -04:00. Local times between 02:00 and 03:00 simply do not exist on that day.
Python does not raise an error if you build one of those missing times with a ZoneInfo. It creates the object, but the result is not a real wall-clock reading. The safest way to reason about the gap is to work in UTC and convert to local time only for display.
The elapsed time across the jump is also shorter than the wall clock suggests: from 01:30 to 03:30 local time is only one real hour.
Worked Example: Measuring Real Elapsed Time Across the Jump
We compare the wall-clock difference with the real difference measured in UTC.
from datetime import datetime, timezone
from zoneinfo import ZoneInfo
ny = ZoneInfo("America/New_York")
start = datetime(2026, 3, 8, 1, 30, tzinfo=ny)
end = datetime(2026, 3, 8, 3, 30, tzinfo=ny)
print("Offsets:", start.utcoffset(), end.utcoffset())
print("Wall-clock difference:", end - start)
real = end.astimezone(timezone.utc) - start.astimezone(timezone.utc)
print("Real elapsed time:", real)
Subtracting two aware datetimes in the same zone compares wall-clock readings and reports two hours. Converting both to UTC first shows that only one real hour passed, because one hour was skipped.
Common Mistakes
- Assuming every day has 24 hours in local time.
- Creating local times inside the 02:00–03:00 gap and treating them as real.
- Calculating durations on local times instead of UTC.
- Testing pipelines only on dates far away from DST changes.
Quick Summary
- Spring forward removes one local hour.
- The UTC offset changes at the jump.
- Measure durations in UTC.
- Convert to local time only for display.
Conclusion
Understanding how Daylight Saving Time starts and how Python handles it is critical for accurate time-based analysis. In 2026, the zoneinfo module makes DST transitions seamless, but you must still be aware of the “missing hour” and always prefer UTC for internal storage. Proper DST handling prevents data gaps, duplicate timestamps, and incorrect analytics during spring and fall transitions.
Next steps:
- Check your current datetime pipelines and ensure they use
zoneinfoand UTC storage to handle DST start correctly