How to subtract a day from a date in Python ?

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+’s zoneinfo.
  • Edge Cases: Subtracting days from the first day of a month/year works seamlessly.

Common Use Cases

ScenarioCode Example
Current date minus 1 daydatetime.now() - timedelta(days=1)
Specific date minus 1 daydatetime(2023, 12, 31) - timedelta(days=1)
String date minus 1 daydatetime.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 for datetime/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 and timedelta to subtract days from dates.
  • Parse string dates with strptime and format results with strftime.
  • The datetime module handles edge cases (leap years, month-end) automatically.

Leave a Reply

Your email address will not be published. Required fields are marked *