diff --git a/doc/source/whatsnew/v2.0.0.rst b/doc/source/whatsnew/v2.0.0.rst index 57558491e0e57..f88dc67da72ad 100644 --- a/doc/source/whatsnew/v2.0.0.rst +++ b/doc/source/whatsnew/v2.0.0.rst @@ -698,7 +698,7 @@ Datetimelike - Bug in subtracting a ``datetime`` scalar from :class:`DatetimeIndex` failing to retain the original ``freq`` attribute (:issue:`48818`) - Bug in ``pandas.tseries.holiday.Holiday`` where a half-open date interval causes inconsistent return types from :meth:`USFederalHolidayCalendar.holidays` (:issue:`49075`) - Bug in rendering :class:`DatetimeIndex` and :class:`Series` and :class:`DataFrame` with timezone-aware dtypes with ``dateutil`` or ``zoneinfo`` timezones near daylight-savings transitions (:issue:`49684`) -- Bug in :func:`to_datetime` was raising ``ValueError`` when parsing :class:`Timestamp`, ``datetime``, or ``np.datetime64`` objects with non-ISO8601 ``format`` (:issue:`49298`, :issue:`50036`) +- Bug in :func:`to_datetime` was raising ``ValueError`` when parsing :class:`Timestamp`, ``datetime.datetime``, ``datetime.date``, or ``np.datetime64`` objects when non-ISO8601 ``format`` was passed (:issue:`49298`, :issue:`50036`) - Timedelta diff --git a/pandas/_libs/tslibs/strptime.pyx b/pandas/_libs/tslibs/strptime.pyx index 9a315106b75cd..447d254d39995 100644 --- a/pandas/_libs/tslibs/strptime.pyx +++ b/pandas/_libs/tslibs/strptime.pyx @@ -1,6 +1,7 @@ """Strptime-related classes and functions. """ from cpython.datetime cimport ( + PyDate_Check, PyDateTime_Check, date, import_datetime, @@ -34,6 +35,7 @@ from pandas._libs.tslibs.np_datetime cimport ( check_dts_bounds, npy_datetimestruct, npy_datetimestruct_to_datetime, + pydate_to_dt64, pydatetime_to_dt64, ) from pandas._libs.tslibs.timestamps cimport _Timestamp @@ -173,6 +175,10 @@ def array_strptime( check_dts_bounds(&dts) result_timezone[i] = val.tzinfo continue + elif PyDate_Check(val): + iresult[i] = pydate_to_dt64(val, &dts) + check_dts_bounds(&dts) + continue elif is_datetime64_object(val): iresult[i] = get_datetime64_nanos(val, NPY_FR_ns) continue diff --git a/pandas/tests/tools/test_to_datetime.py b/pandas/tests/tools/test_to_datetime.py index 0e9c8a3ce487b..374db17714b06 100644 --- a/pandas/tests/tools/test_to_datetime.py +++ b/pandas/tests/tools/test_to_datetime.py @@ -3,6 +3,7 @@ import calendar from collections import deque from datetime import ( + date, datetime, timedelta, timezone, @@ -469,6 +470,16 @@ def test_to_datetime_mixed_datetime_and_string(self): expected = to_datetime([d1, d2]).tz_convert(pytz.FixedOffset(-60)) tm.assert_index_equal(res, expected) + @pytest.mark.parametrize( + "format", ["%Y-%m-%d", "%Y-%d-%m"], ids=["ISO8601", "non-ISO8601"] + ) + def test_to_datetime_mixed_date_and_string(self, format): + # https://github.com/pandas-dev/pandas/issues/50108 + d1 = date(2020, 1, 2) + res = to_datetime(["2020-01-01", d1], format=format) + expected = DatetimeIndex(["2020-01-01", "2020-01-02"]) + tm.assert_index_equal(res, expected) + @pytest.mark.parametrize( "fmt", ["%Y-%d-%m %H:%M:%S%z", "%Y-%m-%d %H:%M:%S%z"],