11cimport util
2+ from tslib import NaT
23
34_TYPE_MAP = {
45 np.int8: ' integer' ,
@@ -55,14 +56,18 @@ def infer_dtype(object _values):
5556
5657 val = util.get_value_1d(values, 0 )
5758
58- if util.is_datetime64_object(val):
59+ if util.is_datetime64_object(val) or val is NaT :
5960 if is_datetime64_array(values):
6061 return ' datetime64'
62+ elif is_timedelta_or_timedelta64_array(values):
63+ return ' timedelta'
6164 elif util.is_integer_object(val):
6265 if is_integer_array(values):
6366 return ' integer'
6467 elif is_integer_float_array(values):
6568 return ' mixed-integer-float'
69+ elif is_timedelta_or_timedelta64_array(values):
70+ return ' timedelta'
6671 return ' mixed-integer'
6772 elif is_datetime(val):
6873 if is_datetime_array(values):
@@ -258,20 +263,24 @@ def is_unicode_array(ndarray values):
258263
259264def is_datetime_array (ndarray[object] values ):
260265 cdef int i, n = len (values)
266+ cdef object v
261267 if n == 0 :
262268 return False
263269 for i in range (n):
264- if not is_datetime(values[i]):
270+ v = values[i]
271+ if not (is_datetime(v) or util._checknull(v) or v is NaT):
265272 return False
266273 return True
267274
268275
269276def is_datetime64_array (ndarray values ):
270277 cdef int i, n = len (values)
278+ cdef object v
271279 if n == 0 :
272280 return False
273281 for i in range (n):
274- if not util.is_datetime64_object(values[i]):
282+ v = values[i]
283+ if not (util.is_datetime64_object(v) or util._checknull(v) or v is NaT):
275284 return False
276285 return True
277286
@@ -299,12 +308,15 @@ def is_timedelta64_array(ndarray values):
299308 return True
300309
301310def is_timedelta_or_timedelta64_array (ndarray values ):
311+ """ infer with timedeltas and/or nat/none """
302312 import datetime
303313 cdef int i, n = len (values)
314+ cdef object v
304315 if n == 0 :
305316 return False
306317 for i in range (n):
307- if not (isinstance (values[i],datetime.timedelta) or isinstance (values[i],np.timedelta64)):
318+ v = values[i]
319+ if not (isinstance (v,datetime.timedelta) or isinstance (v,np.timedelta64) or util._checknull(v) or v is NaT):
308320 return False
309321 return True
310322
@@ -427,7 +439,7 @@ def maybe_convert_numeric(ndarray[object] values, set na_values,
427439 return ints
428440
429441def maybe_convert_objects (ndarray[object] objects , bint try_float = 0 ,
430- bint safe = 0 , bint convert_datetime = 0 ):
442+ bint safe = 0 , bint convert_datetime = 0 , bint convert_timedelta = 0 ):
431443 '''
432444 Type inference function-- convert object array to proper dtype
433445 '''
@@ -438,9 +450,11 @@ def maybe_convert_objects(ndarray[object] objects, bint try_float=0,
438450 ndarray[int64_t] ints
439451 ndarray[uint8_t] bools
440452 ndarray[int64_t] idatetimes
453+ ndarray[int64_t] itimedeltas
441454 bint seen_float = 0
442455 bint seen_complex = 0
443456 bint seen_datetime = 0
457+ bint seen_timedelta = 0
444458 bint seen_int = 0
445459 bint seen_bool = 0
446460 bint seen_object = 0
@@ -457,6 +471,8 @@ def maybe_convert_objects(ndarray[object] objects, bint try_float=0,
457471 bools = np.empty(n, dtype = np.uint8)
458472 datetimes = np.empty(n, dtype = ' M8[ns]' )
459473 idatetimes = datetimes.view(np.int64)
474+ timedeltas = np.empty(n, dtype = ' m8[ns]' )
475+ itimedeltas = timedeltas.view(np.int64)
460476
461477 onan = np.nan
462478 fnan = np.nan
@@ -481,9 +497,13 @@ def maybe_convert_objects(ndarray[object] objects, bint try_float=0,
481497 seen_object = 1
482498 # objects[i] = val.astype('O')
483499 break
484- elif util.is_timedelta64_object(val):
485- seen_object = 1
486- break
500+ elif is_timedelta(val):
501+ if convert_timedelta:
502+ itimedeltas[i] = convert_to_timedelta64(val, ' ns' )
503+ seen_timedelta = 1
504+ else :
505+ seen_object = 1
506+ break
487507 elif util.is_integer_object(val):
488508 seen_int = 1
489509 floats[i] = < float64_t> val
@@ -523,7 +543,7 @@ def maybe_convert_objects(ndarray[object] objects, bint try_float=0,
523543
524544 if not safe:
525545 if seen_null:
526- if not seen_bool and not seen_datetime:
546+ if not seen_bool and not seen_datetime and not seen_timedelta :
527547 if seen_complex:
528548 return complexes
529549 elif seen_float or seen_int:
@@ -533,20 +553,23 @@ def maybe_convert_objects(ndarray[object] objects, bint try_float=0,
533553 if seen_datetime:
534554 if not seen_numeric:
535555 return datetimes
556+ elif seen_timedelta:
557+ if not seen_numeric:
558+ return timedeltas
536559 else :
537560 if seen_complex:
538561 return complexes
539562 elif seen_float:
540563 return floats
541564 elif seen_int:
542565 return ints
543- elif not seen_datetime and not seen_numeric:
566+ elif not seen_datetime and not seen_numeric and not seen_timedelta :
544567 return bools.view(np.bool_)
545568
546569 else :
547570 # don't cast int to float, etc.
548571 if seen_null:
549- if not seen_bool and not seen_datetime:
572+ if not seen_bool and not seen_datetime and not seen_timedelta :
550573 if seen_complex:
551574 if not seen_int:
552575 return complexes
@@ -558,6 +581,9 @@ def maybe_convert_objects(ndarray[object] objects, bint try_float=0,
558581 if seen_datetime:
559582 if not seen_numeric:
560583 return datetimes
584+ elif seen_timedelta:
585+ if not seen_numeric:
586+ return timedeltas
561587 else :
562588 if seen_complex:
563589 if not seen_int:
@@ -567,7 +593,7 @@ def maybe_convert_objects(ndarray[object] objects, bint try_float=0,
567593 return floats
568594 elif seen_int:
569595 return ints
570- elif not seen_datetime and not seen_numeric:
596+ elif not seen_datetime and not seen_numeric and not seen_timedelta :
571597 return bools.view(np.bool_)
572598
573599 return objects
0 commit comments