The timedelta class is a part of Python’s datetime module, which offers various functions and classes for working with dates and times. A timedelta object specifically represents a duration of time. This makes it essential for performing calculations on dates and times, such as:
- Calculating time differences: Finding the duration between two dates or times.
- Determining future and past dates: Determining dates that are a certain distance away (days, weeks, months) from a starting point.
- Adjusting timestamps: Modifying timestamps by adding or subtracting time intervals.
Let’s explore more about timedelta with some examples.
What is timedelta?
A timedelta object in Python represents a duration of time. The “delta” in its name refers to the Greek letter (Δ) used in science and engineering to represent change.
Basically, it captures the difference between two dates, two times, or a combination of both. You could use them to determine how long an event took, or to determine a future or past date by adding or subtracting a timedelta from a specific date.
Did you know, if you subtract two datetime objects, the result is a timedelta object? Let’s illustrate this with an example:
from datetime import datetime
start = datetime(2024, 3, 10, 10, 0)
end = datetime(2024, 10, 10, 11, 45, 30)
duration = end - start
print(duration)
# Output: 214 days, 1:45:30
print(type(duration))
# Output: <class 'datetime.timedelta'>So a timedelta object doesn’t represent a specific point in time, but rather the span between two points.
Let’s learn more about timedelta Objects.
timedelta Objects
timedelta objects are part of the datetime module and represent a duration of time.
Constructor
When creating a new timedelta object, you use the constructor datetime.timedelta(). This constructor takes several arguments, each representing a different component of the time duration. You can provide values for any combination of these arguments to define your duration.
class datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)It’s important to note that all arguments within the datetime.timedelta() constructor are optional and default to zero. Additionally, you can use either integers or floats for the values, and they can be positive or negative.
Here’s how you can create timedelta objects using the datetime.timedelta() constructor:
from datetime import timedelta
# Create a timedelta of 3 days
delta = timedelta(days=3)
# Create a timedelta of 2 hours and 30 minutes
delta = timedelta(hours=2, minutes=30)
# Create a timedelta of 1 week, 2 days, 4 hours, and 15 seconds (all positive values)
delta = timedelta(weeks=1, days=2, hours=4, seconds=15)
# Create a timedelta with negative values (represents a duration in the past)
delta = timedelta(days=-1)
# Create a timedelta using a combination of positive and negative values
delta = timedelta(weeks=-1, hours=3, minutes=10, seconds=-20)
# Create a timedelta with float values (represents half-day)
delta = timedelta(days=0.5)In the example, notice that the timedelta class is imported. Whenever you need to create a timedelta object, you must import this class.
Attributes
A timedelta object stores its duration internally in three read-only attributes:
days: The number of full days in the duration.seconds: The number of seconds in the duration.microseconds: The number of microseconds in the duration.
It’s important to remember that while you can provide various time units (milliseconds, minutes, hours, weeks) when creating a timedelta object, Python internally stores everything in terms of days, seconds, and microseconds. This means that any other units you use in the constructor are automatically converted into these three units.
Here’s how the conversions happen:
- A millisecond is converted to 1000 microseconds.
- A minute is converted to 60 seconds.
- An hour is converted to 3600 seconds.
- A week is converted to 7 days.
The example below illustrates how any arguments besides days, seconds and microseconds are “merged” and normalized into those three attributes:
from datetime import timedelta
delta = timedelta(
days=50,
seconds=27,
microseconds=10,
milliseconds=29000,
minutes=5,
hours=8,
weeks=2
)
# Only days, seconds, and microseconds remain
print(repr(delta))
# Output: datetime.timedelta(days=64, seconds=29156, microseconds=10)Accessing Attributes
You can directly access the individual attributes of a timedelta object using dot . notation.
from datetime import timedelta
delta = timedelta(days=20, hours=1, minutes=3, seconds=1, microseconds=512)
print("Days:",delta.days) # Days: 20
print("Seconds:",delta.seconds) # Seconds: 3781
print("Microseconds:",delta.microseconds) # Microseconds: 512Let’s explore some practical examples of using timedelta.
Calculating Future Dates
You can add a timedelta object to a datetime object to calculate a future date.
from datetime import datetime, timedelta
# Current datetime
now = datetime.now()
print(now.date()) # Output: 2024-03-09
# One day later
tomorrow = now + timedelta(days=1)
print(tomorrow.date()) # Output: 2024-03-10
# One week from now
in_a_week = now + timedelta(weeks=1)
print(in_a_week.date()) # Output: 2024-03-16Calculating Past Dates
To calculate a past date, you can subtract a timedelta object from a datetime object.
from datetime import datetime, timedelta
# Current datetime
now = datetime.now()
print(now.date()) # Output: 2024-03-09
# Calculating the date 15 days ago
time_earlier = now - timedelta(days=15)
print(time_earlier.date()) # Output: 2024-02-23If you remember, the timedelta constructor allows for negative arguments. Using negative values lets you represent durations in the past. This means you can calculate past dates or times either by subtracting a positive timedelta or adding a negative timedelta.
# Calculating the date 15 days ago
time_earlier = now + timedelta(days=-15)
print(time_earlier.date())
# Output: 2024-02-23Difference Between Dates
When you subtract two datetime objects, Python automatically produces a timedelta object representing the duration between those dates. You can access the .days attribute of this timedelta object to determine the number of days in the difference.
from datetime import datetime, timedelta
start = datetime(2024, 3, 10)
end = datetime(2024, 10, 10)
duration = end - start
print("Difference:", duration.days, "days")
# Difference: 214 daysTime Difference in Seconds
For precise time tracking, you may need to know the total number of seconds in a duration. timedelta objects have a useful method called total_seconds(). This method takes the days, seconds, and microseconds attributes of the timedelta object and converts them into a total number of seconds.
from datetime import datetime, timedelta
start = datetime(2024, 3, 10)
end = datetime(2024, 3, 11)
duration = end - start
# Print the total duration in seconds
print("Total seconds:",duration.total_seconds()) # Total seconds: 86400.0timedelta Operations
You can perform various operations with timedelta objects, the most common of which are:
- Addition: You can add two
timedeltaobjects to combine their durations. - Subtraction: Subtracting one
timedeltafrom another gives you the difference between them. - Multiplication: A
timedeltacan be multiplied by an integer or float, allowing you to scale the duration it represents. - Division: You can divide one
timedeltaby another to find the ratio between them, or divide atimedeltaby an integer or float to reduce its duration.
from datetime import timedelta
delta1 = timedelta(days=20)
delta2 = timedelta(days=10)
print("Addition:", delta1 + delta2) # Addition: 30 days, 0:00:00
print("Difference:", delta1 - delta2) # Difference: 10 days, 0:00:00
print("Multiplication:", delta1 * 2) # Multiplication: 40 days, 0:00:00
print("Division:", delta1 / delta2) # Division: 2.0The table below lists all the supported operations.
| Operation | Result |
| t = t1 + t2 | Sum of t1 and t2. |
| t = t1 – t2 | Difference between t1 and t2. |
| t = t1 * i or t = i * t1 | Delta multiplied by an integer. |
| t = t1 * f or t = f * t1 | Delta multiplied by a float. |
| f = t1 / t2 | Division of overall duration. Returns a float object. |
| t = t1 / f or t = t1 / i | Delta divided by a float or an int. |
| t = t1 // i or t = t1 // t2 | The floor is computed and the remainder (if any) is thrown away. |
| t = t1 % t2 | The remainder is computed as a timedelta object. |
| q, r = divmod(t1, t2) | Computes the quotient and the remainder: q = t1 // t2 and r = t1 % t2. |
| -t | equivalent to timedelta(-t.days, -t.seconds, -t.microseconds), and to t1* -1. |
| abs(t) | equivalent to +t when t.days >= 0, and to -t when t.days < 0. |
| str(t) | Returns a string in the form [D day[s], ][H]H:MM:SS[.UUUUUU] |
| repr(t) | Returns a string representation of the timedelta object |
timedelta objects are immutable. Operations on them return new timedeltas.
Formatting timedelta
To extract meaningful units like weeks, days, hours, minutes, and seconds from a timedelta object, you can use the total_seconds() method and perform arithmetic calculations or use the divmod() function for convenience.
from datetime import datetime, timedelta
start = datetime(2024, 3, 10, 10, 0)
end = datetime(2024, 10, 10, 11, 45, 30)
duration = end - start
# Basic formatting
print("Duration:", duration) # Duration: 214 days, 1:45:30
# Custom formatting
total_seconds = duration.total_seconds()
minutes, seconds = divmod(total_seconds, 60)
hours, minutes = divmod(minutes, 60)
days, hours = divmod(hours, 24)
weeks, days = divmod(days, 7)
print(f"Duration: {weeks} weeks, {days} days, {hours} hours, {minutes} minutes, {seconds} seconds")
# Duration: 30.0 weeks, 4.0 days, 1.0 hours, 45.0 minutes, 30.0 seconds