diff --git a/doc/source/whatsnew/v2.0.0.rst b/doc/source/whatsnew/v2.0.0.rst index c814e585672cb..434b76b42d938 100644 --- a/doc/source/whatsnew/v2.0.0.rst +++ b/doc/source/whatsnew/v2.0.0.rst @@ -1025,6 +1025,7 @@ Datetimelike - Bug in :func:`to_datetime` was raising ``ValueError`` when parsing mixed-offset :class:`Timestamp` with ``errors='ignore'`` (:issue:`50585`) - Bug in :func:`to_datetime` was incorrectly handling floating-point inputs within 1 ``unit`` of the overflow boundaries (:issue:`50183`) - Bug in :func:`to_datetime` with unit of "Y" or "M" giving incorrect results, not matching pointwise :class:`Timestamp` results (:issue:`50870`) +- Bug in :func:`to_datetime` was not returning input with ``errors='ignore'`` when input was out-of-bounds (:issue:`50587`) - Timedelta diff --git a/pandas/_libs/tslib.pyx b/pandas/_libs/tslib.pyx index 783b8b8939c74..89a676f51dc47 100644 --- a/pandas/_libs/tslib.pyx +++ b/pandas/_libs/tslib.pyx @@ -34,7 +34,6 @@ from pandas._libs.tslibs.np_datetime cimport ( NPY_DATETIMEUNIT, NPY_FR_ns, check_dts_bounds, - get_datetime64_value, npy_datetimestruct, npy_datetimestruct_to_datetime, pandas_datetime_to_datetimestruct, @@ -542,16 +541,6 @@ cpdef array_to_datetime( cnp.PyArray_MultiIter_NEXT(mi) - except OutOfBoundsDatetime as ex: - ex.args = (f"{ex}, at position {i}",) - if is_coerce: - iresult[i] = NPY_NAT - cnp.PyArray_MultiIter_NEXT(mi) - continue - elif is_raise: - raise - return ignore_errors_out_of_bounds_fallback(values), tz_out - except (TypeError, OverflowError, ValueError) as ex: ex.args = (f"{ex}, at position {i}",) if is_coerce: @@ -578,55 +567,6 @@ cpdef array_to_datetime( return result, tz_out -@cython.wraparound(False) -@cython.boundscheck(False) -cdef ndarray ignore_errors_out_of_bounds_fallback(ndarray values): - """ - Fallback for array_to_datetime if an OutOfBoundsDatetime is raised - and errors == "ignore" - - Parameters - ---------- - values : ndarray[object] - - Returns - ------- - ndarray[object] - """ - cdef: - Py_ssize_t i, n = values.size - object val - cnp.broadcast mi - ndarray[object] oresult - ndarray oresult_nd - - oresult_nd = cnp.PyArray_EMPTY(values.ndim, values.shape, cnp.NPY_OBJECT, 0) - mi = cnp.PyArray_MultiIterNew2(oresult_nd, values) - oresult = oresult_nd.ravel() - - for i in range(n): - # Analogous to `val = values[i]` - val = (cnp.PyArray_MultiIter_DATA(mi, 1))[0] - - # set as nan except if its a NaT - if checknull_with_nat_and_na(val): - if isinstance(val, float): - oresult[i] = np.nan - else: - oresult[i] = NaT - elif is_datetime64_object(val): - if get_datetime64_value(val) == NPY_NAT: - oresult[i] = NaT - else: - oresult[i] = val.item() - else: - oresult[i] = val - - cnp.PyArray_MultiIter_NEXT(mi) - - return oresult - - @cython.wraparound(False) @cython.boundscheck(False) cdef _array_to_datetime_object( diff --git a/pandas/tests/tools/test_to_datetime.py b/pandas/tests/tools/test_to_datetime.py index a1217b268613a..7a93d2fe8b5ce 100644 --- a/pandas/tests/tools/test_to_datetime.py +++ b/pandas/tests/tools/test_to_datetime.py @@ -1084,9 +1084,15 @@ def test_to_datetime_array_of_dt64s(self, cache, unit): # numpy is either a python datetime.datetime or datetime.date tm.assert_index_equal( to_datetime(dts_with_oob, errors="ignore", cache=cache), - Index([dt.item() for dt in dts_with_oob]), + Index(dts_with_oob), ) + def test_out_of_bounds_errors_ignore(self): + # https://github.com/pandas-dev/pandas/issues/50587 + result = to_datetime(np.datetime64("9999-01-01"), errors="ignore") + expected = np.datetime64("9999-01-01") + assert result == expected + def test_to_datetime_tz(self, cache): # xref 8260