diff --git a/doc/source/whatsnew/v2.0.0.rst b/doc/source/whatsnew/v2.0.0.rst index b1ff0ec305dc3..c875eb8c94119 100644 --- a/doc/source/whatsnew/v2.0.0.rst +++ b/doc/source/whatsnew/v2.0.0.rst @@ -283,6 +283,7 @@ Removal of prior version deprecations/changes - Changed behavior of :class:`Index` constructor when passed a ``SparseArray`` or ``SparseDtype`` to retain that dtype instead of casting to ``numpy.ndarray`` (:issue:`43930`) - Removed the deprecated ``base`` and ``loffset`` arguments from :meth:`pandas.DataFrame.resample`, :meth:`pandas.Series.resample` and :class:`pandas.Grouper`. Use ``offset`` or ``origin`` instead (:issue:`31809`) - Changed behavior of :meth:`DataFrame.any` and :meth:`DataFrame.all` with ``bool_only=True``; object-dtype columns with all-bool values will no longer be included, manually cast to ``bool`` dtype first (:issue:`46188`) +- Changed behavior of comparison of a :class:`Timestamp` with a ``datetime.date`` object; these now compare as un-equal and raise on inequality comparisons, matching the ``datetime.datetime`` behavior (:issue:`36131`) - Enforced deprecation of silently dropping columns that raised a ``TypeError`` in :class:`Series.transform` and :class:`DataFrame.transform` when used with a list or dictionary (:issue:`43740`) - diff --git a/pandas/_libs/tslibs/timestamps.pyx b/pandas/_libs/tslibs/timestamps.pyx index 3c3bb8496aa6e..1a2e2760d3d8d 100644 --- a/pandas/_libs/tslibs/timestamps.pyx +++ b/pandas/_libs/tslibs/timestamps.pyx @@ -364,15 +364,13 @@ cdef class _Timestamp(ABCTimestamp): # which incorrectly drops tz and normalizes to midnight # before comparing # We follow the stdlib datetime behavior of never being equal - warnings.warn( - "Comparison of Timestamp with datetime.date is deprecated in " - "order to match the standard library behavior. " - "In a future version these will be considered non-comparable. " - "Use 'ts == pd.Timestamp(date)' or 'ts.date() == date' instead.", - FutureWarning, - stacklevel=find_stack_level(), + if op == Py_EQ: + return False + elif op == Py_NE: + return True + raise TypeError("Cannot compare Timestamp with datetime.date. " + "Use ts == pd.Timestamp(date) or ts.date() == date instead." ) - return NotImplemented else: return NotImplemented diff --git a/pandas/tests/indexing/test_loc.py b/pandas/tests/indexing/test_loc.py index 88ae431fb1baf..ad3cec5824619 100644 --- a/pandas/tests/indexing/test_loc.py +++ b/pandas/tests/indexing/test_loc.py @@ -1462,9 +1462,6 @@ def test_loc_setitem_datetime_coercion(self): assert Timestamp("2008-08-08") == df.loc[0, "c"] assert Timestamp("2008-08-08") == df.loc[1, "c"] df.loc[2, "c"] = date(2005, 5, 5) - with tm.assert_produces_warning(FutureWarning): - # Comparing Timestamp to date obj is deprecated - assert Timestamp("2005-05-05") == df.loc[2, "c"] assert Timestamp("2005-05-05").date() == df.loc[2, "c"] @pytest.mark.parametrize("idxer", ["var", ["var"]]) diff --git a/pandas/tests/scalar/timestamp/test_comparisons.py b/pandas/tests/scalar/timestamp/test_comparisons.py index 2c9b029bf109e..ad629604d1bc9 100644 --- a/pandas/tests/scalar/timestamp/test_comparisons.py +++ b/pandas/tests/scalar/timestamp/test_comparisons.py @@ -156,36 +156,22 @@ def test_compare_date(self, tz): # GH#36131 comparing Timestamp with date object is deprecated ts = Timestamp("2021-01-01 00:00:00.00000", tz=tz) dt = ts.to_pydatetime().date() - # These are incorrectly considered as equal because they - # dispatch to the date comparisons which truncates ts + # in 2.0 we disallow comparing pydate objects with Timestamps, + # following the stdlib datetime behavior. + msg = "Cannot compare Timestamp with datetime.date" for left, right in [(ts, dt), (dt, ts)]: - with tm.assert_produces_warning(FutureWarning): - assert left == right - with tm.assert_produces_warning(FutureWarning): - assert not left != right - with tm.assert_produces_warning(FutureWarning): - assert not left < right - with tm.assert_produces_warning(FutureWarning): - assert left <= right - with tm.assert_produces_warning(FutureWarning): - assert not left > right - with tm.assert_produces_warning(FutureWarning): - assert left >= right - - # Once the deprecation is enforced, the following assertions - # can be enabled: - # assert not left == right - # assert left != right - # - # with pytest.raises(TypeError): - # left < right - # with pytest.raises(TypeError): - # left <= right - # with pytest.raises(TypeError): - # left > right - # with pytest.raises(TypeError): - # left >= right + assert not left == right + assert left != right + + with pytest.raises(TypeError, match=msg): + left < right + with pytest.raises(TypeError, match=msg): + left <= right + with pytest.raises(TypeError, match=msg): + left > right + with pytest.raises(TypeError, match=msg): + left >= right def test_cant_compare_tz_naive_w_aware(self, utc_fixture): # see GH#1404