Breaking changes:
DateData.periodcan take the new values"quarter"and
"part_of_day", and withRETURN_TIME_AS_PERIODenabled 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
Settingsinstances: creating one with the
same settings twice now gives two different objects, and the
Settings.registry_keyattribute no longer exists (#1442) - Remove the leftovers of fastText support from
dateparser_cli: the
fasttext_managerandexceptionsmodules and
utils.create_data_model_home();utils.dateparser_model_homeand
utils.DEFAULT_WINDOWS_CACHE_DIRare nowpathlib.Pathobjects
(#1406) - Remove
Locale.to_parserinfo()andHijriDate.weekday(), which
always raised an exception (#1406, #1457)
Deprecations:
- Deprecate
dateparser.timezone_parser.convert_to_local_tz()(#1481)
anddateparser.timezone_parser.build_tz_offsets()(#1405) - Emit a
FutureWarningnaming theTZvalue fromparse(),
DateDataParserandsearch_dates()when the local timezone cannot
be determined; a future version will raiseRuntimeErrorinstead of
failing to parse the date (#1403, #1556) - Deprecate
dateparser.utils.registry()andSettings.get_key(),
which now emit aFutureWarning(#1442, #1556) - Deprecate
get_week_start()andget_week_end()in
dateparser.utils.time_spans, and callinggenerate_time_span()
withoutbase_dateorsettings; all of them now emit a
FutureWarning(#1393, #1556) - Deprecate
dateparser.date.RE_TRIM_COLONS(GHSA-fmxc-97cw-ph6p <https://github.com/scrapinghub/dateparser/security/advisories/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 <https://github.com/scrapinghub/dateparser/security/advisories/GHSA-rx9v-94ff-9cc2>_) - Prevent quadratic regex matching (ReDoS) on long digit runs in Cantonese,
Chinese and Japanese, and aValueErroron runs of more than 4,300
digits on Python 3.10.7 and later (GHSA-g8fh-jxm9-6qfx <https://github.com/scrapinghub/dateparser/security/advisories/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 <https://github.com/scrapinghub/dateparser/security/advisories/GHSA-q7fp-xwcm-6x9f>_) - Prevent quadratic regex matching (ReDoS) on long runs of digits or whitespace
(GHSA-gqj4-wf6c-wmcg <https://github.com/scrapinghub/dateparser/security/advisories/GHSA-gqj4-wf6c-wmcg>_) - Strip trailing colons in linear time, to prevent quadratic backtracking
(ReDoS) on long colon runs (GHSA-fmxc-97cw-ph6p <https://github.com/scrapinghub/dateparser/security/advisories/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 <https://github.com/scrapinghub/dateparser/security/advisories/GHSA-jxmm-w6rw-32ch>_)
New features:
-
Add a
STRICT_DATE_ORDERsetting that turns an explicitDATE_ORDER
from a preference into a requirement:"year"reads a two-digit year
only from the positionDATE_ORDERgives it, and"all"also keeps
the day and month where the order puts them (#1443) -
Add a
TIMEZONE_ABBREVIATIONSsetting to override the offset of
timezone abbreviations, e.g. to readISTas 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 newPARTS_OF_DAYsetting;
the newDateData.part_of_dayattribute 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_periodargument tosearch_dates()to also return the
period of each date (#1437) -
Add a
date_formatsargument tosearch_dates(), to find dates
written in the given formats; it requiresstrategy="ngram"and raises
ValueErrorwith 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 byPREFER_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, whateverPREFER_DATES_FROMis, 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_formatsin the given languages,
so formats with literal text work, e.g. "el %d de %B de %Y" for "el 15 de
junio de 2020" withlanguages=["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)
- right after a label and a colon in Chinese or Japanese, e.g.
Fixes:
- Take the current date, used to fill in the missing parts of a date such
as "12:30" or "Nov" and to applyPREFER_DATES_FROM, from the
TIMEZONEsetting (the local time zone by default) instead of UTC
(#1427) - Keep the
%zoffset when parsing withdate_formats, and return a
timezone-aware date for it unlessRETURN_AS_TIMEZONE_AWAREis
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" withDMY(#1431) - Read a lone number next to a four-digit year as the month under any
DATE_ORDER(#1472) - Apply
PREFER_DAY_OF_MONTHbeforePREFER_DATES_FROMpicks the year
(#1409), and applyPREFER_DAY_OF_MONTHandPREFER_MONTH_OF_YEAR
to relative dates such as "last year" (#1413) - Apply an explicit
DATE_ORDERto every date thatsearch_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
Noneinstead of a date built from some of them (#1480) - Stop reading two adjacent numbers of a Russian numeric date as one
compound ordinal, soparse("20 03 2021", languages=["ru"])returns
20 March 2021 instead of the 23rd of the current month (#1554) - Return
Nonefor strings with only skipped words, such as "year" or
"hour minute", instead of today, which also stopssearch_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 unlesslanguages=["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" withlanguages=["fr"]and "le 3 sept à 10h" with or
withoutlanguages; "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
withdate_formats, including%GISO 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()raisingIndexErrorfor thezh-Hans,
zh-Hantandyuelocales, 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_BASEvalue
(#1442) - Fix
parse()andDateDataParserreturningNonewhenregion
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()raisingAttributeErrorwhen
logging.confighad 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 thear-SY,ar-JO,ar-LB,ar-PSandar-IQ
locales only, e.g.locales=["ar-SY"]orregion="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
zhtozh-Hansand
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
languagesare given, sosearch_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 howDEFAULT_LANGUAGESrelates to
thelanguagesargument (#1422) and howdate_formatsfalls back to
the other parsers (#1549) - Show the whole README on PyPI (#1359)