From 673ff45c8bd9fc4756ab0f96284d64e833c57df4 Mon Sep 17 00:00:00 2001 From: dannyi96 Date: Tue, 5 Jul 2022 13:53:17 +0530 Subject: [PATCH 1/5] to_datetime error correction --- pandas/_libs/tslibs/parsing.pyx | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/pandas/_libs/tslibs/parsing.pyx b/pandas/_libs/tslibs/parsing.pyx index 5cb11436f6f45..c2b9d4e212d45 100644 --- a/pandas/_libs/tslibs/parsing.pyx +++ b/pandas/_libs/tslibs/parsing.pyx @@ -282,7 +282,12 @@ def parse_datetime_string( pass try: - dt = du_parse(date_string, default=_DEFAULT_DATETIME, + if date_string == 'today': + dt = datetime.today() + elif date_string == 'now': + dt = datetime.now() + else: + dt = du_parse(date_string, default=_DEFAULT_DATETIME, dayfirst=dayfirst, yearfirst=yearfirst, **kwargs) except TypeError: # following may be raised from dateutil From 06486decdd983f684c9e8aa07a2e4a695fa540f6 Mon Sep 17 00:00:00 2001 From: dannyi96 Date: Tue, 5 Jul 2022 14:12:56 +0530 Subject: [PATCH 2/5] to_datetime error correction --- pandas/_libs/tslib.pyx | 4 ++-- pandas/_libs/tslibs/parsing.pyx | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pandas/_libs/tslib.pyx b/pandas/_libs/tslib.pyx index ee3964b892e2e..e6df5b1e66fed 100644 --- a/pandas/_libs/tslib.pyx +++ b/pandas/_libs/tslib.pyx @@ -595,7 +595,7 @@ cpdef array_to_datetime( continue elif is_raise: raise ValueError( - f"time data {val} doesn't match format specified" + f"time data \"{val}\" at position {i} doesn't match format specified" ) return values, tz_out @@ -821,7 +821,7 @@ cdef _array_to_datetime_object( oresult[i] = NaT continue if is_raise: - raise + raise ValueError(f"Unable to parse string \"{val}\" at position {i}") return values, None else: if is_raise: diff --git a/pandas/_libs/tslibs/parsing.pyx b/pandas/_libs/tslibs/parsing.pyx index c2b9d4e212d45..24d347b6d0dcb 100644 --- a/pandas/_libs/tslibs/parsing.pyx +++ b/pandas/_libs/tslibs/parsing.pyx @@ -282,9 +282,9 @@ def parse_datetime_string( pass try: - if date_string == 'today': + if date_string == "today": dt = datetime.today() - elif date_string == 'now': + elif date_string == "now": dt = datetime.now() else: dt = du_parse(date_string, default=_DEFAULT_DATETIME, From f024141a42925f37f8b396e970b5713105bb5047 Mon Sep 17 00:00:00 2001 From: dannyi96 Date: Tue, 5 Jul 2022 14:31:58 +0530 Subject: [PATCH 3/5] to_datetime error correction --- pandas/_libs/tslib.pyx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pandas/_libs/tslib.pyx b/pandas/_libs/tslib.pyx index e6df5b1e66fed..d8519121f0b0a 100644 --- a/pandas/_libs/tslib.pyx +++ b/pandas/_libs/tslib.pyx @@ -664,11 +664,11 @@ cpdef array_to_datetime( # Still raise OutOfBoundsDatetime, # as error message is informative. - raise + raise OutOfBoundsDatetime(f"Cannot convert \"{val}\" at position {i} to datetime") assert is_ignore return values, tz_out - raise + raise OutOfBoundsDatetime(f"Cannot convert \"{val}\" at position {i} to datetime") except OutOfBoundsDatetime: if is_raise: From ec59a4f00cf814bdd4e7841ac8acdc59d9a898f7 Mon Sep 17 00:00:00 2001 From: dannyi96 Date: Sun, 24 Jul 2022 16:52:10 +0530 Subject: [PATCH 4/5] addressing reviews CL#1 --- pandas/_libs/tslib.pyx | 22 +++++++++++++++------- pandas/_libs/tslibs/parsing.pyx | 11 +++-------- 2 files changed, 18 insertions(+), 15 deletions(-) diff --git a/pandas/_libs/tslib.pyx b/pandas/_libs/tslib.pyx index d8519121f0b0a..39c8aab2ce5dc 100644 --- a/pandas/_libs/tslib.pyx +++ b/pandas/_libs/tslib.pyx @@ -607,11 +607,11 @@ cpdef array_to_datetime( # to check if all arguments have the same tzinfo tz = py_dt.utcoffset() - except (ValueError, OverflowError): + except (ValueError, OverflowError) as err: if is_coerce: iresult[i] = NPY_NAT continue - raise TypeError("invalid string coercion to datetime") + raise type(err)(f"invalid string coercion to datetime for \"{val}\" at position {i}") if tz is not None: seen_datetime_offset = True @@ -798,6 +798,7 @@ cdef _array_to_datetime_object( # We return an object array and only attempt to parse: # 1) NaT or NaT-like values # 2) datetime strings, which we return as datetime.datetime + # 3) special strings - "now" & "today" for i in range(n): val = values[i] if checknull_with_nat_and_na(val) or PyDateTime_Check(val): @@ -811,17 +812,24 @@ cdef _array_to_datetime_object( if len(val) == 0 or val in nat_strings: oresult[i] = 'NaT' continue + try: - oresult[i] = parse_datetime_string(val, dayfirst=dayfirst, + # Handling special case strings today & now + if val == "today": + oresult[i] = datetime.today() + elif val == "now": + oresult[i] = datetime.now() + else: + oresult[i] = parse_datetime_string(val, dayfirst=dayfirst, yearfirst=yearfirst) - pydatetime_to_dt64(oresult[i], &dts) - check_dts_bounds(&dts) - except (ValueError, OverflowError): + pydatetime_to_dt64(oresult[i], &dts) + check_dts_bounds(&dts) + except (ValueError, OverflowError) as err: if is_coerce: oresult[i] = NaT continue if is_raise: - raise ValueError(f"Unable to parse string \"{val}\" at position {i}") + raise type(err)(f"Unable to parse string \"{val}\" at position {i}") return values, None else: if is_raise: diff --git a/pandas/_libs/tslibs/parsing.pyx b/pandas/_libs/tslibs/parsing.pyx index 24d347b6d0dcb..8e914027c6af7 100644 --- a/pandas/_libs/tslibs/parsing.pyx +++ b/pandas/_libs/tslibs/parsing.pyx @@ -261,7 +261,7 @@ def parse_datetime_string( datetime dt if not _does_string_look_like_datetime(date_string): - raise ValueError('Given date string not likely a datetime.') + raise ValueError(f'Given date string {date_string} not likely a datetime.') if does_string_look_like_time(date_string): # use current datetime as default, not pass _DEFAULT_DATETIME @@ -282,17 +282,12 @@ def parse_datetime_string( pass try: - if date_string == "today": - dt = datetime.today() - elif date_string == "now": - dt = datetime.now() - else: dt = du_parse(date_string, default=_DEFAULT_DATETIME, dayfirst=dayfirst, yearfirst=yearfirst, **kwargs) except TypeError: # following may be raised from dateutil # TypeError: 'NoneType' object is not iterable - raise ValueError('Given date string not likely a datetime.') + raise ValueError(f'Given date string {date_string} not likely a datetime.') return dt @@ -368,7 +363,7 @@ cdef parse_datetime_string_with_reso( int out_tzoffset if not _does_string_look_like_datetime(date_string): - raise ValueError('Given date string not likely a datetime.') + raise ValueError(f'Given date string {date_string} not likely a datetime.') parsed, reso = _parse_delimited_date(date_string, dayfirst) if parsed is not None: From 69dc2d43875c5ffc307b829397612a66b0549316 Mon Sep 17 00:00:00 2001 From: dannyi96 Date: Sun, 24 Jul 2022 17:10:12 +0530 Subject: [PATCH 5/5] addressing reviews CL#1 --- pandas/_libs/tslibs/parsing.pyx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandas/_libs/tslibs/parsing.pyx b/pandas/_libs/tslibs/parsing.pyx index 8e914027c6af7..50be534328334 100644 --- a/pandas/_libs/tslibs/parsing.pyx +++ b/pandas/_libs/tslibs/parsing.pyx @@ -282,7 +282,7 @@ def parse_datetime_string( pass try: - dt = du_parse(date_string, default=_DEFAULT_DATETIME, + dt = du_parse(date_string, default=_DEFAULT_DATETIME, dayfirst=dayfirst, yearfirst=yearfirst, **kwargs) except TypeError: # following may be raised from dateutil