@@ -66,60 +66,64 @@ def test_ops(self, opname, obj):
6666 expected = expected .astype ("M8[ns]" ).astype ("int64" )
6767 assert result .value == expected
6868
69- def test_nanops (self ):
69+ @pytest .mark .parametrize ("opname" , ["max" , "min" ])
70+ def test_nanops (self , opname , index_or_series ):
7071 # GH#7261
71- for opname in ["max" , "min" ]:
72- for klass in [Index , Series ]:
73- arg_op = "arg" + opname if klass is Index else "idx" + opname
74-
75- obj = klass ([np .nan , 2.0 ])
76- assert getattr (obj , opname )() == 2.0
77-
78- obj = klass ([np .nan ])
79- assert pd .isna (getattr (obj , opname )())
80- assert pd .isna (getattr (obj , opname )(skipna = False ))
81-
82- obj = klass ([], dtype = object )
83- assert pd .isna (getattr (obj , opname )())
84- assert pd .isna (getattr (obj , opname )(skipna = False ))
85-
86- obj = klass ([pd .NaT , datetime (2011 , 11 , 1 )])
87- # check DatetimeIndex monotonic path
88- assert getattr (obj , opname )() == datetime (2011 , 11 , 1 )
89- assert getattr (obj , opname )(skipna = False ) is pd .NaT
90-
91- assert getattr (obj , arg_op )() == 1
92- result = getattr (obj , arg_op )(skipna = False )
93- if klass is Series :
94- assert np .isnan (result )
95- else :
96- assert result == - 1
97-
98- obj = klass ([pd .NaT , datetime (2011 , 11 , 1 ), pd .NaT ])
99- # check DatetimeIndex non-monotonic path
100- assert getattr (obj , opname )(), datetime (2011 , 11 , 1 )
101- assert getattr (obj , opname )(skipna = False ) is pd .NaT
102-
103- assert getattr (obj , arg_op )() == 1
104- result = getattr (obj , arg_op )(skipna = False )
105- if klass is Series :
106- assert np .isnan (result )
107- else :
108- assert result == - 1
109-
110- for dtype in ["M8[ns]" , "datetime64[ns, UTC]" ]:
111- # cases with empty Series/DatetimeIndex
112- obj = klass ([], dtype = dtype )
113-
114- assert getattr (obj , opname )() is pd .NaT
115- assert getattr (obj , opname )(skipna = False ) is pd .NaT
116-
117- with pytest .raises (ValueError , match = "empty sequence" ):
118- getattr (obj , arg_op )()
119- with pytest .raises (ValueError , match = "empty sequence" ):
120- getattr (obj , arg_op )(skipna = False )
121-
122- # argmin/max
72+ klass = index_or_series
73+ arg_op = "arg" + opname if klass is Index else "idx" + opname
74+
75+ obj = klass ([np .nan , 2.0 ])
76+ assert getattr (obj , opname )() == 2.0
77+
78+ obj = klass ([np .nan ])
79+ assert pd .isna (getattr (obj , opname )())
80+ assert pd .isna (getattr (obj , opname )(skipna = False ))
81+
82+ obj = klass ([], dtype = object )
83+ assert pd .isna (getattr (obj , opname )())
84+ assert pd .isna (getattr (obj , opname )(skipna = False ))
85+
86+ obj = klass ([pd .NaT , datetime (2011 , 11 , 1 )])
87+ # check DatetimeIndex monotonic path
88+ assert getattr (obj , opname )() == datetime (2011 , 11 , 1 )
89+ assert getattr (obj , opname )(skipna = False ) is pd .NaT
90+
91+ assert getattr (obj , arg_op )() == 1
92+ result = getattr (obj , arg_op )(skipna = False )
93+ if klass is Series :
94+ assert np .isnan (result )
95+ else :
96+ assert result == - 1
97+
98+ obj = klass ([pd .NaT , datetime (2011 , 11 , 1 ), pd .NaT ])
99+ # check DatetimeIndex non-monotonic path
100+ assert getattr (obj , opname )(), datetime (2011 , 11 , 1 )
101+ assert getattr (obj , opname )(skipna = False ) is pd .NaT
102+
103+ assert getattr (obj , arg_op )() == 1
104+ result = getattr (obj , arg_op )(skipna = False )
105+ if klass is Series :
106+ assert np .isnan (result )
107+ else :
108+ assert result == - 1
109+
110+ @pytest .mark .parametrize ("opname" , ["max" , "min" ])
111+ @pytest .mark .parametrize ("dtype" , ["M8[ns]" , "datetime64[ns, UTC]" ])
112+ def test_nanops_empty_object (self , opname , index_or_series , dtype ):
113+ klass = index_or_series
114+ arg_op = "arg" + opname if klass is Index else "idx" + opname
115+
116+ obj = klass ([], dtype = dtype )
117+
118+ assert getattr (obj , opname )() is pd .NaT
119+ assert getattr (obj , opname )(skipna = False ) is pd .NaT
120+
121+ with pytest .raises (ValueError , match = "empty sequence" ):
122+ getattr (obj , arg_op )()
123+ with pytest .raises (ValueError , match = "empty sequence" ):
124+ getattr (obj , arg_op )(skipna = False )
125+
126+ def test_argminmax (self ):
123127 obj = Index (np .arange (5 , dtype = "int64" ))
124128 assert obj .argmin () == 0
125129 assert obj .argmax () == 4
@@ -224,16 +228,17 @@ def test_minmax_timedelta64(self):
224228 assert idx .argmin () == 0
225229 assert idx .argmax () == 2
226230
227- for op in ["min" , "max" ]:
228- # Return NaT
229- obj = TimedeltaIndex ([])
230- assert pd .isna (getattr (obj , op )())
231+ @pytest .mark .parametrize ("op" , ["min" , "max" ])
232+ def test_minmax_timedelta_empty_or_na (self , op ):
233+ # Return NaT
234+ obj = TimedeltaIndex ([])
235+ assert getattr (obj , op )() is pd .NaT
231236
232- obj = TimedeltaIndex ([pd .NaT ])
233- assert pd . isna ( getattr (obj , op )())
237+ obj = TimedeltaIndex ([pd .NaT ])
238+ assert getattr (obj , op )() is pd . NaT
234239
235- obj = TimedeltaIndex ([pd .NaT , pd .NaT , pd .NaT ])
236- assert pd . isna ( getattr (obj , op )())
240+ obj = TimedeltaIndex ([pd .NaT , pd .NaT , pd .NaT ])
241+ assert getattr (obj , op )() is pd . NaT
237242
238243 def test_numpy_minmax_timedelta64 (self ):
239244 td = timedelta_range ("16815 days" , "16820 days" , freq = "D" )
0 commit comments