@@ -130,10 +130,15 @@ def get_duplicates(self):
130
130
values = Index .get_duplicates (self )
131
131
return self ._simple_new (values )
132
132
133
+ @cache_readonly
134
+ def _isnan (self ):
135
+ """ return if each value is nan"""
136
+ return (self .asi8 == tslib .iNaT )
137
+
133
138
@cache_readonly
134
139
def hasnans (self ):
135
140
""" return if I have any nans; enables various perf speedups """
136
- return ( self .asi8 == tslib . iNaT ) .any ()
141
+ return self ._isnan .any ()
137
142
138
143
@property
139
144
def asobject (self ):
@@ -157,12 +162,11 @@ def _maybe_mask_results(self, result, fill_value=None, convert=None):
157
162
"""
158
163
159
164
if self .hasnans :
160
- mask = self .asi8 == tslib .iNaT
161
165
if convert :
162
166
result = result .astype (convert )
163
167
if fill_value is None :
164
168
fill_value = np .nan
165
- result [mask ] = fill_value
169
+ result [self . _isnan ] = fill_value
166
170
return result
167
171
168
172
def tolist (self ):
@@ -188,8 +192,7 @@ def min(self, axis=None):
188
192
return self ._box_func (i8 [0 ])
189
193
190
194
if self .hasnans :
191
- mask = i8 == tslib .iNaT
192
- min_stamp = self [~ mask ].asi8 .min ()
195
+ min_stamp = self [~ self ._isnan ].asi8 .min ()
193
196
else :
194
197
min_stamp = i8 .min ()
195
198
return self ._box_func (min_stamp )
@@ -207,7 +210,7 @@ def argmin(self, axis=None):
207
210
208
211
i8 = self .asi8
209
212
if self .hasnans :
210
- mask = i8 == tslib . iNaT
213
+ mask = self . _isnan
211
214
if mask .all ():
212
215
return - 1
213
216
i8 = i8 .copy ()
@@ -231,8 +234,7 @@ def max(self, axis=None):
231
234
return self ._box_func (i8 [- 1 ])
232
235
233
236
if self .hasnans :
234
- mask = i8 == tslib .iNaT
235
- max_stamp = self [~ mask ].asi8 .max ()
237
+ max_stamp = self [~ self ._isnan ].asi8 .max ()
236
238
else :
237
239
max_stamp = i8 .max ()
238
240
return self ._box_func (max_stamp )
@@ -250,7 +252,7 @@ def argmax(self, axis=None):
250
252
251
253
i8 = self .asi8
252
254
if self .hasnans :
253
- mask = i8 == tslib . iNaT
255
+ mask = self . _isnan
254
256
if mask .all ():
255
257
return - 1
256
258
i8 = i8 .copy ()
@@ -381,9 +383,9 @@ def _add_delta_td(self, other):
381
383
# return the i8 result view
382
384
383
385
inc = tslib ._delta_to_nanoseconds (other )
384
- mask = self .asi8 == tslib .iNaT
385
386
new_values = (self .asi8 + inc ).view (self .dtype )
386
- new_values [mask ] = tslib .iNaT
387
+ if self .hasnans :
388
+ new_values [self ._isnan ] = tslib .iNaT
387
389
return new_values .view (self .dtype )
388
390
389
391
def _add_delta_tdi (self , other ):
@@ -396,9 +398,10 @@ def _add_delta_tdi(self, other):
396
398
397
399
self_i8 = self .asi8
398
400
other_i8 = other .asi8
399
- mask = (self_i8 == tslib .iNaT ) | (other_i8 == tslib .iNaT )
400
401
new_values = self_i8 + other_i8
401
- new_values [mask ] = tslib .iNaT
402
+ if self .hasnans or other .hasnans :
403
+ mask = (self ._isnan ) | (other ._isnan )
404
+ new_values [mask ] = tslib .iNaT
402
405
return new_values .view (self .dtype )
403
406
404
407
def isin (self , values ):
0 commit comments