Skip to content

Python Pandas: How to Convert String to Datetime in Pandas

Learn how to convert date strings to datetime objects in Pandas using pd.to_datetime(), handle invalid dates with errors='coerce', and optimize parsing with explicit format strings for time-series analysis.

Date and time values stored as plain strings are one of the most common data quality issues in real-world datasets. While strings like "2023-01-15" look like dates to a human reader, Pandas treats them as generic text, which means you cannot filter by date ranges, extract months or weekdays, or perform date arithmetic. Converting these strings to proper datetime64 objects unlocks the full power of Pandas' time-series functionality.

In this guide, you will learn how to convert date strings to datetime objects, handle invalid dates gracefully, improve parsing performance with explicit format strings, and extract useful date components after conversion.

Basic Conversion with pd.to_datetime()

The pd.to_datetime() function is the standard tool for converting date strings. It automatically recognizes many common date formats:

import pandas as pd

df = pd.DataFrame({
    'Date_Str': ['2023-01-15', '2023-05-20', '2024-01-01']
})

df['Date'] = pd.to_datetime(df['Date_Str'])

print(df.dtypes)

Output:

Date_Str            object
Date        datetime64[ns]
dtype: object

The Date_Str column remains as object (string), while the new Date column is stored as datetime64[ns], enabling all date-related operations.

Automatic Format Detection

Pandas can parse a wide variety of date formats without you specifying the exact pattern:

import pandas as pd

dates = pd.Series([
    '2023-01-15',
    '01/15/2023',
    'January 15, 2023',
    '15-Jan-2023'
])

print(pd.to_datetime(dates, format="mixed"))

Output:

0   2023-01-15
1   2023-01-15
2   2023-01-15
3   2023-01-15
dtype: datetime64[ns]

All four formats are correctly interpreted as the same date. This automatic detection is convenient for quick exploration, but specifying the format explicitly is recommended for production code, as covered below.

Handling Invalid and Messy Data

Real-world datasets frequently contain entries like "Unknown", "N/A", or other non-date strings mixed in with valid dates. By default, pd.to_datetime() raises an error on invalid input, but the errors parameter gives you control over this behavior:

import pandas as pd

df = pd.DataFrame({
    'Raw': ['2023-01-15', 'Invalid', '2023-05-20', 'Unknown']
})

df['Date'] = pd.to_datetime(df['Raw'], errors='coerce')

print(df)

Output:

          Raw       Date
0  2023-01-15 2023-01-15
1     Invalid        NaT
2  2023-05-20 2023-05-20
3     Unknown        NaT

NaT (Not a Time) is the datetime equivalent of NaN. It integrates seamlessly with Pandas operations like .dropna() and .fillna().

Error Handling Options

Value Behavior
'raise' (default) Raises an exception on any invalid value
'coerce' Converts invalid values to NaT
'ignore' Returns the original input unchanged

Specifying Format for Better Performance

When you know the exact format of your date strings, providing a format parameter dramatically improves parsing speed. Automatic format detection examines each value individually, while an explicit format string allows Pandas to use an optimized parsing path:

import pandas as pd

df = pd.DataFrame({
    'Date_Str': ['2023-01-15', '2023-05-20', '2024-01-01']
})

df['Date'] = pd.to_datetime(df['Date_Str'], format='%Y-%m-%d')

print(df)

Output:

     Date_Str       Date
0  2023-01-15 2023-01-15
1  2023-05-20 2023-05-20
2  2024-01-01 2024-01-01

Common Format Codes

Code Meaning Example
%Y 4-digit year 2024
%y 2-digit year 24
%m Month (01-12) 05
%d Day (01-31) 15
%H Hour (00-23) 14
%M Minute (00-59) 30
%S Second (00-59) 45
%B Full month name January
%b Abbreviated month Jan
%A Full weekday Monday

Format String Examples

import pandas as pd

pd.to_datetime('15/01/2023', format='%d/%m/%Y')

pd.to_datetime('Jan 15, 2023', format='%b %d, %Y')

pd.to_datetime('2023-01-15 14:30:00', format='%Y-%m-%d %H:%M:%S')

pd.to_datetime('20230115', format='%Y%m%d')

Parsing Dates During CSV Import

Instead of converting dates after loading, you can parse them at read time by passing column names to the parse_dates parameter:

import pandas as pd

df = pd.read_csv('data.csv', parse_dates=['Date'])

df = pd.read_csv(
    'data.csv',
    parse_dates=['Date'],
    date_format='%Y-%m-%d'
)

This approach is cleaner because the dates are in the correct type from the moment the DataFrame is created, eliminating a separate conversion step.

Extracting Date Components

Once a column is converted to datetime64, the .dt accessor provides access to individual date and time components:

import pandas as pd

df = pd.DataFrame({
    'Date': pd.to_datetime(['2023-01-15', '2023-05-20', '2024-01-01'])
})

df['Year'] = df['Date'].dt.year
df['Month'] = df['Date'].dt.month
df['Day'] = df['Date'].dt.day
df['Weekday'] = df['Date'].dt.day_name()
df['Quarter'] = df['Date'].dt.quarter

print(df)

Output:

        Date  Year  Month  Day   Weekday  Quarter
0 2023-01-15  2023      1   15    Sunday        1
1 2023-05-20  2023      5   20  Saturday        2
2 2024-01-01  2024      1    1    Monday        1

These extracted components are useful for grouping, filtering, and creating time-based features for analysis.

Formatting Datetime for Display

To convert datetime objects back into formatted strings for display or export, use the .dt.strftime() method:

import pandas as pd

df = pd.DataFrame({
    'Date': pd.to_datetime(['2023-01-15', '2023-05-20'])
})

df['EU_Format'] = df['Date'].dt.strftime('%d/%m/%Y')
df['US_Format'] = df['Date'].dt.strftime('%m-%d-%Y')
df['Full'] = df['Date'].dt.strftime('%B %d, %Y')

print(df)

Output:

        Date   EU_Format   US_Format              Full
0 2023-01-15  15/01/2023  01-15-2023  January 15, 2023
1 2023-05-20  20/05/2023  05-20-2023      May 20, 2023

Quick Reference

Goal Method
Auto-convert pd.to_datetime(col)
Handle invalid dates pd.to_datetime(col, errors='coerce')
Specify exact format pd.to_datetime(col, format='%Y-%m-%d')
Parse during CSV read pd.read_csv(file, parse_dates=['col'])
Extract year col.dt.year
Extract month name col.dt.month_name()
Extract day of week col.dt.day_name()
Format for display col.dt.strftime('%d/%m/%Y')
  • Use pd.to_datetime() for robust string-to-datetime conversion.
  • Add errors='coerce' to handle messy real-world data without crashing your pipeline.
  • Specify the format parameter for significantly faster parsing on large datasets.
  • Access date components through the .dt accessor, and convert back to formatted strings with .dt.strftime() only at the final display or export step.
Navigation