@@ -395,57 +395,43 @@ def __new__(cls, data=None,
395
395
396
396
# data must be Index or np.ndarray here
397
397
if not (is_datetime64_dtype (data ) or is_datetimetz (data ) or
398
- is_integer_dtype (data )):
398
+ is_integer_dtype (data ) or lib . infer_dtype ( data ) == 'integer' ):
399
399
data = tools .to_datetime (data , dayfirst = dayfirst ,
400
400
yearfirst = yearfirst )
401
401
402
- if issubclass (data .dtype .type , np .datetime64 ) or is_datetimetz (data ):
403
-
404
- if isinstance (data , DatetimeIndex ):
405
- if tz is None :
406
- tz = data .tz
407
- elif data .tz is None :
408
- data = data .tz_localize (tz , ambiguous = ambiguous )
409
- else :
410
- # the tz's must match
411
- if str (tz ) != str (data .tz ):
412
- msg = ('data is already tz-aware {0}, unable to '
413
- 'set specified tz: {1}' )
414
- raise TypeError (msg .format (data .tz , tz ))
402
+ if isinstance (data , DatetimeIndex ):
403
+ if tz is None :
404
+ tz = data .tz
405
+ elif data .tz is None :
406
+ data = data .tz_localize (tz , ambiguous = ambiguous )
407
+ else :
408
+ # the tz's must match
409
+ if str (tz ) != str (data .tz ):
410
+ msg = ('data is already tz-aware {0}, unable to '
411
+ 'set specified tz: {1}' )
412
+ raise TypeError (msg .format (data .tz , tz ))
415
413
416
- subarr = data .values
414
+ subarr = data .values
417
415
418
- if freq is None :
419
- freq = data .freq
420
- verify_integrity = False
421
- else :
422
- if data .dtype != _NS_DTYPE :
423
- subarr = conversion .ensure_datetime64ns (data )
424
- else :
425
- subarr = data
416
+ if freq is None :
417
+ freq = data .freq
418
+ verify_integrity = False
419
+ elif issubclass (data .dtype .type , np .datetime64 ):
420
+ if data .dtype != _NS_DTYPE :
421
+ data = conversion .ensure_datetime64ns (data )
422
+ if tz is not None :
423
+ # Convert tz-naive to UTC
424
+ tz = timezones .maybe_get_tz (tz )
425
+ data = conversion .tz_localize_to_utc (data .view ('i8' ), tz ,
426
+ ambiguous = ambiguous )
427
+ subarr = data .view (_NS_DTYPE )
426
428
else :
427
429
# must be integer dtype otherwise
428
- if isinstance (data , Int64Index ):
429
- raise TypeError ('cannot convert Int64Index->DatetimeIndex' )
430
+ # assume this data are epoch timestamps
430
431
if data .dtype != _INT64_DTYPE :
431
- data = data .astype (np .int64 )
432
+ data = data .astype (np .int64 , copy = False )
432
433
subarr = data .view (_NS_DTYPE )
433
434
434
- if isinstance (subarr , DatetimeIndex ):
435
- if tz is None :
436
- tz = subarr .tz
437
- else :
438
- if tz is not None :
439
- tz = timezones .maybe_get_tz (tz )
440
-
441
- if (not isinstance (data , DatetimeIndex ) or
442
- getattr (data , 'tz' , None ) is None ):
443
- # Convert tz-naive to UTC
444
- ints = subarr .view ('i8' )
445
- subarr = conversion .tz_localize_to_utc (ints , tz ,
446
- ambiguous = ambiguous )
447
- subarr = subarr .view (_NS_DTYPE )
448
-
449
435
subarr = cls ._simple_new (subarr , name = name , freq = freq , tz = tz )
450
436
if dtype is not None :
451
437
if not is_dtype_equal (subarr .dtype , dtype ):
@@ -807,8 +793,9 @@ def _mpl_repr(self):
807
793
808
794
@cache_readonly
809
795
def _is_dates_only (self ):
796
+ """Return a boolean if we are only dates (and don't have a timezone)"""
810
797
from pandas .io .formats .format import _is_dates_only
811
- return _is_dates_only (self .values )
798
+ return _is_dates_only (self .values ) and self . tz is None
812
799
813
800
@property
814
801
def _formatter_func (self ):
@@ -1244,7 +1231,7 @@ def join(self, other, how='left', level=None, return_indexers=False,
1244
1231
See Index.join
1245
1232
"""
1246
1233
if (not isinstance (other , DatetimeIndex ) and len (other ) > 0 and
1247
- other .inferred_type not in ('floating' , 'mixed-integer' ,
1234
+ other .inferred_type not in ('floating' , 'integer' , ' mixed-integer' ,
1248
1235
'mixed-integer-float' , 'mixed' )):
1249
1236
try :
1250
1237
other = DatetimeIndex (other )
@@ -2100,8 +2087,9 @@ def normalize(self):
2100
2087
dtype='datetime64[ns, Asia/Calcutta]', freq=None)
2101
2088
"""
2102
2089
new_values = conversion .date_normalize (self .asi8 , self .tz )
2103
- return DatetimeIndex (new_values , freq = 'infer' , name = self .name ,
2104
- tz = self .tz )
2090
+ return DatetimeIndex (new_values ,
2091
+ freq = 'infer' ,
2092
+ name = self .name ).tz_localize (self .tz )
2105
2093
2106
2094
@Substitution (klass = 'DatetimeIndex' )
2107
2095
@Appender (_shared_docs ['searchsorted' ])
@@ -2182,8 +2170,6 @@ def insert(self, loc, item):
2182
2170
try :
2183
2171
new_dates = np .concatenate ((self [:loc ].asi8 , [item .view (np .int64 )],
2184
2172
self [loc :].asi8 ))
2185
- if self .tz is not None :
2186
- new_dates = conversion .tz_convert (new_dates , 'UTC' , self .tz )
2187
2173
return DatetimeIndex (new_dates , name = self .name , freq = freq ,
2188
2174
tz = self .tz )
2189
2175
except (AttributeError , TypeError ):
@@ -2221,8 +2207,6 @@ def delete(self, loc):
2221
2207
if (loc .start in (0 , None ) or loc .stop in (len (self ), None )):
2222
2208
freq = self .freq
2223
2209
2224
- if self .tz is not None :
2225
- new_dates = conversion .tz_convert (new_dates , 'UTC' , self .tz )
2226
2210
return DatetimeIndex (new_dates , name = self .name , freq = freq , tz = self .tz )
2227
2211
2228
2212
def tz_convert (self , tz ):
0 commit comments