@@ -55,7 +55,7 @@ def f(values, axis=None, skipna=True, **kwds):
55
55
56
56
def _bn_ok_dtype (dt ):
57
57
# Bottleneck chokes on datetime64
58
- return dt != np .object_ and not issubclass (dt .type , np .datetime64 )
58
+ return dt != np .object_ and not issubclass (dt .type , ( np .datetime64 , np . timedelta64 ) )
59
59
60
60
61
61
def _has_infs (result ):
@@ -69,6 +69,34 @@ def _has_infs(result):
69
69
else :
70
70
return np .isinf (result ) or np .isneginf (result )
71
71
72
+ def _isfinite (values ):
73
+ if issubclass (values .dtype .type , np .timedelta64 ):
74
+ return isnull (values )
75
+ return - np .isfinite (values )
76
+
77
+ def _na_ok_dtype (dtype ):
78
+ return not issubclass (dtype .type , (np .integer , np .datetime64 , np .timedelta64 ))
79
+
80
+ def _view_if_needed (values ):
81
+ if issubclass (values .dtype .type , (np .datetime64 ,np .timedelta64 )):
82
+ return values .view (np .int64 )
83
+ return values
84
+
85
+ def _wrap_results (result ,dtype ):
86
+ """ wrap our results if needed """
87
+
88
+ if issubclass (dtype .type , np .datetime64 ):
89
+ if not isinstance (result , np .ndarray ):
90
+ result = lib .Timestamp (result )
91
+ else :
92
+ result = result .view (dtype )
93
+ elif issubclass (dtype .type , np .timedelta64 ):
94
+ if not isinstance (result , np .ndarray ):
95
+ pass
96
+ else :
97
+ result = result .view (dtype )
98
+
99
+ return result
72
100
73
101
def nanany (values , axis = None , skipna = True ):
74
102
mask = isnull (values )
@@ -162,13 +190,11 @@ def _nanmin(values, axis=None, skipna=True):
162
190
163
191
dtype = values .dtype
164
192
165
- if skipna and not issubclass (dtype .type ,
166
- (np .integer , np .datetime64 )):
193
+ if skipna and _na_ok_dtype (dtype ):
167
194
values = values .copy ()
168
195
np .putmask (values , mask , np .inf )
169
196
170
- if issubclass (dtype .type , np .datetime64 ):
171
- values = values .view (np .int64 )
197
+ values = _view_if_needed (values )
172
198
173
199
# numpy 1.6.1 workaround in Python 3.x
174
200
if (values .dtype == np .object_
@@ -187,12 +213,7 @@ def _nanmin(values, axis=None, skipna=True):
187
213
else :
188
214
result = values .min (axis )
189
215
190
- if issubclass (dtype .type , np .datetime64 ):
191
- if not isinstance (result , np .ndarray ):
192
- result = lib .Timestamp (result )
193
- else :
194
- result = result .view (dtype )
195
-
216
+ result = _wrap_results (result ,dtype )
196
217
return _maybe_null_out (result , axis , mask )
197
218
198
219
@@ -201,12 +222,11 @@ def _nanmax(values, axis=None, skipna=True):
201
222
202
223
dtype = values .dtype
203
224
204
- if skipna and not issubclass (dtype . type , ( np . integer , np . datetime64 ) ):
225
+ if skipna and _na_ok_dtype (dtype ):
205
226
values = values .copy ()
206
227
np .putmask (values , mask , - np .inf )
207
228
208
- if issubclass (dtype .type , np .datetime64 ):
209
- values = values .view (np .int64 )
229
+ values = _view_if_needed (values )
210
230
211
231
# numpy 1.6.1 workaround in Python 3.x
212
232
if (values .dtype == np .object_
@@ -226,20 +246,16 @@ def _nanmax(values, axis=None, skipna=True):
226
246
else :
227
247
result = values .max (axis )
228
248
229
- if issubclass (dtype .type , np .datetime64 ):
230
- if not isinstance (result , np .ndarray ):
231
- result = lib .Timestamp (result )
232
- else :
233
- result = result .view (dtype )
234
-
249
+ result = _wrap_results (result ,dtype )
235
250
return _maybe_null_out (result , axis , mask )
236
251
237
252
238
253
def nanargmax (values , axis = None , skipna = True ):
239
254
"""
240
255
Returns -1 in the NA case
241
256
"""
242
- mask = - np .isfinite (values )
257
+ mask = _isfinite (values )
258
+ values = _view_if_needed (values )
243
259
if not issubclass (values .dtype .type , np .integer ):
244
260
values = values .copy ()
245
261
np .putmask (values , mask , - np .inf )
@@ -252,7 +268,8 @@ def nanargmin(values, axis=None, skipna=True):
252
268
"""
253
269
Returns -1 in the NA case
254
270
"""
255
- mask = - np .isfinite (values )
271
+ mask = _isfinite (values )
272
+ values = _view_if_needed (values )
256
273
if not issubclass (values .dtype .type , np .integer ):
257
274
values = values .copy ()
258
275
np .putmask (values , mask , np .inf )
0 commit comments