The error message:
ValueError: invalid date format
occurs when you try to parse a date string that doesn’t match the expected format using libraries like datetime
or pandas
.
1. Causes and Solutions
Cause 1: Mismatched Date Format in datetime.strptime()
Python’s strptime()
function expects a specific format, and if the input date doesn’t match, it raises this error.
Incorrect Code:
from datetime import datetime
date_str = "2024-03-12" # YYYY-MM-DD format
date_obj = datetime.strptime(date_str, "%d-%m-%Y") # Expecting DD-MM-YYYY
Solution: Match the format string with the actual date format.
date_obj = datetime.strptime(date_str, "%Y-%m-%d") # Correct
print(date_obj) # Output: 2024-03-12 00:00:00
Cause 2: Incorrect Format in pandas.to_datetime()
If a date format is inconsistent or missing, pandas.to_datetime()
might fail.
Incorrect Code:
import pandas as pd
df = pd.DataFrame({"date": ["12-03-2024", "31-04-2024"]}) # 31st April is invalid
df["date"] = pd.to_datetime(df["date"], format="%Y-%m-%d") # Expecting YYYY-MM-DD
Solution: Use the correct format or set errors='coerce'
to handle invalid values.
df["date"] = pd.to_datetime(df["date"], format="%d-%m-%Y", errors="coerce")
print(df) # Invalid dates become NaT (Not a Time)
Cause 3: Invalid Date Values (Nonexistent Dates)
Some dates, like February 30 or April 31, do not exist.
Incorrect Code:
date_obj = datetime.strptime("2024-02-30", "%Y-%m-%d") # Feb 30 is invalid
Solution: Validate the date before parsing.
from dateutil import parser
try:
date_obj = parser.parse("2024-02-30") # Automatically detects invalid dates
except ValueError as e:
print("Invalid date:", e)
Cause 4: Timezone Issues in datetime
or pytz
If a date string includes a timezone offset but is not correctly parsed, the error occurs.
Incorrect Code:
date_str = "2024-03-12T15:30:00+05:30" # Includes timezone offset
date_obj = datetime.strptime(date_str, "%Y-%m-%dT%H:%M:%S") # Missing timezone handling
Solution: Use dateutil.parser.parse()
, which handles timezones.
from dateutil import parser
date_obj = parser.parse(date_str) # Automatically detects timezones
print(date_obj)