To subtract a day from a date in Python, use the datetime
and timedelta
classes from the datetime
module. Here’s a step-by-step guide with examples:
1. Subtract a Day from the Current Date
from datetime import datetime, timedelta
# Get current date and time
current_datetime = datetime.now()
yesterday_datetime = current_datetime - timedelta(days=1)
print("Current datetime:", current_datetime)
print("Yesterday:", yesterday_datetime)
Output (example):
Current datetime: 2023-10-05 14:30:00.123456
Yesterday: 2023-10-04 14:30:00.123456
2. Subtract a Day from a Specific Date
from datetime import datetime, timedelta
# Define a specific date
date = datetime(2023, 12, 31) # December 31, 2023
new_date = date - timedelta(days=1)
print("Original date:", date.date()) # 2023-12-31
print("New date:", new_date.date()) # 2023-12-30
3. Handle String Dates (Parse and Subtract)
from datetime import datetime, timedelta
# Date string (format: YYYY-MM-DD)
date_str = "2023-02-28"
date = datetime.strptime(date_str, "%Y-%m-%d")
# Subtract a day
new_date = date - timedelta(days=1)
print("New date:", new_date.date()) # 2023-02-27
# Handle leap year (February 29, 2024 → February 28, 2024)
leap_date = datetime(2024, 2, 29)
new_leap_date = leap_date - timedelta(days=1)
print("Leap year adjustment:", new_leap_date.date()) # 2024-02-28
4. Use date
Class (Without Time)
from datetime import date, timedelta
# Create a date object
today = date.today()
yesterday = today - timedelta(days=1)
print("Today:", today) # 2023-10-05
print("Yesterday:", yesterday) # 2023-10-04
5. Subtract Days from a String with Custom Format
from datetime import datetime, timedelta
# Date string in DD-MM-YYYY format
date_str = "31-12-2023"
date = datetime.strptime(date_str, "%d-%m-%Y")
# Subtract a day
new_date = date - timedelta(days=1)
print("New date:", new_date.strftime("%d-%m-%Y")) # 30-12-2023
Key Notes
- Leap Years: The
datetime
module handles leap years automatically. - Time Zones: For timezone-aware dates, use
pytz
or Python 3.9+’szoneinfo
. - Edge Cases: Subtracting days from the first day of a month/year works seamlessly.
Common Use Cases
Scenario | Code Example |
---|---|
Current date minus 1 day | datetime.now() - timedelta(days=1) |
Specific date minus 1 day | datetime(2023, 12, 31) - timedelta(days=1) |
String date minus 1 day | datetime.strptime("2023-10-05", "%Y-%m-%d") - timedelta(days=1) |
Date arithmetic (N days) | datetime.now() - timedelta(days=5) (subtract 5 days) |
Why This Works
timedelta(days=1)
represents a duration of 1 day.- The
-
operator is overloaded fordatetime
/date
objects to handle date arithmetic.
Handling Time Zones
For timezone-aware dates (using pytz
):
from datetime import datetime, timedelta
import pytz
# Timezone-aware date (e.g., New York)
tz = pytz.timezone("America/New_York")
now = datetime.now(tz)
yesterday = now - timedelta(days=1)
print("NY Time Yesterday:", yesterday.strftime("%Y-%m-%d %H:%M:%S %Z%z"))
Summary
- Use
datetime
andtimedelta
to subtract days from dates. - Parse string dates with
strptime
and format results withstrftime
. - The
datetime
module handles edge cases (leap years, month-end) automatically.