diff --git a/pandas/compat/numpy/function.py b/pandas/compat/numpy/function.py index d42be56963569..a4232ca2ebf78 100644 --- a/pandas/compat/numpy/function.py +++ b/pandas/compat/numpy/function.py @@ -360,3 +360,24 @@ def validate_resampler_func(method, args, kwargs): "{func}() instead".format(func=method))) else: raise TypeError("too many arguments passed in") + + +def validate_minmax_axis(axis): + """ + Ensure that the axis argument passed to min, max, argmin, or argmax is + zero or None, as otherwise it will be incorrectly ignored. + + Parameters + ---------- + axis : int or None + + Raises + ------ + ValueError + """ + ndim = 1 # hard-coded for Index + if axis is None: + return + if axis >= ndim or (axis < 0 and ndim + axis < 0): + raise ValueError("`axis` must be fewer than the number of " + "dimensions ({ndim})".format(ndim=ndim)) diff --git a/pandas/core/indexes/datetimelike.py b/pandas/core/indexes/datetimelike.py index 8e919ba3599fc..d9152c50309eb 100644 --- a/pandas/core/indexes/datetimelike.py +++ b/pandas/core/indexes/datetimelike.py @@ -431,6 +431,7 @@ def min(self, axis=None, *args, **kwargs): numpy.ndarray.min """ nv.validate_min(args, kwargs) + nv.validate_minmax_axis(axis) try: i8 = self.asi8 @@ -459,6 +460,7 @@ def argmin(self, axis=None, *args, **kwargs): numpy.ndarray.argmin """ nv.validate_argmin(args, kwargs) + nv.validate_minmax_axis(axis) i8 = self.asi8 if self.hasnans: @@ -479,6 +481,7 @@ def max(self, axis=None, *args, **kwargs): numpy.ndarray.max """ nv.validate_max(args, kwargs) + nv.validate_minmax_axis(axis) try: i8 = self.asi8 @@ -507,6 +510,7 @@ def argmax(self, axis=None, *args, **kwargs): numpy.ndarray.argmax """ nv.validate_argmax(args, kwargs) + nv.validate_minmax_axis(axis) i8 = self.asi8 if self.hasnans: diff --git a/pandas/tests/indexes/datetimelike.py b/pandas/tests/indexes/datetimelike.py index e32e18ea0ec4a..7af8b259fa137 100644 --- a/pandas/tests/indexes/datetimelike.py +++ b/pandas/tests/indexes/datetimelike.py @@ -8,6 +8,18 @@ class DatetimeLike(Base): + def test_argmax_axis_invalid(self): + # GH#23081 + rng = self.create_index() + with pytest.raises(ValueError): + rng.argmax(axis=1) + with pytest.raises(ValueError): + rng.argmin(axis=2) + with pytest.raises(ValueError): + rng.min(axis=-2) + with pytest.raises(ValueError): + rng.max(axis=-3) + def test_can_hold_identifiers(self): idx = self.create_index() key = idx[0]