In this tutorial, we will look at how to fix the ParseError: year 0 is out of range 0000-00-00
error when using the pandas.to_datetime()
function with the help of an example.
Why does this occur when using pandas.to_datetime()
?
We use the pandas.to_datetime()
function to convert a value or column to datetime type. The “pandas ParserError: year 0 is out of range: 0000-00-00” error occurs when trying to parse an invalid date using the pandas.to_datetime()
function.
Let’s reproduce this error.
import pandas as pd # create a dataframe df = pd.DataFrame({ "Name": ["John", "Akbar", "Steve", "Emma", "Rohan"], "Gender": ["Male", "Male", "Male", "Female", "Male"], "Date Of Birth": ["0000-00-00", "1997-12-35", "2002-01-13", "1890-01-24", "1971-12-25"] }) # display the dataframe df
Output:
Here, we created a dataframe with the columns “Name”, “Gender”, and “Date Of Birth”. Notice that the “Date Of Birth” column contains some dates that are logically incorrect – “0000-00-00”, this date has a logically incorrect value for the month and the day, the date “1997-12-35” has an incorrect date value (a date in December can only be from 1 to 31).
Let’s check the data type of the columns in the above dataframe.
# get information about the dataframe's columns df.info()
Output:
<class 'pandas.core.frame.DataFrame'> RangeIndex: 5 entries, 0 to 4 Data columns (total 3 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 Name 5 non-null object 1 Gender 5 non-null object 2 Date Of Birth 5 non-null object dtypes: object(3) memory usage: 248.0+ bytes
Now, let’s try to convert the “Date of Birth” column to datetime using the pandas.to_datetime()
function.
Introductory ⭐
- Harvard University Data Science: Learn R Basics for Data Science
- Standford University Data Science: Introduction to Machine Learning
- UC Davis Data Science: Learn SQL Basics for Data Science
- IBM Data Science: Professional Certificate in Data Science
- IBM Data Analysis: Professional Certificate in Data Analytics
- Google Data Analysis: Professional Certificate in Data Analytics
- IBM Data Science: Professional Certificate in Python Data Science
- IBM Data Engineering Fundamentals: Python Basics for Data Science
Intermediate ⭐⭐⭐
- Harvard University Learning Python for Data Science: Introduction to Data Science with Python
- Harvard University Computer Science Courses: Using Python for Research
- IBM Python Data Science: Visualizing Data with Python
- DeepLearning.AI Data Science and Machine Learning: Deep Learning Specialization
Advanced ⭐⭐⭐⭐⭐
- UC San Diego Data Science: Python for Data Science
- UC San Diego Data Science: Probability and Statistics in Data Science using Python
- Google Data Analysis: Professional Certificate in Advanced Data Analytics
- MIT Statistics and Data Science: Machine Learning with Python - from Linear Models to Deep Learning
- MIT Statistics and Data Science: MicroMasters® Program in Statistics and Data Science
🔎 Find Data Science Programs 👨💻 111,889 already enrolled
Disclaimer: Data Science Parichay is reader supported. When you purchase a course through a link on this site, we may earn a small commission at no additional cost to you. Earned commissions help support this website and its team of writers.
# convert column to datetime df["Date Of Birth"] = pd.to_datetime(df["Date Of Birth"]) # display the dataframe df
Output:
--------------------------------------------------------------------------- ValueError Traceback (most recent call last) File ~/miniforge3/envs/dsp/lib/python3.8/site-packages/dateutil/parser/_parser.py:649, in parser.parse(self, timestr, default, ignoretz, tzinfos, **kwargs) 648 try: --> 649 ret = self._build_naive(res, default) 650 except ValueError as e: File ~/miniforge3/envs/dsp/lib/python3.8/site-packages/dateutil/parser/_parser.py:1235, in parser._build_naive(self, res, default) 1233 repl['day'] = monthrange(cyear, cmonth)[1] -> 1235 naive = default.replace(**repl) 1237 if res.weekday is not None and not res.day: ValueError: year 0 is out of range The above exception was the direct cause of the following exception: ParserError Traceback (most recent call last) File ~/miniforge3/envs/dsp/lib/python3.8/site-packages/pandas/_libs/tslib.pyx:534, in pandas._libs.tslib.array_to_datetime() File ~/miniforge3/envs/dsp/lib/python3.8/site-packages/pandas/_libs/tslibs/parsing.pyx:257, in pandas._libs.tslibs.parsing.parse_datetime_string() File ~/miniforge3/envs/dsp/lib/python3.8/site-packages/dateutil/parser/_parser.py:1368, in parse(timestr, parserinfo, **kwargs) 1367 else: -> 1368 return DEFAULTPARSER.parse(timestr, **kwargs) File ~/miniforge3/envs/dsp/lib/python3.8/site-packages/dateutil/parser/_parser.py:651, in parser.parse(self, timestr, default, ignoretz, tzinfos, **kwargs) 650 except ValueError as e: --> 651 six.raise_from(ParserError(str(e) + ": %s", timestr), e) 653 if not ignoretz: File <string>:3, in raise_from(value, from_value) ParserError: year 0 is out of range: 0000-00-00 During handling of the above exception, another exception occurred: TypeError Traceback (most recent call last) File ~/miniforge3/envs/dsp/lib/python3.8/site-packages/pandas/_libs/tslib.pyx:545, in pandas._libs.tslib.array_to_datetime() TypeError: invalid string coercion to datetime During handling of the above exception, another exception occurred: ValueError Traceback (most recent call last) File ~/miniforge3/envs/dsp/lib/python3.8/site-packages/dateutil/parser/_parser.py:649, in parser.parse(self, timestr, default, ignoretz, tzinfos, **kwargs) 648 try: --> 649 ret = self._build_naive(res, default) 650 except ValueError as e: File ~/miniforge3/envs/dsp/lib/python3.8/site-packages/dateutil/parser/_parser.py:1235, in parser._build_naive(self, res, default) 1233 repl['day'] = monthrange(cyear, cmonth)[1] -> 1235 naive = default.replace(**repl) 1237 if res.weekday is not None and not res.day: ValueError: year 0 is out of range The above exception was the direct cause of the following exception: ParserError Traceback (most recent call last) Cell In[55], line 2 1 # convert column to datetime ----> 2 df["Date Of Birth"] = pd.to_datetime(df["Date Of Birth"]) 3 # display the dataframe 4 df ... ParserError: year 0 is out of range: 0000-00-00
We get the ParserError: year 0 is out of range: 0000-00-00
The PareseError
here comes from the date “0000-00-00”. We cannot have a date with the year 0 in Pandas (although it’s logically correct year value).
What if we change the year to a valid value but keep the month and the day values as invalid for the date “0000-00-00” and then try to convert the column to datetime using the pandas.to_datetime()
function?
# create a dataframe df = pd.DataFrame({ "Name": ["John", "Akbar", "Steve", "Emma", "Rohan"], "Gender": ["Male", "Male", "Male", "Female", "Male"], "Date Of Birth": ["0001-00-00", "1997-12-35", "2002-01-13", "1890-01-24", "1971-12-25"] }) # convert column to datetime df["Date Of Birth"] = pd.to_datetime(df["Date Of Birth"]) # display the dataframe df
Output:
--------------------------------------------------------------------------- ValueError Traceback (most recent call last) File ~/miniforge3/envs/dsp/lib/python3.8/site-packages/dateutil/parser/_parser.py:649, in parser.parse(self, timestr, default, ignoretz, tzinfos, **kwargs) 648 try: --> 649 ret = self._build_naive(res, default) 650 except ValueError as e: File ~/miniforge3/envs/dsp/lib/python3.8/site-packages/dateutil/parser/_parser.py:1235, in parser._build_naive(self, res, default) 1233 repl['day'] = monthrange(cyear, cmonth)[1] -> 1235 naive = default.replace(**repl) 1237 if res.weekday is not None and not res.day: ValueError: month must be in 1..12 The above exception was the direct cause of the following exception: ParserError Traceback (most recent call last) File ~/miniforge3/envs/dsp/lib/python3.8/site-packages/pandas/_libs/tslib.pyx:534, in pandas._libs.tslib.array_to_datetime() File ~/miniforge3/envs/dsp/lib/python3.8/site-packages/pandas/_libs/tslibs/parsing.pyx:257, in pandas._libs.tslibs.parsing.parse_datetime_string() File ~/miniforge3/envs/dsp/lib/python3.8/site-packages/dateutil/parser/_parser.py:1368, in parse(timestr, parserinfo, **kwargs) 1367 else: -> 1368 return DEFAULTPARSER.parse(timestr, **kwargs) File ~/miniforge3/envs/dsp/lib/python3.8/site-packages/dateutil/parser/_parser.py:651, in parser.parse(self, timestr, default, ignoretz, tzinfos, **kwargs) 650 except ValueError as e: --> 651 six.raise_from(ParserError(str(e) + ": %s", timestr), e) 653 if not ignoretz: File <string>:3, in raise_from(value, from_value) ParserError: month must be in 1..12: 0001-00-00 During handling of the above exception, another exception occurred: TypeError Traceback (most recent call last) File ~/miniforge3/envs/dsp/lib/python3.8/site-packages/pandas/_libs/tslib.pyx:545, in pandas._libs.tslib.array_to_datetime() TypeError: invalid string coercion to datetime During handling of the above exception, another exception occurred: ValueError Traceback (most recent call last) File ~/miniforge3/envs/dsp/lib/python3.8/site-packages/dateutil/parser/_parser.py:649, in parser.parse(self, timestr, default, ignoretz, tzinfos, **kwargs) 648 try: --> 649 ret = self._build_naive(res, default) 650 except ValueError as e: File ~/miniforge3/envs/dsp/lib/python3.8/site-packages/dateutil/parser/_parser.py:1235, in parser._build_naive(self, res, default) 1233 repl['day'] = monthrange(cyear, cmonth)[1] -> 1235 naive = default.replace(**repl) 1237 if res.weekday is not None and not res.day: ValueError: month must be in 1..12 The above exception was the direct cause of the following exception: ParserError Traceback (most recent call last) Cell In[56], line 9 2 df = pd.DataFrame({ 3 "Name": ["John", "Akbar", "Steve", "Emma", "Rohan"], 4 "Gender": ["Male", "Male", "Male", "Female", "Male"], 5 "Date Of Birth": ["0001-00-00", "1997-12-35", "2002-01-13", "1890-01-24", "1971-12-25"] 6 }) 8 # convert column to datetime ----> 9 df["Date Of Birth"] = pd.to_datetime(df["Date Of Birth"]) 10 # display the dataframe 11 df ... ParserError: month must be in 1..12: 0001-00-00
We again get a ParseError
but notice that the error message here is different, “month must be in 1..12: 0001-00-00”, we get an error because the month value is not in the range of 1 to 12 making it an invalid date.
We would get a similar error for the date “1997-12-35” which has an invalid date.
How to fix ParserError: year 0 is out of range: 0000-00-00
in the pandas.to_datetime()
function?
One way to fix the above errors is to set the errors
parameter to 'coerce'
when using the pandas.to_datetime()
function. This will convert invalid dates to NaT
(Not a Time) values instead of raising an error.
Let’s recreate the original dataframe.
# create the original dataframe df = pd.DataFrame({ "Name": ["John", "Akbar", "Steve", "Emma", "Rohan"], "Gender": ["Male", "Male", "Male", "Female", "Male"], "Date Of Birth": ["0000-00-00", "1997-12-35", "2002-01-13", "1890-01-24", "1971-12-25"] }) # display the dataframe df
Output:
Let’s now use the pandas.to_datetime()
function with the errors='coerce'
parameter.
# convert column to datetime df["Date Of Birth"] = pd.to_datetime(df["Date Of Birth"], errors="coerce") # display the dataframe df
Output:
Here, we didn’t get an error. Notice that all the dates in the dataframe that were invalid have been replaced with NaT
(which represents “Not a Time”, it’s like the NaN
equivalent for timestamp data).
Additionally note that the data type resulting from the pandas.to_datetime()
function can only handle values inside a given range. If you try to parse date values outside this range, you’ll get a ParseError
if you do not use the errors='coerce'
argument (in which case it will replace such dates with NaT
). See this tutorial for more details.
You might also be interested in –
- Check if a DataFrame column is of datetime dtype in Pandas
- Pandas – Get only date from datetime
- Pandas – Convert String Column to datetime
Subscribe to our newsletter for more informative guides and tutorials.
We do not spam and you can opt out any time.