How to subtract a day from a date?
If your Python datetime object is timezone-aware than you should be careful to avoid errors around DST transitions (or changes in UTC offset for other reasons):
from datetime import datetime, timedeltafrom tzlocal import get_localzone # pip install tzlocalDAY = timedelta(1)local_tz = get_localzone() # get local timezonenow = datetime.now(local_tz) # get timezone-aware datetime objectday_ago = local_tz.normalize(now - DAY) # exactly 24 hours ago, time may differnaive = now.replace(tzinfo=None) - DAY # same timeyesterday = local_tz.localize(naive, is_dst=None) # but elapsed hours may differ
In general, day_ago
and yesterday
may differ if UTC offset for the local timezone has changed in the last day.
For example, daylight saving time/summer time ends on Sun 2-Nov-2014 at 02:00:00 A.M. in America/Los_Angeles timezone therefore if:
import pytz # pip install pytzlocal_tz = pytz.timezone('America/Los_Angeles')now = local_tz.localize(datetime(2014, 11, 2, 10), is_dst=None)# 2014-11-02 10:00:00 PST-0800
then day_ago
and yesterday
differ:
day_ago
is exactly 24 hours ago (relative tonow
) but at 11 am, not at 10 am asnow
yesterday
is yesterday at 10 am but it is 25 hours ago (relative tonow
), not 24 hours.
pendulum
module handles it automatically:
>>> import pendulum # $ pip install pendulum>>> now = pendulum.create(2014, 11, 2, 10, tz='America/Los_Angeles')>>> day_ago = now.subtract(hours=24) # exactly 24 hours ago>>> yesterday = now.subtract(days=1) # yesterday at 10 am but it is 25 hours ago>>> (now - day_ago).in_hours()24>>> (now - yesterday).in_hours()25>>> now<Pendulum [2014-11-02T10:00:00-08:00]>>>> day_ago<Pendulum [2014-11-01T11:00:00-07:00]>>>> yesterday<Pendulum [2014-11-01T10:00:00-07:00]>