Python parser for human readable dates
Key Features
Support for almost every existing date format: absolute dates, relative dates ("two weeks ago" or "tomorrow"), timestamps, etc.
Support for more than 200 language locales.
Language autodetection
Customizable behavior through settings.
Support for non-Gregorian calendar systems.
Support for dates with timezones abbreviations or UTC offsets ("August 14, 2015 EST", "21 July 2013 10:15 pm +0500"…)
Search dates in longer texts.
Time span detection for expressions like “past month”, “last week”.
Online demo
Do you want to try it out without installing any dependency? Now you can test it quickly by visiting this online demo!
How To Use
The most straightforward way to parse dates with dateparser is to use the dateparser.parse() function, that wraps around most of the functionality of the module.
>>> import dateparser
>>> dateparser.parse('Fri, 12 Dec 2014 10:55:50')
datetime.datetime(2014, 12, 12, 10, 55, 50)
>>> dateparser.parse('1991-05-17')
datetime.datetime(1991, 5, 17, 0, 0)
>>> dateparser.parse('In two months') # today is 1st Aug 2020
datetime.datetime(2020, 10, 1, 11, 12, 27, 764201)
>>> dateparser.parse('1484823450') # timestamp
datetime.datetime(2017, 1, 19, 10, 57, 30)
>>> dateparser.parse('January 12, 2012 10:00 PM EST')
datetime.datetime(2012, 1, 12, 22, 0, tzinfo=<StaticTzInfo 'EST'>)
dateparser also works with strings in different languages:
>>> dateparser.parse('Martes 21 de Octubre de 2014') # Spanish (Tuesday 21 October 2014)
datetime.datetime(2014, 10, 21, 0, 0)
>>> dateparser.parse('Le 11 Décembre 2014 à 09:00') # French (11 December 2014 at 09:00)
datetime.datetime(2014, 12, 11, 9, 0)
>>> dateparser.parse('13 января 2015 г. в 13:34') # Russian (13 January 2015 at 13:34)
datetime.datetime(2015, 1, 13, 13, 34)
>>> dateparser.parse('1 เดือนตุลาคม 2005, 1:00 AM') # Thai (1 October 2005, 1:00 AM)
datetime.datetime(2005, 10, 1, 1, 0)
>>> dateparser.parse('yaklaşık 23 saat önce') # Turkish (23 hours ago), current time: 12:46
datetime.datetime(2019, 9, 7, 13, 46)
>>> dateparser.parse('2小时前') # Chinese (2 hours ago), current time: 22:30
datetime.datetime(2018, 5, 31, 20, 30)
You can specify the language(s), if known, using the languages argument. In this case, given languages are used and language detection is skipped:
>>> dateparser.parse('2015, Ago 15, 1:08 pm', languages=['pt', 'es'])
datetime.datetime(2015, 8, 15, 13, 8)
If you know the possible formats of the dates, you can use the date_formats argument:
>>> dateparser.parse('22 Décembre 2010', date_formats=['%d %B %Y'])
datetime.datetime(2010, 12, 22, 0, 0)
The formats are tried first. A date string that none of them parses is then parsed as if no formats were given, so a number that is out of range for a format can be read as another part of the date (32 is not a day, but it is a valid two-digit year). To accept only the given formats, set PARSERS to ['custom-formats'], which also turns off timestamps, relative dates and free-form dates:
>>> dateparser.parse('32 DEC 10', date_formats=['%d %b %y'])
datetime.datetime(2032, 12, 10, 0, 0)
>>> dateparser.parse('32 DEC 10', date_formats=['%d %b %y'], settings={'PARSERS': ['custom-formats']})
None
Relative Dates
>>> from dateparser import parse
>>> parse('1 hour ago')
datetime.datetime(2015, 5, 31, 23, 0)
>>> parse('Il ya 2 heures') # French (2 hours ago)
datetime.datetime(2015, 5, 31, 22, 0)
>>> parse('1 anno 2 mesi') # Italian (1 year 2 months)
datetime.datetime(2014, 4, 1, 0, 0)
>>> parse('yaklaşık 23 saat önce') # Turkish (23 hours ago)
datetime.datetime(2015, 5, 31, 1, 0)
>>> parse('Hace una semana') # Spanish (a week ago)
datetime.datetime(2015, 5, 25, 0, 0)
>>> parse('2小时前') # Chinese (2 hours ago)
datetime.datetime(2015, 5, 31, 22, 0)
>>> parse('next Wednesday')
datetime.datetime(2015, 6, 3, 0, 0)
In English, last, this and next before a weekday mean its closest occurrence before, on or after, and after the current date, respectively, regardless of the PREFER_DATES_FROM setting. So this Wednesday and next Wednesday are the same date except on a Wednesday. They do not apply to wed, sat and sun, which are also common English words.
Date Order
>>> # parsing ambiguous date
>>> parse('02-03-2016') # assumes english language, uses MDY date order
datetime.datetime(2016, 2, 3, 0, 0)
>>> parse('le 02-03-2016') # detects french, uses DMY date order
datetime.datetime(2016, 3, 2, 0, 0)
For more on date order, see the settings documentation.
Timezone and UTC Offset
By default, dateparser returns a timezone-aware datetime if a timezone is present in the date string. Otherwise it returns a naive datetime object.
>>> parse('January 12, 2012 10:00 PM EST')
datetime.datetime(2012, 1, 12, 22, 0, tzinfo=<StaticTzInfo 'EST'>)
>>> parse('January 12, 2012 10:00 PM -0500')
datetime.datetime(2012, 1, 12, 22, 0, tzinfo=<StaticTzInfo 'UTC\-05:00'>)
>>> parse('2 hours ago EST')
datetime.datetime(2017, 3, 10, 15, 55, 39, 579667, tzinfo=<StaticTzInfo 'EST'>)
If the date has no timezone name/abbreviation or offset, you can specify it using the TIMEZONE setting:
>>> parse('January 12, 2012 10:00 PM', settings={'TIMEZONE': 'US/Eastern'})
datetime.datetime(2012, 1, 12, 22, 0)
>>> parse('January 12, 2012 10:00 PM', settings={'TIMEZONE': 'US/Eastern', 'RETURN_AS_TIMEZONE_AWARE': True})
datetime.datetime(2012, 1, 12, 22, 0, tzinfo=<DstTzInfo 'US/Eastern' EST-1 day, 19:00:00 STD>)
>>> parse('10:00 am', settings={'TIMEZONE': 'EST', 'TO_TIMEZONE': 'EDT'})
datetime.datetime(2016, 9, 25, 11, 0)
>>> parse('10:00 am EST', settings={'TO_TIMEZONE': 'EDT'})
datetime.datetime(2017, 3, 12, 11, 0, tzinfo=<StaticTzInfo 'EDT'>)
For more on timezones, see the settings documentation.
Incomplete Dates
>>> from dateparser import parse
>>> parse('December 2015') # default behavior
datetime.datetime(2015, 12, 16, 0, 0)
>>> parse('December 2015', settings={'PREFER_DAY_OF_MONTH': 'last'})
datetime.datetime(2015, 12, 31, 0, 0)
>>> parse('December 2015', settings={'PREFER_DAY_OF_MONTH': 'first'})
datetime.datetime(2015, 12, 1, 0, 0)
>>> parse('March')
datetime.datetime(2015, 3, 16, 0, 0)
>>> parse('March', settings={'PREFER_DATES_FROM': 'future'})
datetime.datetime(2016, 3, 16, 0, 0)
>>> import dateparser
>>> dateparser.parse("2015") # default behavior
datetime.datetime(2015, 3, 27, 0, 0)
>>> dateparser.parse("2015", settings={"PREFER_MONTH_OF_YEAR": "last"})
datetime.datetime(2015, 12, 27, 0, 0)
>>> dateparser.parse("2015", settings={"PREFER_MONTH_OF_YEAR": "current"})
datetime.datetime(2015, 3, 27, 0, 0)
You can also ignore incomplete dates by setting the STRICT_PARSING flag:
>>> parse('December 2015', settings={'STRICT_PARSING': True})
None
For more on handling incomplete dates, see the settings documentation.
Search for Dates in Longer Chunks of Text
You can extract dates from longer strings of text. Results are returned as a list of (substring, datetime) tuples:
>>> from dateparser.search import search_dates
>>> search_dates('Today is 25 of October 2017, so the 27th is in 2 days.')
[('25 of October 2017', datetime.datetime(2017, 10, 25, 0, 0)), ('the 27th is in 2 days', datetime.datetime(2017, 10, 27, 0, 0))]
Pass languages when you know them: language detection is slow and error-prone on short text. If no date is found, None is returned:
>>> search_dates('Lancé le 4 octobre 1957.', languages=['fr'])
[('le 4 octobre 1957', datetime.datetime(1957, 10, 4, 0, 0))]
>>> search_dates('Rien à voir.', languages=['fr'])
None
See the API reference for other parameters, such as strategy.
Time Span Detection
The search_dates function can also detect time spans such as “past month” or “last week”. When RETURN_TIME_SPAN is enabled it returns start and end dates for the detected period.
For example, assuming the current date and time is December 7, 2024, 15:30:
>>> search_dates("Messages from the past month", settings={'RETURN_TIME_SPAN': True})
[('past month (start)', datetime.datetime(2024, 11, 7, 15, 30)),
('past month (end)', datetime.datetime(2024, 12, 7, 15, 30))]
Settings
You can control multiple behaviors by using the settings parameter:
>>> dateparser.parse('2014-10-12', settings={'DATE_ORDER': 'YMD'})
datetime.datetime(2014, 10, 12, 0, 0)
>>> dateparser.parse('2014-10-12', settings={'DATE_ORDER': 'YDM'})
datetime.datetime(2014, 12, 10, 0, 0)
>>> dateparser.parse('1 year', settings={'PREFER_DATES_FROM': 'future'}) # Today is 2020-09-23
datetime.datetime(2021, 9, 23, 0, 0)
>>> dateparser.parse('tomorrow', settings={'RELATIVE_BASE': datetime.datetime(1992, 1, 1)})
datetime.datetime(1992, 1, 2, 0, 0)
To see all available settings, check the settings documentation.
False positives
dateparser will do its best to return a date, dealing with multiple formats and different locales. For that reason it is important that the input is a valid date, otherwise it could return false positives.
To reduce the possibility of receiving false positives, make sure that:
The input string is a valid date and doesn’t contain any other words or numbers.
If you know the language or languages beforehand, you add them through the languages or locales properties.
On the other hand, if you want to exclude any of the default parsers (timestamp, relative-time…) or change the order in which they are executed, you can do so through the settings PARSERS.
Installation
Dateparser supports Python 3.10+. You can install it by doing:
$ pip install dateparser
If you want to use a non-Gregorian calendar, you need to install the calendars extra:
$ pip install dateparser[calendars]
Supported Calendars
Apart from the Gregorian calendar, dateparser supports the Persian Jalali calendar, the Hijri/Islamic calendar, the French Republican calendar and the Minguo calendar. To use the first three, install the calendars extra (see Installation).
Example using the Persian Jalali calendar:
>>> from dateparser.calendars.jalali import JalaliCalendar
>>> JalaliCalendar('جمعه سی ام اسفند ۱۳۸۷').get_date()
DateData(date_obj=datetime.datetime(2009, 3, 20, 0, 0), period='day', locale=None, parts=('year', 'month', 'day'))
Example using the Hijri/Islamic calendar:
>>> from dateparser.calendars.hijri import HijriCalendar
>>> HijriCalendar('17-01-1437 هـ 08:30 مساءً').get_date()
DateData(date_obj=datetime.datetime(2015, 10, 30, 20, 30), period='day', locale=None, parts=('year', 'month', 'day', 'time'))
Example using the French Republican calendar:
>>> from dateparser.calendars.french_republican import FrenchRepublicanCalendar
>>> FrenchRepublicanCalendar('18 brumaire an VIII').get_date()
DateData(date_obj=datetime.datetime(1799, 11, 9, 0, 0), period='day', locale=None)
Example using the Minguo calendar:
>>> from dateparser.calendars.minguo import MinguoCalendar
>>> MinguoCalendar('民國101年5月25日 08:36').get_date()
DateData(date_obj=datetime.datetime(2012, 5, 25, 8, 36), period='day', locale=None)
Dependencies
dateparser relies on the following libraries:
dateutil’s module relativedelta for its freshness parser.
convertdate to convert Jalali and French Republican dates to Gregorian.
hijridate to convert Hijri dates to Gregorian.
tzlocal to reliably get local timezone.
ruamel.yaml (optional) for operations on language files.
Common use cases
dateparser can be used for a wide variety of purposes, but it stands out when it comes to:
Consuming data from different sources:
Scraping: extract dates from different places with several different formats and languages
IoT: consuming data coming from different sources with different date formats
Tooling: consuming dates from different logs / sources
Format transformations: when transforming dates coming from different files (PDF, CSV, etc.) to other formats (database, etc).
Offering natural interaction with users:
Tooling and CLI: allow users to write “3 days ago” to retrieve information.
Search engine: allow people to search by date in an easy / natural format.
Bots: allow users to interact with a bot easily
You may also like…
price-parser - A small library for extracting price and currency from raw text strings.
number-parser - Library to convert numbers written in the natural language to it’s equivalent numeric forms.
Scrapy - Web crawling and web scraping framework
License
History
1.5.0 (2026-11-04)
Breaking changes:
DateData.period can take the new values "quarter" and "part_of_day", and with RETURN_TIME_AS_PERIOD enabled a relative date with hours, minutes or seconds, such as “2 hours ago”, now has the "time" period instead of "day" (#1417, #1437, #1473)
Stop caching and sharing Settings instances: creating one with the same settings twice now gives two different objects, and the Settings.registry_key attribute no longer exists (#1442)
Remove the leftovers of fastText support from dateparser_cli: the fasttext_manager and exceptions modules and utils.create_data_model_home(); utils.dateparser_model_home and utils.DEFAULT_WINDOWS_CACHE_DIR are now pathlib.Path objects (#1406)
Remove Locale.to_parserinfo() and HijriDate.weekday(), which always raised an exception (#1406, #1457)
Deprecations:
Deprecate dateparser.timezone_parser.convert_to_local_tz() (#1481) and dateparser.timezone_parser.build_tz_offsets() (#1405)
Emit a FutureWarning naming the TZ value from parse(), DateDataParser and search_dates() when the local timezone cannot be determined; a future version will raise RuntimeError instead of failing to parse the date (#1403, #1556)
Deprecate dateparser.utils.registry() and Settings.get_key(), which now emit a FutureWarning (#1442, #1556)
Deprecate get_week_start() and get_week_end() in dateparser.utils.time_spans, and calling generate_time_span() without base_date or settings; all of them now emit a FutureWarning (#1393, #1556)
Deprecate dateparser.date.RE_TRIM_COLONS (GHSA-fmxc-97cw-ph6p)
Security fixes:
Make sentence splitting in search_dates() linear on long punctuation runs, to prevent quadratic backtracking (ReDoS) for Arabic, Bengali, Cantonese, Chinese, Hindi, Japanese and Persian (GHSA-rx9v-94ff-9cc2)
Prevent quadratic regex matching (ReDoS) on long digit runs in Cantonese, Chinese and Japanese, and a ValueError on runs of more than 4,300 digits on Python 3.10.7 and later (GHSA-g8fh-jxm9-6qfx)
Bound the lookahead of the Chinese month simplification, to prevent quadratic parsing time on long runs of numbers followed by 月 (GHSA-q7fp-xwcm-6x9f)
Prevent quadratic regex matching (ReDoS) on long runs of digits or whitespace (GHSA-gqj4-wf6c-wmcg)
Strip trailing colons in linear time, to prevent quadratic backtracking (ReDoS) on long colon runs (GHSA-fmxc-97cw-ph6p)
Split strings into known words in linear time, to prevent quadratic parsing time on long runs of words like month names (GHSA-jxmm-w6rw-32ch)
New features:
Add a STRICT_DATE_ORDER setting that turns an explicit DATE_ORDER from a preference into a requirement: "year" reads a two-digit year only from the position DATE_ORDER gives it, and "all" also keeps the day and month where the order puts them (#1443)
Add a TIMEZONE_ABBREVIATIONS setting to override the offset of timezone abbreviations, e.g. to read IST as India Standard Time instead of Israel Standard Time (#1415)
Parse parts of the day, such as “tomorrow morning”, “this evening” or “8 in the evening”, at the times set by the new PARTS_OF_DAY setting; the new DateData.part_of_day attribute tells which one was found (#1473, #1562)
Add DateData.parts, which lists the date parts (day, month, year, time…) read from the input rather than filled in from defaults (#1408)
Add an add_period argument to search_dates() to also return the period of each date (#1437)
Add a date_formats argument to search_dates(), to find dates written in the given formats; it requires strategy="ngram" and raises ValueError with the default "split" strategy (#1436)
Add the French Republican calendar and the Minguo (Taiwanese) calendar (#1483, #1489)
Parse calendar quarters, such as “2025Q1”, “2025-Q3” or “Q4 2025”, as a month of that quarter picked by PREFER_MONTH_OF_YEAR (by default, the month as far into the quarter as the current month is into its own) (#1417)
Parse “last”, “this” and “next” before a weekday in English, e.g. “next Friday”, as the closest occurrence of that weekday before, on or after, and after the current date, whatever PREFER_DATES_FROM is, except for the abbreviations “wed”, “sat” and “sun”; search_dates() now includes the word in its matches (#1401)
Parse “the Nth of last/this/next month” as a day of that month (#1414)
Parse Roman numeral years written in capitals, e.g. “5 March MDCCLXXVI”; a short one such as “MMX” is read as a year only next to a month name, e.g. “April MMX” (#1482)
Parse dates with a bare UTC offset, such as “+03” (#1475)
Parse AM/PM written before the time, e.g. “PM 2:26” or “下午 02:26:26” (#1469)
Parse ISO 8601 fractional seconds written with a decimal comma, e.g. “12:30:45,123” (#1467)
Parse English number words from thirteen to ninety-nine, e.g. “forty-five seconds ago” (#1416)
Parse “fortnight” and “century” in English relative dates, and read “a decade from now” as the future instead of the past (#1539)
Match month and weekday names in date_formats in the given languages, so formats with literal text work, e.g. “el %d de %B de %Y” for “el 15 de junio de 2020” with languages=["es"] (#1486, #1552)
When a date does not parse, try the other meanings of ambiguous words, such as Spanish “mar” (martes or marzo) (#1491), and read a token that is both a weekday and a month abbreviation as the weekday when that is what fits (#1476)
In search_dates(), find dates written:
right after a label and a colon in Chinese or Japanese, e.g. “日期:2020年12月28日” (#1407)
next to a relative date without a comma (#1385)
joined by words that search skips, like “and” (#1488)
inside parentheses, square brackets or straight quotes, e.g. 'He said "May 5, 2020"' or “(Friday)” (#1401, #1565)
Fixes:
Take the current date, used to fill in the missing parts of a date such as “12:30” or “Nov” and to apply PREFER_DATES_FROM, from the TIMEZONE setting (the local time zone by default) instead of UTC (#1427)
Keep the %z offset when parsing with date_formats, and return a timezone-aware date for it unless RETURN_AS_TIMEZONE_AWARE is False (#1424)
Read year-first dates, such as “2021-01-13”, as YMD unless DATE_ORDER starts with the year (#1419)
Swap the day and the month when they do not fit an explicit DATE_ORDER, whatever its value, e.g. “01/13/2021” with DMY (#1431)
Read a lone number next to a four-digit year as the month under any DATE_ORDER (#1472)
Apply PREFER_DAY_OF_MONTH before PREFER_DATES_FROM picks the year (#1409), and apply PREFER_DAY_OF_MONTH and PREFER_MONTH_OF_YEAR to relative dates such as “last year” (#1413)
Apply an explicit DATE_ORDER to every date that search_dates() finds, not only to the first one (#1535)
Stop dropping extra numbers when parsing dates: a string with more numbers than a date has, such as “5 10 Jan 2020” or “03/04/2021 5”, now returns None instead of a date built from some of them (#1480)
Stop reading two adjacent numbers of a Russian numeric date as one compound ordinal, so parse("20 03 2021", languages=["ru"]) returns 20 March 2021 instead of the 23rd of the current month (#1554)
Return None for strings with only skipped words, such as “year” or “hour minute”, instead of today, which also stops search_dates() from returning them (#1440, #1564)
Stop ignoring numbers without a unit in relative dates, so “03/06/2020 hour”, “03/06/2020 day” or “01.02.2011 godz. 08:39” no longer parse as a number of hours or days ago (#1410)
Stop reading “Nth day” as a number of days, e.g. “the 1st day of March 2015” (#1412)
Parse “at 22h” and “à 22h” as a time of day, not as hours ago; a bare “à 22h” is still read as English hours ago unless languages=["fr"] is given or the text has other French words, such as “demain à 22h” (#1441)
Keep the future direction of a relative expression that search_dates() finds next to punctuation, e.g. “in 2 hours, thanks” (#1391)
Stop French “sept” being read as 7 when it means September, e.g. “1 sept 2024” with languages=["fr"] and “le 3 sept à 10h” with or without languages; “sept” now means 7 only before a duration unit or a clock time (“sept jours”, “sept heures”, “sept:30”), so a day written as a word, as in “sept mai 2020”, no longer parses, and a bare “sept” is read as September (#1353)
Parse dates with a numeric offset followed by a redundant timezone abbreviation, e.g. “-0500 (CDT)”, or with an abbreviation glued to the time, e.g. “2019-09-28WIB19:17:34” (#1348)
Recognize UTC offsets written with Unicode dash-like characters, such as “−05:00” (#1474)
Keep complete week dates (year, week number and weekday) when parsing with date_formats, including %G ISO week years (#1381)
Fix negative timestamps with subseconds (#1387)
Keep AM when searching for dates after a time (#1400)
Keep full stops between digits in search_dates() sentences (#1471)
Fix search_dates() dropping text next to a standalone accent mark (#1505)
Fix search_dates() raising IndexError for the zh-Hans, zh-Hant and yue locales, including when it detects one of them in the text, e.g. “聽日” (#1401, #1407)
In search_dates(), include the closing bracket in the matched text, e.g. “8 May 2020 (16:05)”, and stop including separators such as “/” or “|” (#1401)
Split a relative date from a numeric date that follows it in search_dates(), e.g. “3 days later on 2010-05-10” (#1430)
Stop growing internal caches with every distinct RELATIVE_BASE value (#1442)
Fix parse() and DateDataParser returning None when region does not match the language of the text, e.g. parse("12 mars 2020", languages=["fr"], region="MX") or parse("5 de marzo de 2020", region="US") (#1423)
Fix dateparser.utils.get_logger() raising AttributeError when logging.config had not been imported (#1457)
Improvements:
Speed up parse() by about 35% (#1544), skip locales that cannot change the outcome of a failed parse (#1390), and speed up import by compiling the timezone regexes lazily (#1405)
Arabic: parse relative dates that use قبل for “ago” (#1397), Egyptian and informal ة→ه spellings (#1493), numbered Levantine month names such as “كانون 2” in the ar-SY, ar-JO, ar-LB, ar-PS and ar-IQ locales only, e.g. locales=["ar-SY"] or region="SY" (#1511), Arabic dates typed with Persian yeh and kaf and Persian dates typed with Arabic ones (#1423), and Arabic month names and Arabic-Indic digits in Hijri dates (#1432)
Chinese: add the supplementary data of zh to zh-Hans and zh-Hant (#1407), and parse 后天, 大后天 and 大前天 as relative days (#1430)
Chinese and Japanese: parse dates with spaces around 年, 月 and 日 (#1477, #1566)
French: parse “midi” as noon, e.g. “demain à midi” (“après-midi” and “avant midi” are still not read as noon); this also applies when no languages are given, so search_dates() can return “MIDI” in an English text as 12:00 (#1536)
Indonesian: add old-style month abbreviations, such as “Djan” or “Peb” (#1501)
Korean: parse absolute dates written with 년, 월, 일, 시 and 분 (#1434)
Slovak: parse “pozajtra” (#1430)
Swedish: parse ordinal day suffixes like “24:e” and “1:a” (#1484)
Thai: parse relative dates with spaced ago/in words (#1411)
Vietnamese: parse dates with zero-padded months (#1338, #1563)
Add type hints (#1457)
Document search_dates() in the API reference (#1468), add a performance section (#1494), explain how DEFAULT_LANGUAGES relates to the languages argument (#1422) and how date_formats falls back to the other parsers (#1549)
Show the whole README on PyPI (#1359)
1.4.3 (2026-09-03)
Fixes:
Make parsing thread-safe: parsing from several threads no longer raises an intermittent KeyError from the shared language caches, and a DATE_ORDER or RELATIVE_BASE value meant for one parse no longer leaks into the settings that other parses read, where it could make them return a wrong date (#1346)
Do not share the language detector and the detected locale between search_dates() calls, so concurrent searches over text in different languages no longer return None or a date read in the wrong locale (#1371)
Resolve the BST and HDT timezone abbreviations to the offsets the tz database gives them, UTC+1 (British Summer Time) and UTC-9 (Hawaii-Aleutian Daylight Time), instead of +11 and -9:30, which no zone goes by those names today; abbreviations that the tz database maps to more than one offset, such as CST and IST, keep their current offset. Text carrying these abbreviations keeps its wall clock but moves by 10 hours for BST and 30 minutes for HDT, which can put the parsed instant on a different day (#1366)
Reject a %j (day of year) value that the parsed year does not have, instead of rolling it over into the next year, so “1999366” with date_formats=["%Y%j"] returns None rather than 2000-01-01. A format with no year directive is checked against the year strptime defaults to, 1900, which is not a leap year, so “366” with date_formats=["%j"] now returns None where it used to return January 1 (#1370)
Cleanups and internal improvements:
Add CodSpeed benchmarks and a workflow that runs them, so a performance regression such as the quadratic backtracking fixed in 1.4.1 is reported on the pull request that introduces it (#1365)
1.4.2 (2026-08-04)
New features:
Add an IGNORE_SURROUNDING_TEXT setting that, when enabled, retries parsing after ignoring the leading and trailing words the language does not recognize, so a date wrapped in extra text such as “Published on 16/04/2019” is parsed (#1356)
Add a strategy argument to search_dates() to choose the search strategy: the default "split" keeps the current behavior, while the new "ngram" strategy parses the longest sequences of tokens as dates for more predictable results on noisy text (#1351)
Fixes:
Do not read a two-digit number as a year once a later component has been found in year-first date orders, so the day in Japanese dates such as “4月20日” is no longer consumed as the year (#1358)
Parse ISO 8601 dates (those starting with a four-digit year) in month-day order even when an explicit day-first language such as it or fr is given, without needing to set PREFER_LOCALE_DATE_ORDER to False (#1352)
Honor PREFER_DATES_FROM and RELATIVE_BASE when parsing with custom date_formats that use a two-digit year (%y) (#1342)
Honor the %j (day of year) directive in date_formats instead of overwriting the parsed month and day with the current date (#1345)
Improvements:
Update the bundled CLDR locale data to 44.1.0, adding many newly recognized date forms across locales and a standalone hour/duration unit (e.g. Catalan “2 hores”), while keeping previously supported forms parseable (#1343)
Add the Italian expressions “un ora fa” and “un’ora fa”, and skip “alle” so phrases like “oggi alle 11:00” parse (#1049)
Expand Czech date translations with month locative/dative forms (e.g. “v lednu 2023”), the July abbreviation “črv”, and relative expressions such as “za týden”, “za měsíc” and “za rok” (#1172)
Specify the README header content as RST rather than raw HTML (#1360)
1.4.1 (2026-06-15)
Breaking changes:
Remove fastText language detection support: the fasttext extra is dropped and detect_languages() now raises ImportError. Migrate to the langdetect extra, which also unblocks numpy 2.x compatibility (#1315)
Security fixes:
Make digit quantifiers possessive in the relative-date regexes to prevent quadratic backtracking (ReDoS) on long digit runs (#1335)
New features:
Add the USE_GIVEN_LANGUAGE_ORDER setting to try languages and locales in the order given rather than by frequency (#789)
Fixes:
Preserve explicit signs on individual components when parsing relative dates that combine decades with years, such as “-1 decade +2 years” (#1330)
Fall back to other provided languages in search_dates when the detected language yields no dates (#1331)
Parse relative date expressions with spaces between the sign and number, such as “now - 2 hours” and “now + 1 day” (#1327)
Use the parser-relative now for the current month when filling in incomplete dates so the month and day stay consistent (#1332)
Fix Norwegian Bokmål (nb) parsing of relative date expressions such as “3 måneder siden” and “om 2 måneder” (#1334)
Parse abbreviated English month expressions such as “1mon ago” and “3mons ago” (#1329)
Preserve surrounding whitespace when removing skip tokens during translation to avoid spurious double spaces (#1324)
Improvements:
Move project metadata and build configuration to pyproject.toml (#1311)
Add alternative Korean date expressions for today, yesterday, tomorrow, and “N months ago/later” (#1289)
Expand Czech date translations with additional inflections, word numbers, decade and century expressions, and clock phrases like “čtvrt na tři” (#1325)
Replace internal OrderedDict usage with the built-in dict (#1328)
1.4.0 (2026-03-26)
Security fixes:
Remove import-time loading of timezone offset data from pickle to prevent unsafe deserialization from packaged data
Replace eval() use when parsing no_word_spacing with strict boolean parsing to prevent code execution from locale metadata (#1056)
New features:
Add support for expressions like “N {interval} from now” in English (#1271)
Add support for the en-US locale (#1222)
Fixes:
Honor REQUIRE_PARTS for ambiguous month-number inputs by retrying with a year-biased DATE_ORDER (#1298)
Fix parsing word-number relative phrases such as “two days later” (#1316)
Allow md5hash to work in FIPS environments (#1267)
Improvements:
Add Bosnian Cyrillic (ijekavica) date translations (#1293)
Add a new browser-based demo to the project documentation (#1306)
Update installation documentation to replace setup.py install guidance (#1310)
Add a project security policy (#1318)
1.3.0 (2026-02-04)
Dropped Python 3.9 support. (#1296)
New features:
search_dates() can now detect time spans from expressions like “past month”, “last week”, etc. For details, see the “Time Span Detection” section and the RETURN_TIME_SPAN, DEFAULT_START_OF_WEEK and DEFAULT_DAYS_IN_MONTH settings in the documentation. (#1284)
Fixes:
Assume the current year if not specified (#1288)
Support expressions like “yesterday +1h” (#1303)
English: Support most 2-letter day-of-the-week names (#1214)
English: Support “in N weeks’ time” (#1283)
Finnish: Support dates with “klo” (#1301)
Russian: Support compound ordinals (#1280)
Cleanups and internal improvements:
Fixed year expectation issues in tests. (#1294)
1.2.2 (2025-06-26)
Fixes:
Handle the Russian preposition “с” (#1261)
Fix weekday search (#1274)
Improvements:
Add Python 3.14 support (#1273)
Cache timezone offsets to improve import time (#1250)
1.2.1 (2025-02-05)
Fixes:
Fix PytzUsageWarning (#1109)
Fix date_parser with prefer_month_of_year wrong results (#1224)
Fix skipped day when UTC and tz are different days (#1183)
Improvements:
Avoid repeated loop over timezones (#1238)
Proofread README.rst (#1234)
Check for derived types for configuration (#1223)
Parse some abbreviated strings as relative dates (#1219)
Migrate from hijri-converter to hijridate (#1211)
Fixed ClusterFuzz build error by adding dateparser.data as a binary (#1208)
Fix an issue detected by OSSFuzz (#1203)
Support two-digit years in non-Gregorian calendars (#1187)
Refactored CI to run extras separately and test minimum versions of dependencies, replaced flake8 with ruff, fixed tests (#1248)
Set minimum versions for dependencies (#1248)
Limited numpy to 1.x when installing dateparser[fasttext] (#1248)
1.2.0 (2023-11-17)
New features:
New PREFER_MONTH_OF_YEAR setting (#1146)
Fixes:
Absolute years in Russian are no longer being treated as a number of years in the past (#1129)
Cleanups and internal improvements:
Removed the use of datetime.utcnow, deprecated on Python 3.12 (#1179)
Applied Black formatting to the code base (#1158)
Initial integration with OSSFuzz (#1198)
Extended test cases (#1191)
1.1.8 (2023-03-22)
Improvements:
Improved date parsing for Chinese (#1148)
Improved date parsing for Czech (#1151)
Reorder language by popularity (#1152)
Fix leak of memory in cache (#1140)
Add support for “d units later” (#1154)
Move modification in CLDR data to yaml (#1153)
Add support to use timezone via settings to get PREFER_DATES_FROM result (#1155)
1.1.7 (2023-02-02)
Improvements:
Add an “ago” synonym for Arabic (#1128)
Improved date parsing for Czech (#1131)
Improved date parsing for Indonesian (#1134)
1.1.6 (2023-01-12)
Improvements:
Fix the bug where Monday is parsed as a month (#1121)
Prevent ReDoS in Spanish sentence splitting regex (#1084)
1.1.5 (2022-12-29)
Improvements:
Parse short versions of day, month, and year (#1103)
Add a test for “in 1d” (#1104)
Update languages_info (#1107)
Add a workaround for zipimporter not having exec_module before Python 3.10 (#1069)
Stabilize tests at midnight (#1111)
Add a test case for French (#1110)
Cleanups:
Remove the requirements-build file (#1113)
1.1.4 (2022-11-21)
Improvements:
Improved support for languages such as Slovak, Indonesian, Hindi, German and Japanese (#1064, #1094, #986, #1071, #1068)
Recursively create a model home (#996)
Replace regex sub with simple string replace (#1095)
Add Python 3.10, 3.11 support (#1096)
Drop support for Python 3.5, 3.6 versions (#1097)
1.1.3 (2022-11-03)
New features:
Add support for fractional units (#876)
Improvements:
Fix the returned datetime skipping a day with time+timezone input and PREFER_DATES_FROM = ‘future’ (#1002)
Fix input translatation breaking keep_formatting (#720)
English: support “till date” (#1005)
English: support “after” and “before” in relative dates (#1008)
Cleanups:
Reorganize internal data (#1090)
CI updates (#1088)
1.1.2 (2022-10-20)
Improvements:
Added support for negative timestamp (#1060)
Fixed PytzUsageWarning for Python versions >= 3.6 (#1062)
Added support for dates with dots and spaces (#1028)
Improved support for Ukrainian, Croatian and Russian (#1072, #1074, #1079, #1082, #1073, #1083)
Added support for parsing Unix timestamps consistently regardless of timezones (#954)
Improved tests (#1086)
1.1.1 (2022-03-17)
Improvements:
Fixed issue with regex library by pinning dependencies to an earlier version (< 2022.3.15, #1046).
Extended support for Russian language dates starting with lowercase (#999).
Allowed to use_given_order for languages too (#997).
Fixed link to settings section (#1018).
Defined UTF-8 encoding for Windows (#998).
Fixed directories creation error in CLI utils (#1022).
1.1.0 (2021-10-04)
New features:
Support language detection based on langdetect, fastText, or a custom implementation (see #932)
Add support for ‘by <time>’ (see #839)
Sort default language list by internet usage (see #805)
Improvements:
Improved support of Chinese (#910), Czech (#977)
Improvements in search_dates (see #953)
Make order of previous locales deterministic (see #851)
Fix parsing with trailing space (see #841)
Consider RETURN_TIME_AS_PERIOD for timestamp times (see #922)
Exclude failing regex version (see #974)
Ongoing work multithreading support (see #881, #885)
Add demo URL (see #883)
QA:
Migrate pipelines from Travis CI to Github Actions (see #859, #879, #884, #886, #911, #966)
Use versioned CLDR data (see #825)
Add a script to update table of supported languages and locales (see #601)
Sort ‘skip’ keys in yaml files (see #844)
Improve test coverage (see #827)
Code cleanup (see #888, #907, #951, #958, #957)
1.0.0 (2020-10-29)
Breaking changes:
Drop support for Python 2.7 and pypy (see #727, #744, #748, #749, #754, #755, #758, #761, #763, #764, #777 and #783)
Now DateDataParser.get_date_data() returns a DateData object instead of a dict (see #778).
From now wrong settings are not silenced and raise SettingValidationError (see #797)
Now dateparser.parse() is deterministic and doesn’t try previous locales. Also, DateDataParser.get_date_data() doesn’t try the previous locales by default (see #781)
Remove the 'base-formats' parser (see #721)
Extract the 'no-spaces-time' parser from the 'absolute-time' parser and make it an optional parser (see #786)
Remove numeral_translation_data (see #782)
Remove the undocumented SKIP_TOKENS_PARSER and FUZZY settings (see #728, #794)
Remove support for using strings in date_formats (see #726)
The undocumented ExactLanguageSearch class has been moved to the private scope and some internal methods have changed (see #778)
Changes in dateparser.utils: normalize_unicode() doesn’t accept bytes as input and convert_to_unicode has been deprecated (see #749)
New features:
Add Python 3.9 support (see #732, #823)
Detect hours separated with a period/dot (see #741)
Add support for “decade” (see #762)
Add support for the hijri calendar in Python ≥ 3.6 (see #718)
Improvements:
New logo! (see #719)
Improve the README and docs (see #779, #722)
Fix the “calendars” extra (see #740)
Fix leap years when PREFER_DATES_FROM is set (see #738)
Fix STRICT_PARSING setting in no-spaces-time parser (see #715)
Consider RETURN_AS_TIME_PERIOD setting for relative-time parser (see #807)
Parse the 24hr time format with meridian info (see #634)
Other small improvements (see #698, #709, #710, #712, #730, #731, #735, #739, #784, #788, #795 and #801)
0.7.6 (2020-06-12)
Improvements:
Rename scripts to dateparser_scripts to avoid name collisions with modules from other packages or projects (see #707)
0.7.5 (2020-06-10)
New features:
Add Python 3.8 support (see #664)
Implement a REQUIRE_PARTS setting (see #703)
Add support for subscript and superscript numbers (see #684)
Extended French support (see #672)
Extended German support (see #673)
Improvements:
Migrate test suite to Pytest (see #662)
Add test to check the yaml and json files content (see #663 and #692)
Add flake8 pipeline with pytest-flake8 (see #665)
Add partial support for 8-digit dates without separators (see #639)
Fix possible OverflowError errors and explicitly avoid to raise ValueError when parsing relative dates (see #686)
Fix double-digit GMT and UTC parsing (see #632)
Fix bug when using DATE_ORDER (see #628)
Fix bug when parsing relative time with timezone (see #503)
Fix milliseconds parsing (see #572 and #661)
Fix wrong values to be interpreted as 'future' in PREFER_DATES_FROM (see #629)
Other small improvements (see #667, #675, #511, #626, #512, #509, #696, #702 and #699)
0.7.4 (2020-03-06)
New features:
Extended Norwegian support (see #598)
Implement a PARSERS setting (see #603)
Improvements:
Add support for PREFER_DATES_FROM in relative/freshness parser (see #414)
Add support for PREFER_DAY_OF_MONTH in base-formats parser (see #611)
Added UTC -00:00 as a valid offset (see #574)
Fix support for “one” (see #593)
Fix TypeError when parsing some invalid dates (see #536)
Fix tokenizer for non recognized characters (see #622)
Prevent installing regex 2019.02.19 (see #600)
Resolve DeprecationWarning related to raw string escape sequences (see #596)
Implement a tox environment to build the documentation (see #604)
Improve tests stability (see #591, #605)
Documentation improvements (see #510, #578, #619, #614, #620)
Performance improvements (see #570, #569, #625)
0.7.3 (2020-03-06)
Broken version
0.7.2 (2019-09-17)
Features:
Extended Czech support
Added time to valid periods
Added timezone information to dates found with search_dates()
Support strings as date formats
Improvements:
Fixed Collections ABCs depreciation warning
Fixed dates with trailing colons not being parsed
Fixed date format override on any settings change
Fixed parsing current weekday as past date, regardless of settings
Added UTC -2:30 as a valid offset
Added Python 3.7 to supported versions, dropped support for Python 3.3 and 3.4
Moved to importlib from imp where possible
Improved support for Catalan
Documentation improvements
0.7.1 (2019-02-12)
Features/news:
Added detected language to return value of search_dates()
Performance improvements
Refreshed versions of dependencies
Improvements:
Fixed unpickleable DateTime objects with timezones
Fixed regex pattern to avoid new behaviour of re.split in Python 3.7
Fixed an exception thrown when parsing colons
Fixed tests failing on days with number greater than 30
Fixed ZeroDivisionError exceptions
0.7.0 (2018-02-08)
Features added during Google Summer of Code 2017:
Harvesting language data from Unicode CLDR database (https://github.com/unicode-cldr/cldr-json), which includes over 200 locales (#321) - authored by Sarthak Maddan. See full currently supported locale list in README.
Extracting dates from longer strings of text (#324) - authored by Elena Zakharova. Special thanks for their awesome contributions!
New features:
Added (independently from CLDR) Georgian (#308) and Swedish (#305)
Improvements:
Improved support of Chinese (#359), Thai (#345), French (#301, #304), Russian (#302)
Removed ruamel.yaml from dependencies (#374). This should reduce the number of installation issues and improve performance as the result of moving away from YAML as basic data storage format. Note that YAML is still used as format for support language files.
Improved performance through using pre-compiling frequent regexes and lazy loading of data (#293, #294, #295, #315)
Extended tests (#316, #317, #318, #323)
Updated nose_parameterized to its current package, parameterized (#381)
Planned for next release:
Full language and locale names
Performance and stability improvements
Documentation improvements
0.6.0 (2017-03-13)
New features:
Consistent parsing in terms of true python representation of date string. See #281
Added support for Bangla, Bulgarian and Hindi languages.
Improvements:
Major bug fixes related to parser and system’s locale. See #277, #282
Type check for timezone arguments in settings. see #267
Pinned dependencies’ versions in requirements. See #265
Improved support for cn, es, dutch languages. See #274, #272, #285
Packaging:
Make calendars extras to be used at the time of installation if need to use calendars feature.
0.5.1 (2016-12-18)
New features:
Added support for Hebrew
Improvements:
Safer loading of YAML. See #251
Better timezone parsing for freshness dates. See #256
Pinned dependencies’ versions in requirements. See #265
Improved support for zh, fi languages. See #249, #250, #248, #244
0.5.0 (2016-09-26)
New features:
DateDataParser now also returns detected language in the result dictionary.
Explicit and lucid timezone conversion for a given datestring using TIMEZONE, TO_TIMEZONE settings.
Added Hungarian language.
Added setting, STRICT_PARSING to ignore incomplete dates.
Improvements:
Fixed quite a few parser bugs reported in issues #219, #222, #207, #224.
Improved support for chinese language.
Consistent interface for both Jalali and Hijri parsers.
0.4.0 (2016-06-17)
New features:
Support for Language based date order preference while parsing ambiguous dates.
Support for parsing dates with no spaces in between components.
Support for custom date order preference using settings.
Support for parsing generic relative dates in future.e.g. “tomorrow”, “in two weeks”, etc.
Added RELATIVE_BASE settings to set date context to any datetime in past or future.
Replaced dateutil.parser.parse with dateparser’s own parser.
Improvements:
Added simplifications for “12 noon” and “12 midnight”.
Fixed several bugs
Replaced PyYAML library by its active fork ruamel.yaml which also fixed the issues with installation on windows using python35.
More predictable date_formats handling.
0.3.5 (2016-04-27)
New features:
Danish language support.
Japanese language support.
Support for parsing date strings with accents.
Improvements:
Transformed languages.yaml into base file and separate files for each language.
Fixed vietnamese language simplifications.
No more version restrictions for python-dateutil.
Timezone parsing improvements.
Fixed test environments.
Cleaned language codes. Now we strictly follow codes as in ISO 639-1.
Improved chinese dates parsing.
0.3.4 (2016-03-03)
Improvements:
Fixed broken version 0.3.3 by excluding latest python-dateutil version.
0.3.3 (2016-02-29)
New features:
Finnish language support.
Improvements:
Faster parsing with switching to regex module.
RETURN_AS_TIMEZONE_AWARE setting to return tz aware date object.
Fixed conflicts with month/weekday names similarity across languages.
0.3.2 (2016-01-25)
New features:
Added Hijri Calendar support.
Added settings for better control over parsing dates.
Support to convert parsed time to the given timezone for both complete and relative dates.
Improvements:
Fixed problem with caching datetime.now in FreshnessDateDataParser.
Added month names and week day names abbreviations to several languages.
More simplifications for Russian and Ukrainian languages.
Fixed problem with parsing time component of date strings with several kinds of apostrophes.
0.3.1 (2015-10-28)
New features:
Support for Jalali Calendar.
Belarusian language support.
Indonesian language support.
Improvements:
Extended support for Russian and Polish.
Fixed bug with time zone recognition.
Fixed bug with incorrect translation of “second” for Portuguese.
0.3.0 (2015-07-29)
New features:
Compatibility with Python 3 and PyPy.
Improvements:
languages.yaml data cleaned up to make it human-readable.
Improved Spanish date parsing.
0.2.1 (2015-07-13)
Support for generic parsing of dates with UTC offset.
Support for Tagalog/Filipino dates.
Improved support for French and Spanish dates.
0.2.0 (2015-06-17)
Easy to use parse function
Languages definitions using YAML.
Using translation based approach for parsing non-english languages. Previously, dateutil.parserinfo was used for language definitions.
Better period extraction.
Improved tests.
Added a number of new simplifications for more comprehensive generic parsing.
Improved validation for dates.
Support for Polish, Thai and Arabic dates.
Support for pytz timezones.
Fixed building and packaging issues.
0.1.0 (2014-11-24)
First release on PyPI.
Metadata
Release files for dateparser 1.5.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| dateparser-1.5.0.tar.gz | 484.7 kB | With provenance | Details for dateparser-1.5.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| dateparser-1.5.0-py3-none-any.whl | Python 3 | none | any | Details for dateparser-1.5.0-py3-none-any.whl |
Total release size: 858.1 kB
Release files / dateparser-1.5.0.tar.gz
| Download URL | dateparser-1.5.0.tar.gz |
|---|---|
| Size | 484.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
08d62f2c00d3a1e806fc59d40c79e7554e31d84d3b8c6145820af051c92e7292
|
|
BLAKE2b-256 checksum How to use checksums |
dac68bb3f0584e7affe13f092906b42fac0a22b6375bf80ed3896bb31fdcb497
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 4, 2026.
Transparency logRelease files / dateparser-1.5.0-py3-none-any.whl
| Download URL | dateparser-1.5.0-py3-none-any.whl |
|---|---|
| Size | 373.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
7c4e088f25458f57db391510035af0878439a6df71d159318dcdb0a7553932e3
|
|
BLAKE2b-256 checksum How to use checksums |
7f5873739bc1e168f309aeb8cc29b5866a134da8dbd4f69af947fc93462f1e33
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 4, 2026.
Transparency logSecurity for dateparser 1.5.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for dateparser-1.5.0.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 4, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.