@@ -285,25 +285,6 @@ def get_epoch():
285
285
return _epoch
286
286
287
287
288
- def _to_ordinalf (dt ):
289
- """
290
- Convert :mod:`datetime` or :mod:`date` to the Gregorian date as UTC float
291
- days, preserving hours, minutes, seconds and microseconds. Return value
292
- is a `float`.
293
- """
294
- # Convert to UTC
295
- tzi = getattr (dt , 'tzinfo' , None )
296
- if tzi is not None :
297
- dt = dt .astimezone (UTC )
298
- dt = dt .replace (tzinfo = None )
299
- dt64 = np .datetime64 (dt )
300
- return _dt64_to_ordinalf (dt64 )
301
-
302
-
303
- # a version of _to_ordinalf that can operate on numpy arrays
304
- _to_ordinalf_np_vectorized = np .vectorize (_to_ordinalf )
305
-
306
-
307
288
def _dt64_to_ordinalf (d ):
308
289
"""
309
290
Convert `numpy.datetime64` or an ndarray of those types to Gregorian
@@ -428,20 +409,29 @@ def date2num(d):
428
409
if hasattr (d , "values" ):
429
410
# this unpacks pandas series or dataframes...
430
411
d = d .values
431
- if not np .iterable (d ):
432
- if (isinstance (d , np .datetime64 ) or
433
- (isinstance (d , np .ndarray ) and
434
- np .issubdtype (d .dtype , np .datetime64 ))):
435
- return _dt64_to_ordinalf (d )
436
- return _to_ordinalf (d )
437
412
438
- else :
439
- d = np .asarray (d )
440
- if np .issubdtype (d .dtype , np .datetime64 ):
441
- return _dt64_to_ordinalf (d )
413
+ # make an iterable, but save state to unpack later:
414
+ iterable = np .iterable (d )
415
+ if not iterable :
416
+ d = [d ]
417
+
418
+ d = np .asarray (d )
419
+ # convert to datetime64 arrays, if not already:
420
+ if not np .issubdtype (d .dtype , np .datetime64 ):
421
+ # datetime arrays
442
422
if not d .size :
423
+ # deals with an empty array...
443
424
return d
444
- return _to_ordinalf_np_vectorized (d )
425
+ tzi = getattr (d [0 ], 'tzinfo' , None )
426
+ if tzi is not None :
427
+ # make datetime naive:
428
+ d = [dt .astimezone (UTC ).replace (tzinfo = None ) for dt in d ]
429
+ d = np .asarray (d )
430
+ d = d .astype ('datetime64[us]' )
431
+
432
+ d = _dt64_to_ordinalf (d )
433
+
434
+ return d if iterable else d [0 ]
445
435
446
436
447
437
def julian2num (j ):
0 commit comments