5 Best Ways to Remove Hours, Minutes, and Seconds from Python datetime

πŸ’‘ Problem Formulation: When working with Python’s datetime module, there might be scenarios where you need to truncate the time part (hours, minutes, and seconds) from a datetime object. For example, given an input of 2023-03-18 15:23:31, the desired output is 2023-03-18 00:00:00.

Method 1: Using datetime.replace()

This method involves replacing the hours, minutes, and seconds components of a datetime object with zeros. It is precise and straightforward, allowing direct manipulation of the time attributes.

Here’s an example:

from datetime import datetime

original_datetime = datetime(2023, 3, 18, 15, 23, 31)
truncated_datetime = original_datetime.replace(hour=0, minute=0, second=0)

print(truncated_datetime)

Output: 2023-03-18 00:00:00

This code snippet uses .replace() method from datetime object to reset the hour, minute, and second to 0. The resulting datetime object represents the truncated time at midnight.

Method 2: Constructing a New datetime Object

Create a new datetime object with the year, month, and day attributes copied from the original, while leaving out the time information. This method gives you a fresh object with only the required date data.

Here’s an example:

from datetime import datetime

original_datetime = datetime(2023, 3, 18, 15, 23, 31)
truncated_datetime = datetime(original_datetime.year, original_datetime.month, original_datetime.day)

print(truncated_datetime)

Output: 2023-03-18 00:00:00

This snippet constructs a new datetime object providing only the year, month, and day components. It inherently sets the time to midnight, effectively truncating the hours, minutes, and seconds.

Method 3: Using date() Method

Python’s datetime object has a .date() method to get a date object containing only year, month, and day information, effectively dropping the time part.

Here’s an example:

from datetime import datetime

original_datetime = datetime(2023, 3, 18, 15, 23, 31)
date_only = original_datetime.date()

print(datetime.combine(date_only, datetime.min.time()))

Output: 2023-03-18 00:00:00

The above example first converts datetime to a date object using .date() method. It then combines this with the minimum time possible using datetime.combine() to create a new datetime object with a zeroed time component.

Method 4: Using datetime.combine() with datetime.min.time()

Combine the date part of the datetime object with the minimum possible time value using the datetime.combine() function. It’s a neat and clear method to strip the time component.

Here’s an example:

from datetime import datetime

original_datetime = datetime(2023, 3, 18, 15, 23, 31)
truncated_datetime = datetime.combine(original_datetime.date(), datetime.min.time())

print(truncated_datetime)

Output: 2023-03-18 00:00:00

The code combines the date part of the original datetime object with the minimum possible time (midnight), creating a new datetime object.

Bonus One-Liner Method 5: List Slicing with str() and datetime.strptime()

Convert the datetime object to a string and slice to keep only the date portion, then parse back to a datetime object using strptime().

Here’s an example:

from datetime import datetime

original_datetime = datetime(2023, 3, 18, 15, 23, 31)
truncated_datetime = datetime.strptime(str(original_datetime)[:10], '%Y-%m-%d')

print(truncated_datetime)

Output: 2023-03-18 00:00:00

This one-liner turns the datetime object into its string representation, slices to extract the date portion, and then parses it back into a datetime object, defaulting the time to midnight.

Summary/Discussion

  • Method 1: datetime.replace() Direct and clear. Effective for readability. However, it can be verbose if used frequently.
  • Method 2: New datetime Object Provides a completely new object, clear intentions. Requires more typing compared to method 1.
  • Method 3: date() Method A clean and systematic approach. Slightly indirect as it requires an additional step to return to a datetime object.
  • Method 4: datetime.combine() with datetime.min.time() Compact and elegant. Does not mutate the original object, which could be a preferred behavior in some cases.
  • Bonus Method 5: String Slicing with strptime() A clever one-liner. It could lead to less readable code, which might be a disadvantage in complex codebases.