diff --git a/pandas/core/arrays/datetimelike.py b/pandas/core/arrays/datetimelike.py index cc2c753857032..de0a246861961 100644 --- a/pandas/core/arrays/datetimelike.py +++ b/pandas/core/arrays/datetimelike.py @@ -444,7 +444,7 @@ def _validate_comparison_value(self, other, opname: str): else: try: - other = self._validate_listlike(other, opname, allow_object=True) + other = self._validate_listlike(other, allow_object=True) self._check_compatible_with(other) except TypeError as err: if is_object_dtype(getattr(other, "dtype", None)): @@ -548,7 +548,7 @@ def _validate_scalar(self, value, msg: Optional[str] = None): return value - def _validate_listlike(self, value, opname: str, allow_object: bool = False): + def _validate_listlike(self, value, allow_object: bool = False): if isinstance(value, type(self)): return value @@ -578,10 +578,9 @@ def _validate_listlike(self, value, opname: str, allow_object: bool = False): elif not type(self)._is_recognized_dtype(value.dtype): raise TypeError( - f"{opname} requires compatible dtype or scalar, " - f"not {type(value).__name__}" + f"value should be a '{self._scalar_type.__name__}', 'NaT', " + f"or array of those. Got '{type(value).__name__}' instead." ) - return value def _validate_searchsorted_value(self, value): @@ -589,7 +588,7 @@ def _validate_searchsorted_value(self, value): if not is_list_like(value): value = self._validate_scalar(value, msg) else: - value = self._validate_listlike(value, "searchsorted") + value = self._validate_listlike(value) rv = self._unbox(value) return self._rebox_native(rv) @@ -600,7 +599,7 @@ def _validate_setitem_value(self, value): f"or array of those. Got '{type(value).__name__}' instead." ) if is_list_like(value): - value = self._validate_listlike(value, "setitem") + value = self._validate_listlike(value) else: value = self._validate_scalar(value, msg) @@ -622,7 +621,7 @@ def _validate_where_value(self, other): if not is_list_like(other): other = self._validate_scalar(other, msg) else: - other = self._validate_listlike(other, "where") + other = self._validate_listlike(other) return self._unbox(other, setitem=True) diff --git a/pandas/core/indexes/datetimelike.py b/pandas/core/indexes/datetimelike.py index d6d8cb267e06b..b6836a0bbe496 100644 --- a/pandas/core/indexes/datetimelike.py +++ b/pandas/core/indexes/datetimelike.py @@ -663,9 +663,7 @@ def _wrap_joined_index(self, joined: np.ndarray, other): @doc(Index._convert_arr_indexer) def _convert_arr_indexer(self, keyarr): try: - return self._data._validate_listlike( - keyarr, "convert_arr_indexer", allow_object=True - ) + return self._data._validate_listlike(keyarr, allow_object=True) except (ValueError, TypeError): return com.asarray_tuplesafe(keyarr) diff --git a/pandas/tests/arrays/test_datetimelike.py b/pandas/tests/arrays/test_datetimelike.py index a961cf14b2e5c..ed7c7c31c6b8d 100644 --- a/pandas/tests/arrays/test_datetimelike.py +++ b/pandas/tests/arrays/test_datetimelike.py @@ -416,7 +416,10 @@ def test_setitem_raises(self): def test_setitem_numeric_raises(self, arr1d, box): # We dont case e.g. int64 to our own dtype for setitem - msg = "requires compatible dtype" + msg = ( + f"value should be a '{arr1d._scalar_type.__name__}', " + "'NaT', or array of those. Got" + ) with pytest.raises(TypeError, match=msg): arr1d[:2] = box([0, 1]) diff --git a/pandas/tests/arrays/test_datetimes.py b/pandas/tests/arrays/test_datetimes.py index 9f136b4979bb7..78721fc2fe1c1 100644 --- a/pandas/tests/arrays/test_datetimes.py +++ b/pandas/tests/arrays/test_datetimes.py @@ -396,7 +396,7 @@ def test_searchsorted_invalid_types(self, other, index): msg = "|".join( [ "searchsorted requires compatible dtype or scalar", - "Unexpected type for 'value'", + "value should be a 'Timestamp', 'NaT', or array of those. Got", ] ) with pytest.raises(TypeError, match=msg): diff --git a/pandas/tests/arrays/test_timedeltas.py b/pandas/tests/arrays/test_timedeltas.py index b3b8f4d55e4de..75d6f7d276518 100644 --- a/pandas/tests/arrays/test_timedeltas.py +++ b/pandas/tests/arrays/test_timedeltas.py @@ -136,7 +136,7 @@ def test_searchsorted_invalid_types(self, other, index): msg = "|".join( [ "searchsorted requires compatible dtype or scalar", - "Unexpected type for 'value'", + "value should be a 'Timedelta', 'NaT', or array of those. Got", ] ) with pytest.raises(TypeError, match=msg): diff --git a/pandas/tests/indexes/period/test_searchsorted.py b/pandas/tests/indexes/period/test_searchsorted.py index f2950b9f6065c..6ffdbbfcd2ce6 100644 --- a/pandas/tests/indexes/period/test_searchsorted.py +++ b/pandas/tests/indexes/period/test_searchsorted.py @@ -62,7 +62,7 @@ def test_searchsorted_invalid(self): msg = "|".join( [ "searchsorted requires compatible dtype or scalar", - "Unexpected type for 'value'", + "value should be a 'Period', 'NaT', or array of those. Got", ] ) with pytest.raises(TypeError, match=msg): diff --git a/pandas/tests/indexes/timedeltas/test_searchsorted.py b/pandas/tests/indexes/timedeltas/test_searchsorted.py index 3cf45931cf6b7..e3b52058469f0 100644 --- a/pandas/tests/indexes/timedeltas/test_searchsorted.py +++ b/pandas/tests/indexes/timedeltas/test_searchsorted.py @@ -21,6 +21,6 @@ def test_searchsorted_different_argument_classes(self, klass): ) def test_searchsorted_invalid_argument_dtype(self, arg): idx = TimedeltaIndex(["1 day", "2 days", "3 days"]) - msg = "searchsorted requires compatible dtype" + msg = "value should be a 'Timedelta', 'NaT', or array of those. Got" with pytest.raises(TypeError, match=msg): idx.searchsorted(arg)