Sort a list of dates in Python

By James L.

In this guide, we will cover the following topics:

Sorting a list of date strings

You can sort a list of date strings using the sorted() function along with the key parameter to specify the sorting criteria.

Here’s an example:

# Import datetime module
from datetime import datetime

# List of dates
dates = ["2024-03-20", "2024-03-15", "2024-03-30", "2024-03-10"]

# Sort the dates
sorted_dates = sorted(dates, key=lambda x: datetime.strptime(x, "%Y-%m-%d"))

print(sorted_dates)

# Output: ['2024-03-10', '2024-03-15', '2024-03-20', '2024-03-30']

In this example, the key parameter is used to specify a function (key=lambda x: datetime.strptime(x, "%Y-%m-%d")) that converts each date string to a datetime object. The sorted() function then sorts the dates based on these datetime objects.

The sorted() function returns a new sorted list without modifying the original list.

The strptime() parses a string representing a date and time into a datetime object.

In the above example, we assume the date strings are in the format "%Y-%m-%d", which means a four-digit year, followed by a two-digit month, and a two-digit day. However, you can modify the format string based on your actual data.

Let’s take a look at another example:

# Import datetime module
from datetime import datetime

# List of dates
dates = ["March 29, 2010", "January 24, 2005",
         "February 15, 2020", "April 1, 2015"]

# Sort the dates
sorted_dates = sorted(dates, key=lambda x: datetime.strptime(x, "%B %d, %Y"))

print(sorted_dates)
# Output: ['January 24, 2005', 'March 29, 2010', 'April 1, 2015', 'February 15, 2020']

In the above example, the "%B %d, %Y" format string specifies the format of the date strings in the list. %B represents the full month name, %d represents the two-digit day of the month, and %Y represents the four-digit year.

You can find the full list of format codes here.

Using the sort() method

Alternatively, you can use the sort() method to sort a list of date strings. The sort() method sorts the list in-place modifying the original list.

Here’s an example:

# Import datetime module
from datetime import datetime

# List of dates
dates = ["2024-03-20", "2024-03-15", "2024-03-30", "2024-03-10"]

# Sort the dates
dates.sort(key=lambda x: datetime.strptime(x, "%Y-%m-%d"))

print(dates)

# Output: ['2024-03-10', '2024-03-15', '2024-03-20', '2024-03-30']

Sorting in descending order

You can sort a list of date strings in descending order by setting the reverse parameter of the sorted() or sort() to True.

Here’s an example:

# Import datetime module
from datetime import datetime

# List of dates
dates = ["2024-03-20", "2024-03-15", "2024-03-30", "2024-03-10"]

# Sort the dates descending order
sorted_dates = sorted(dates, key=lambda x: datetime.strptime(x, "%Y-%m-%d"), reverse=True)

print(sorted_dates)

# Output: ['2024-03-30', '2024-03-20', '2024-03-15', '2024-03-10']

Similarly, use the following code for the sort() method:

dates.sort(key=lambda x: datetime.strptime(x, "%Y-%m-%d"), reverse=True)

Error Handling

If the date strings are not in a valid format, attempting to sort them will result in a ValueError. Here’s how you can handle errors effectively.

Validating Date Strings:

Before sorting the list, you can validate each date string to ensure it follows a specific date format.

Here’s an example:

from datetime import datetime

# Define a function to validate a date string
def validate_date(date_str, date_format='%Y-%m-%d'):
    try:
        datetime.strptime(date_str, date_format)
        return True
    except ValueError:
        return False

# Define a function to sort list of dates


def sort_dates(date_list):
    valid_dates = []
    invalid_dates = []

    for date_str in date_list:
        if validate_date(date_str):
            valid_dates.append(date_str)
        else:
            invalid_dates.append(date_str)

    if invalid_dates:
        print("Warning: Invalid date strings encountered:", invalid_dates)

    return sorted(valid_dates)


