Repository navigation
Releases
1.5.0
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 ...
1.4.3
Fixes:
- Make parsing thread-safe: parsing from several threads no longer
raises an intermittentKeyErrorfrom the shared language caches,
and aDATE_ORDERorRELATIVE_BASEvalue 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 returnNoneor a date read in the
wrong locale (#1371) - Resolve the
BSTandHDTtimezone 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 asCSTandIST, keep their
current offset. Text carrying these abbreviations keeps its wall clock
but moves by 10 hours forBSTand 30 minutes forHDT, 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"]returnsNonerather than 2000-01-01. A
format with no year directive is checked against the yearstrptime
defaults to, 1900, which is not a leap year, so "366" with
date_formats=["%j"]now returnsNonewhere 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
New features
- Add an
IGNORE_SURROUNDING_TEXTsetting that, when enabled, retries parsing after ignoring 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
strategyargument tosearch_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
itorfris given, without needing to setPREFER_LOCALE_DATE_ORDERto
False(#1352) - Honor
PREFER_DATES_FROMandRELATIVE_BASEwhen parsing with customdate_formatsthat use a two-digit year (%y) (#1342) - Honor the
%j(day of year) directive indate_formatsinstead 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
Breaking changes:
- Remove fastText language detection support: the
fasttextextra is
dropped anddetect_languages()now raisesImportError. Migrate to
thelangdetectextra, which also unblocksnumpy2.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_ORDERsetting to trylanguagesand
localesin 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_dateswhen 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
nowfor 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
OrderedDictusage with the built-indict(#1328)
1.4.0
Security fixes:
- Remove import-time loading of timezone offset data from pickle to prevent
unsafe deserialization from packaged data - Replace
eval()use when parsingno_word_spacingwith 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-USlocale (#1222)
Fixes:
- Honor
REQUIRE_PARTSfor ambiguous month-number inputs by retrying with a
year-biasedDATE_ORDER(#1298) - Fix parsing word-number relative phrases such as "two days later" (#1316)
- Allow md5hash to work in FIPS environments (#1267)
Improvements:
1.3.0
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 theRETURN_TIME_SPAN,DEFAULT_START_OF_WEEKand
DEFAULT_DAYS_IN_MONTHsettings 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)
Release v1.2.2
Release v1.2.1
1.2.1
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
numpyto 1.x when installingdateparser[fasttext](#1248)
1.2.0
Release 1.1.8
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)