@@ -3493,6 +3493,189 @@ def test_construction_with_alt(self):
34933493 def test_pickle_compat_construction (self ):
34943494 pass
34953495
3496+ def test_construction_index_with_mixed_timezones (self ):
3497+ # GH 11488
3498+ # no tz results in DatetimeIndex
3499+ result = Index ([Timestamp ('2011-01-01' ), Timestamp ('2011-01-02' )], name = 'idx' )
3500+ exp = DatetimeIndex ([Timestamp ('2011-01-01' ), Timestamp ('2011-01-02' )], name = 'idx' )
3501+ self .assert_index_equal (result , exp , exact = True )
3502+ self .assertTrue (isinstance (result , DatetimeIndex ))
3503+ self .assertIsNone (result .tz )
3504+
3505+ # same tz results in DatetimeIndex
3506+ result = Index ([Timestamp ('2011-01-01 10:00' , tz = 'Asia/Tokyo' ),
3507+ Timestamp ('2011-01-02 10:00' , tz = 'Asia/Tokyo' )], name = 'idx' )
3508+ exp = DatetimeIndex ([Timestamp ('2011-01-01 10:00' ), Timestamp ('2011-01-02 10:00' )], tz = 'Asia/Tokyo' , name = 'idx' )
3509+ self .assert_index_equal (result , exp , exact = True )
3510+ self .assertTrue (isinstance (result , DatetimeIndex ))
3511+ self .assertIsNotNone (result .tz )
3512+ self .assertEqual (result .tz , exp .tz )
3513+
3514+ # same tz results in DatetimeIndex (DST)
3515+ result = Index ([Timestamp ('2011-01-01 10:00' , tz = 'US/Eastern' ),
3516+ Timestamp ('2011-08-01 10:00' , tz = 'US/Eastern' )], name = 'idx' )
3517+ exp = DatetimeIndex ([Timestamp ('2011-01-01 10:00' ), Timestamp ('2011-08-01 10:00' )],
3518+ tz = 'US/Eastern' , name = 'idx' )
3519+ self .assert_index_equal (result , exp , exact = True )
3520+ self .assertTrue (isinstance (result , DatetimeIndex ))
3521+ self .assertIsNotNone (result .tz )
3522+ self .assertEqual (result .tz , exp .tz )
3523+
3524+ # different tz results in Index(dtype=object)
3525+ result = Index ([Timestamp ('2011-01-01 10:00' ), Timestamp ('2011-01-02 10:00' , tz = 'US/Eastern' )], name = 'idx' )
3526+ exp = Index ([Timestamp ('2011-01-01 10:00' ), Timestamp ('2011-01-02 10:00' , tz = 'US/Eastern' )],
3527+ dtype = 'object' , name = 'idx' )
3528+ self .assert_index_equal (result , exp , exact = True )
3529+ self .assertFalse (isinstance (result , DatetimeIndex ))
3530+
3531+ result = Index ([Timestamp ('2011-01-01 10:00' , tz = 'Asia/Tokyo' ),
3532+ Timestamp ('2011-01-02 10:00' , tz = 'US/Eastern' )], name = 'idx' )
3533+ exp = Index ([Timestamp ('2011-01-01 10:00' , tz = 'Asia/Tokyo' ),
3534+ Timestamp ('2011-01-02 10:00' , tz = 'US/Eastern' )],
3535+ dtype = 'object' , name = 'idx' )
3536+ self .assert_index_equal (result , exp , exact = True )
3537+ self .assertFalse (isinstance (result , DatetimeIndex ))
3538+
3539+ # passing tz results in DatetimeIndex
3540+ result = Index ([Timestamp ('2011-01-01 10:00' ), Timestamp ('2011-01-02 10:00' , tz = 'US/Eastern' )],
3541+ tz = 'Asia/Tokyo' , name = 'idx' )
3542+ exp = DatetimeIndex ([Timestamp ('2011-01-01 19:00' ), Timestamp ('2011-01-03 00:00' )],
3543+ tz = 'Asia/Tokyo' , name = 'idx' )
3544+ self .assert_index_equal (result , exp , exact = True )
3545+ self .assertTrue (isinstance (result , DatetimeIndex ))
3546+
3547+ # length = 1
3548+ result = Index ([Timestamp ('2011-01-01' )], name = 'idx' )
3549+ exp = DatetimeIndex ([Timestamp ('2011-01-01' )], name = 'idx' )
3550+ self .assert_index_equal (result , exp , exact = True )
3551+ self .assertTrue (isinstance (result , DatetimeIndex ))
3552+ self .assertIsNone (result .tz )
3553+
3554+ # length = 1 with tz
3555+ result = Index ([Timestamp ('2011-01-01 10:00' , tz = 'Asia/Tokyo' )], name = 'idx' )
3556+ exp = DatetimeIndex ([Timestamp ('2011-01-01 10:00' )], tz = 'Asia/Tokyo' , name = 'idx' )
3557+ self .assert_index_equal (result , exp , exact = True )
3558+ self .assertTrue (isinstance (result , DatetimeIndex ))
3559+ self .assertIsNotNone (result .tz )
3560+ self .assertEqual (result .tz , exp .tz )
3561+
3562+ def test_construction_index_with_mixed_timezones_with_NaT (self ):
3563+ # GH 11488
3564+ result = Index ([pd .NaT , Timestamp ('2011-01-01' ),
3565+ pd .NaT , Timestamp ('2011-01-02' )], name = 'idx' )
3566+ exp = DatetimeIndex ([pd .NaT , Timestamp ('2011-01-01' ),
3567+ pd .NaT , Timestamp ('2011-01-02' )], name = 'idx' )
3568+ self .assert_index_equal (result , exp , exact = True )
3569+ self .assertTrue (isinstance (result , DatetimeIndex ))
3570+ self .assertIsNone (result .tz )
3571+
3572+ # same tz results in DatetimeIndex
3573+ result = Index ([pd .NaT , Timestamp ('2011-01-01 10:00' , tz = 'Asia/Tokyo' ),
3574+ pd .NaT , Timestamp ('2011-01-02 10:00' , tz = 'Asia/Tokyo' )], name = 'idx' )
3575+ exp = DatetimeIndex ([pd .NaT , Timestamp ('2011-01-01 10:00' ),
3576+ pd .NaT , Timestamp ('2011-01-02 10:00' )], tz = 'Asia/Tokyo' , name = 'idx' )
3577+ self .assert_index_equal (result , exp , exact = True )
3578+ self .assertTrue (isinstance (result , DatetimeIndex ))
3579+ self .assertIsNotNone (result .tz )
3580+ self .assertEqual (result .tz , exp .tz )
3581+
3582+ # same tz results in DatetimeIndex (DST)
3583+ result = Index ([Timestamp ('2011-01-01 10:00' , tz = 'US/Eastern' ),
3584+ pd .NaT , Timestamp ('2011-08-01 10:00' , tz = 'US/Eastern' )], name = 'idx' )
3585+ exp = DatetimeIndex ([Timestamp ('2011-01-01 10:00' ), pd .NaT , Timestamp ('2011-08-01 10:00' )],
3586+ tz = 'US/Eastern' , name = 'idx' )
3587+ self .assert_index_equal (result , exp , exact = True )
3588+ self .assertTrue (isinstance (result , DatetimeIndex ))
3589+ self .assertIsNotNone (result .tz )
3590+ self .assertEqual (result .tz , exp .tz )
3591+
3592+ # different tz results in Index(dtype=object)
3593+ result = Index ([pd .NaT , Timestamp ('2011-01-01 10:00' ),
3594+ pd .NaT , Timestamp ('2011-01-02 10:00' , tz = 'US/Eastern' )], name = 'idx' )
3595+ exp = Index ([pd .NaT , Timestamp ('2011-01-01 10:00' ),
3596+ pd .NaT , Timestamp ('2011-01-02 10:00' , tz = 'US/Eastern' )],
3597+ dtype = 'object' , name = 'idx' )
3598+ self .assert_index_equal (result , exp , exact = True )
3599+ self .assertFalse (isinstance (result , DatetimeIndex ))
3600+
3601+ result = Index ([pd .NaT , Timestamp ('2011-01-01 10:00' , tz = 'Asia/Tokyo' ),
3602+ pd .NaT , Timestamp ('2011-01-02 10:00' , tz = 'US/Eastern' )], name = 'idx' )
3603+ exp = Index ([pd .NaT , Timestamp ('2011-01-01 10:00' , tz = 'Asia/Tokyo' ),
3604+ pd .NaT , Timestamp ('2011-01-02 10:00' , tz = 'US/Eastern' )],
3605+ dtype = 'object' , name = 'idx' )
3606+ self .assert_index_equal (result , exp , exact = True )
3607+ self .assertFalse (isinstance (result , DatetimeIndex ))
3608+
3609+ # passing tz results in DatetimeIndex
3610+ result = Index ([pd .NaT , Timestamp ('2011-01-01 10:00' ),
3611+ pd .NaT , Timestamp ('2011-01-02 10:00' , tz = 'US/Eastern' )],
3612+ tz = 'Asia/Tokyo' , name = 'idx' )
3613+ exp = DatetimeIndex ([pd .NaT , Timestamp ('2011-01-01 19:00' ),
3614+ pd .NaT , Timestamp ('2011-01-03 00:00' )],
3615+ tz = 'Asia/Tokyo' , name = 'idx' )
3616+ self .assert_index_equal (result , exp , exact = True )
3617+ self .assertTrue (isinstance (result , DatetimeIndex ))
3618+
3619+ # all NaT
3620+ result = Index ([pd .NaT , pd .NaT ], name = 'idx' )
3621+ exp = DatetimeIndex ([pd .NaT , pd .NaT ], name = 'idx' )
3622+ self .assert_index_equal (result , exp , exact = True )
3623+ self .assertTrue (isinstance (result , DatetimeIndex ))
3624+ self .assertIsNone (result .tz )
3625+
3626+ # all NaT with tz
3627+ result = Index ([pd .NaT , pd .NaT ], tz = 'Asia/Tokyo' , name = 'idx' )
3628+ exp = DatetimeIndex ([pd .NaT , pd .NaT ], tz = 'Asia/Tokyo' , name = 'idx' )
3629+ self .assert_index_equal (result , exp , exact = True )
3630+ self .assertTrue (isinstance (result , DatetimeIndex ))
3631+ self .assertIsNotNone (result .tz )
3632+ self .assertEqual (result .tz , exp .tz )
3633+
3634+ def test_construction_dti_with_mixed_timezones (self ):
3635+ # GH 11488 (not changed, added explicit tests)
3636+
3637+ # no tz results in DatetimeIndex
3638+ result = DatetimeIndex ([Timestamp ('2011-01-01' ), Timestamp ('2011-01-02' )], name = 'idx' )
3639+ exp = DatetimeIndex ([Timestamp ('2011-01-01' ), Timestamp ('2011-01-02' )], name = 'idx' )
3640+ self .assert_index_equal (result , exp , exact = True )
3641+ self .assertTrue (isinstance (result , DatetimeIndex ))
3642+
3643+ # same tz results in DatetimeIndex
3644+ result = DatetimeIndex ([Timestamp ('2011-01-01 10:00' , tz = 'Asia/Tokyo' ),
3645+ Timestamp ('2011-01-02 10:00' , tz = 'Asia/Tokyo' )], name = 'idx' )
3646+ exp = DatetimeIndex ([Timestamp ('2011-01-01 10:00' ), Timestamp ('2011-01-02 10:00' )], tz = 'Asia/Tokyo' , name = 'idx' )
3647+ self .assert_index_equal (result , exp , exact = True )
3648+ self .assertTrue (isinstance (result , DatetimeIndex ))
3649+
3650+ # same tz results in DatetimeIndex (DST)
3651+ result = DatetimeIndex ([Timestamp ('2011-01-01 10:00' , tz = 'US/Eastern' ),
3652+ Timestamp ('2011-08-01 10:00' , tz = 'US/Eastern' )], name = 'idx' )
3653+ exp = DatetimeIndex ([Timestamp ('2011-01-01 10:00' ), Timestamp ('2011-08-01 10:00' )],
3654+ tz = 'US/Eastern' , name = 'idx' )
3655+ self .assert_index_equal (result , exp , exact = True )
3656+ self .assertTrue (isinstance (result , DatetimeIndex ))
3657+
3658+ # different tz coerces tz-naive to tz-awareIndex(dtype=object)
3659+ result = DatetimeIndex ([Timestamp ('2011-01-01 10:00' ),
3660+ Timestamp ('2011-01-02 10:00' , tz = 'US/Eastern' )], name = 'idx' )
3661+ exp = DatetimeIndex ([Timestamp ('2011-01-01 05:00' ), Timestamp ('2011-01-02 10:00' )],
3662+ tz = 'US/Eastern' , name = 'idx' )
3663+ self .assert_index_equal (result , exp , exact = True )
3664+ self .assertTrue (isinstance (result , DatetimeIndex ))
3665+
3666+ # tz mismatch affecting to tz-aware raises TypeError/ValueError
3667+ with tm .assertRaises (ValueError ):
3668+ DatetimeIndex ([Timestamp ('2011-01-01 10:00' , tz = 'Asia/Tokyo' ),
3669+ Timestamp ('2011-01-02 10:00' , tz = 'US/Eastern' )], name = 'idx' )
3670+
3671+ with tm .assertRaises (TypeError ):
3672+ DatetimeIndex ([Timestamp ('2011-01-01 10:00' ), Timestamp ('2011-01-02 10:00' , tz = 'US/Eastern' )],
3673+ tz = 'Asia/Tokyo' , name = 'idx' )
3674+
3675+ with tm .assertRaises (ValueError ):
3676+ DatetimeIndex ([Timestamp ('2011-01-01 10:00' , tz = 'Asia/Tokyo' ),
3677+ Timestamp ('2011-01-02 10:00' , tz = 'US/Eastern' )], tz = 'US/Eastern' , name = 'idx' )
3678+
34963679 def test_get_loc (self ):
34973680 idx = pd .date_range ('2000-01-01' , periods = 3 )
34983681
0 commit comments