66from pandas .core import common as com
77import pandas .core .nanops as nanops
88import pandas .tslib as tslib
9-
9+ from pandas . util . decorators import cache_readonly
1010
1111class StringMixin (object ):
1212
@@ -401,6 +401,11 @@ def _box_values(self, values):
401401 import pandas .lib as lib
402402 return lib .map_infer (values , self ._box_func )
403403
404+ @cache_readonly
405+ def hasnans (self ):
406+ """ return if I have any nans; enables various perf speedups """
407+ return (self .asi8 == tslib .iNaT ).any ()
408+
404409 @property
405410 def asobject (self ):
406411 from pandas .core .index import Index
@@ -417,11 +422,18 @@ def min(self, axis=None):
417422 Overridden ndarray.min to return an object
418423 """
419424 try :
420- mask = self .asi8 == tslib .iNaT
421- if mask .any ():
425+ i8 = self .asi8
426+
427+ # quick check
428+ if len (i8 ) and self .is_monotonic :
429+ if i8 [0 ] != tslib .iNaT :
430+ return self ._box_func (i8 [0 ])
431+
432+ if self .hasnans :
433+ mask = i8 == tslib .iNaT
422434 min_stamp = self [~ mask ].asi8 .min ()
423435 else :
424- min_stamp = self . asi8 .min ()
436+ min_stamp = i8 .min ()
425437 return self ._box_func (min_stamp )
426438 except ValueError :
427439 return self ._na_value
@@ -431,11 +443,18 @@ def max(self, axis=None):
431443 Overridden ndarray.max to return an object
432444 """
433445 try :
434- mask = self .asi8 == tslib .iNaT
435- if mask .any ():
446+ i8 = self .asi8
447+
448+ # quick check
449+ if len (i8 ) and self .is_monotonic :
450+ if i8 [- 1 ] != tslib .iNaT :
451+ return self ._box_func (i8 [- 1 ])
452+
453+ if self .hasnans :
454+ mask = i8 == tslib .iNaT
436455 max_stamp = self [~ mask ].asi8 .max ()
437456 else :
438- max_stamp = self . asi8 .max ()
457+ max_stamp = i8 .max ()
439458 return self ._box_func (max_stamp )
440459 except ValueError :
441460 return self ._na_value
0 commit comments