# List of date strings
dates = ['2023-01-15', '2024-02-05', 'January 4, 2015', 'invalid_date']
sorted_dates = sort_dates(dates)
print("Sorted dates:", sorted_dates)

Output:

Warning: Invalid date strings encountered: ['January 4, 2015', 'invalid_date']
Sorted dates: ['2023-01-15', '2024-02-05']

In the example above, we define two functions, validate_date() and sort_dates().

  1. validate_date(): This function takes a date string and an optional date format as input. It attempts to convert the date string into a datetime object using the specified format. If the conversion is successful, it returns True, indicating that the date string is valid. Otherwise, it returns False. Inside this function, we use the strptime() method from the datetime module to parse the string.
  2. sort_dates(): This function accepts a list of date strings as input. It iterates through each date string in the list and validates them using the validate_date() function. Valid dates are appended to a list of valid dates, while invalid dates are appended to a separate list. After processing all date strings, the list of valid dates is sorted in ascending order. If there are any invalid date strings, a warning message is printed, displaying those invalid dates. Finally, the function returns the sorted list of valid dates.

Handling invalid date strings

If a date string is invalid or does not match the expected format, decide how to handle it. You can choose to ignore it, raise an exception, or handle it gracefully, based on your application’s requirements.

Here’s an example that throws a ValueError exception if it encounters an invalid date string:

from datetime import datetime

# List of date strings
dates = ['2023-01-15', '2024-02-05', 'January 4, 2015']

try:
    # Sort the dates
    sorted_dates = sorted(dates, key=lambda x: datetime.strptime(x, "%Y-%m-%d"))
    print(sorted_dates)
except ValueError:
    print("ValueError: Invalid date string encountered")

# Output: ValueError: Invalid date string encountered

Sorting a list of datetime objects

You can sort a list of datetime objects using the sorted() function or the sort() method of lists.

Here’s an example:

from datetime import datetime

# list of datetime objects
date_list = [
    datetime(2023, 5, 15),
    datetime(2022, 3, 6),
    datetime(2024, 6, 20),
    datetime(2021, 8, 1)
]

# Sort the list using sorted() function
sorted_date = sorted(date_list)

# Print the sorted list
for date in sorted_date:
    print(date)

Output:

2021-08-01 00:00:00
2022-03-06 00:00:00
2023-05-15 00:00:00
2024-06-20 00:00:00

Using the sort() method

Alternatively, you can use the sort() method to sort a list of datetime objects.

Here’s an example:

from datetime import datetime

# list of datetime objects
date_list = [
    datetime(2023, 5, 15),
    datetime(2022, 3, 6),
    datetime(2024, 6, 20),
    datetime(2021, 8, 1)
]

# Sort the list using sort() method
date_list.sort()

# Print the sorted list
for date in date_list:
    print(date)

Sorting in descending order

You can sort a list of datetime objects in descending order by setting the reverse parameter of the sorted() or sort() to True.

Here’s an example:

from datetime import datetime

# list of datetime objects
date_list = [
    datetime(2023, 5, 15),
    datetime(2022, 3, 6),
    datetime(2024, 6, 20),
    datetime(2021, 8, 1)
]

# Sort the list using sorted() function
sorted_date = sorted(date_list, reverse=True)

# Print the sorted list
for date in sorted_date:
    print(date)

Output:

2024-06-20 00:00:00
2023-05-15 00:00:00
2022-03-06 00:00:00
2021-08-01 00:00:00

Similarly, for the sort() method, you can use the following code:

date_list.sort(reverse=True)

Conclusion

In this guide, we explored various techniques for sorting dates in Python. We covered methods for handling both date strings and datetime objects.

Use the sorted() function if you want a new sorted list instead of modifying the original list.

Use the sort() method if performance is a priority. Do keep in mind, that this method modifies the original list.

Keep in mind that errors may occur while trying to sort a list of dates and be prepared to handle them.

By understanding these techniques and considerations, you can effectively sort and manage date data in your Python programs.