@@ -481,6 +481,8 @@ def test_factorize(self):
481
481
482
482
class TestDatetimeIndexOps (Ops ):
483
483
_allowed = '_allow_datetime_index_ops'
484
+ tz = [None , 'UTC' , 'Asia/Tokyo' , 'US/Eastern' ,
485
+ 'dateutil/Asia/Singapore' , 'dateutil/US/Pacific' ]
484
486
485
487
def setUp (self ):
486
488
super (TestDatetimeIndexOps , self ).setUp ()
@@ -545,7 +547,7 @@ def test_asobject_tolist(self):
545
547
self .assertEqual (idx .tolist (), expected_list )
546
548
547
549
def test_minmax (self ):
548
- for tz in [ None , 'Asia/Tokyo' , 'US/Eastern' ] :
550
+ for tz in self . tz :
549
551
# monotonic
550
552
idx1 = pd .DatetimeIndex ([pd .NaT , '2011-01-01' , '2011-01-02' ,
551
553
'2011-01-03' ], tz = tz )
@@ -613,6 +615,100 @@ def test_resolution(self):
613
615
idx = pd .date_range (start = '2013-04-01' , periods = 30 , freq = freq , tz = tz )
614
616
self .assertEqual (idx .resolution , expected )
615
617
618
+ def test_add_iadd (self ):
619
+ for tz in self .tz :
620
+ # union
621
+ rng1 = pd .date_range ('1/1/2000' , freq = 'D' , periods = 5 , tz = tz )
622
+ other1 = pd .date_range ('1/6/2000' , freq = 'D' , periods = 5 , tz = tz )
623
+ expected1 = pd .date_range ('1/1/2000' , freq = 'D' , periods = 10 , tz = tz )
624
+
625
+ rng2 = pd .date_range ('1/1/2000' , freq = 'D' , periods = 5 , tz = tz )
626
+ other2 = pd .date_range ('1/4/2000' , freq = 'D' , periods = 5 , tz = tz )
627
+ expected2 = pd .date_range ('1/1/2000' , freq = 'D' , periods = 8 , tz = tz )
628
+
629
+ rng3 = pd .date_range ('1/1/2000' , freq = 'D' , periods = 5 , tz = tz )
630
+ other3 = pd .DatetimeIndex ([], tz = tz )
631
+ expected3 = pd .date_range ('1/1/2000' , freq = 'D' , periods = 5 , tz = tz )
632
+
633
+ for rng , other , expected in [(rng1 , other1 , expected1 ), (rng2 , other2 , expected2 ),
634
+ (rng3 , other3 , expected3 )]:
635
+ result_add = rng + other
636
+ result_union = rng .union (other )
637
+
638
+ tm .assert_index_equal (result_add , expected )
639
+ tm .assert_index_equal (result_union , expected )
640
+ rng += other
641
+ tm .assert_index_equal (rng , expected )
642
+
643
+ # offset
644
+ if _np_version_under1p7 :
645
+ offsets = [pd .offsets .Hour (2 ), timedelta (hours = 2 )]
646
+ else :
647
+ offsets = [pd .offsets .Hour (2 ), timedelta (hours = 2 ), np .timedelta64 (2 , 'h' )]
648
+
649
+ for delta in offsets :
650
+ rng = pd .date_range ('2000-01-01' , '2000-02-01' , tz = tz )
651
+ result = rng + delta
652
+ expected = pd .date_range ('2000-01-01 02:00' , '2000-02-01 02:00' , tz = tz )
653
+ tm .assert_index_equal (result , expected )
654
+ rng += delta
655
+ tm .assert_index_equal (rng , expected )
656
+
657
+ # int
658
+ rng = pd .date_range ('2000-01-01 09:00' , freq = 'H' , periods = 10 , tz = tz )
659
+ result = rng + 1
660
+ expected = pd .date_range ('2000-01-01 10:00' , freq = 'H' , periods = 10 , tz = tz )
661
+ tm .assert_index_equal (result , expected )
662
+ rng += 1
663
+ tm .assert_index_equal (rng , expected )
664
+
665
+ def test_sub_isub (self ):
666
+ for tz in self .tz :
667
+ # diff
668
+ rng1 = pd .date_range ('1/1/2000' , freq = 'D' , periods = 5 , tz = tz )
669
+ other1 = pd .date_range ('1/6/2000' , freq = 'D' , periods = 5 , tz = tz )
670
+ expected1 = pd .date_range ('1/1/2000' , freq = 'D' , periods = 5 , tz = tz )
671
+
672
+ rng2 = pd .date_range ('1/1/2000' , freq = 'D' , periods = 5 , tz = tz )
673
+ other2 = pd .date_range ('1/4/2000' , freq = 'D' , periods = 5 , tz = tz )
674
+ expected2 = pd .date_range ('1/1/2000' , freq = 'D' , periods = 3 , tz = tz )
675
+
676
+ rng3 = pd .date_range ('1/1/2000' , freq = 'D' , periods = 5 , tz = tz )
677
+ other3 = pd .DatetimeIndex ([], tz = tz )
678
+ expected3 = pd .date_range ('1/1/2000' , freq = 'D' , periods = 5 , tz = tz )
679
+
680
+ for rng , other , expected in [(rng1 , other1 , expected1 ), (rng2 , other2 , expected2 ),
681
+ (rng3 , other3 , expected3 )]:
682
+ result_add = rng - other
683
+ result_union = rng .diff (other )
684
+
685
+ tm .assert_index_equal (result_add , expected )
686
+ tm .assert_index_equal (result_union , expected )
687
+ rng -= other
688
+ tm .assert_index_equal (rng , expected )
689
+
690
+ # offset
691
+ if _np_version_under1p7 :
692
+ offsets = [pd .offsets .Hour (2 ), timedelta (hours = 2 )]
693
+ else :
694
+ offsets = [pd .offsets .Hour (2 ), timedelta (hours = 2 ), np .timedelta64 (2 , 'h' )]
695
+
696
+ for delta in offsets :
697
+ rng = pd .date_range ('2000-01-01' , '2000-02-01' , tz = tz )
698
+ result = rng - delta
699
+ expected = pd .date_range ('1999-12-31 22:00' , '2000-01-31 22:00' , tz = tz )
700
+ tm .assert_index_equal (result , expected )
701
+ rng -= delta
702
+ tm .assert_index_equal (rng , expected )
703
+
704
+ # int
705
+ rng = pd .date_range ('2000-01-01 09:00' , freq = 'H' , periods = 10 , tz = tz )
706
+ result = rng - 1
707
+ expected = pd .date_range ('2000-01-01 08:00' , freq = 'H' , periods = 10 , tz = tz )
708
+ tm .assert_index_equal (result , expected )
709
+ rng -= 1
710
+ tm .assert_index_equal (rng , expected )
711
+
616
712
617
713
class TestPeriodIndexOps (Ops ):
618
714
_allowed = '_allow_period_index_ops'
@@ -745,6 +841,133 @@ def test_resolution(self):
745
841
idx = pd .period_range (start = '2013-04-01' , periods = 30 , freq = freq )
746
842
self .assertEqual (idx .resolution , expected )
747
843
844
+ def test_add_iadd (self ):
845
+ # union
846
+ rng1 = pd .period_range ('1/1/2000' , freq = 'D' , periods = 5 )
847
+ other1 = pd .period_range ('1/6/2000' , freq = 'D' , periods = 5 )
848
+ expected1 = pd .period_range ('1/1/2000' , freq = 'D' , periods = 10 )
849
+
850
+ rng2 = pd .period_range ('1/1/2000' , freq = 'D' , periods = 5 )
851
+ other2 = pd .period_range ('1/4/2000' , freq = 'D' , periods = 5 )
852
+ expected2 = pd .period_range ('1/1/2000' , freq = 'D' , periods = 8 )
853
+
854
+ rng3 = pd .period_range ('1/1/2000' , freq = 'D' , periods = 5 )
855
+ other3 = pd .PeriodIndex ([], freq = 'D' )
856
+ expected3 = pd .period_range ('1/1/2000' , freq = 'D' , periods = 5 )
857
+
858
+ rng4 = pd .period_range ('2000-01-01 09:00' , freq = 'H' , periods = 5 )
859
+ other4 = pd .period_range ('2000-01-02 09:00' , freq = 'H' , periods = 5 )
860
+ expected4 = pd .PeriodIndex (['2000-01-01 09:00' , '2000-01-01 10:00' ,
861
+ '2000-01-01 11:00' , '2000-01-01 12:00' ,
862
+ '2000-01-01 13:00' , '2000-01-02 09:00' ,
863
+ '2000-01-02 10:00' , '2000-01-02 11:00' ,
864
+ '2000-01-02 12:00' , '2000-01-02 13:00' ],
865
+ freq = 'H' )
866
+
867
+ rng5 = pd .PeriodIndex (['2000-01-01 09:01' , '2000-01-01 09:03' ,
868
+ '2000-01-01 09:05' ], freq = 'T' )
869
+ other5 = pd .PeriodIndex (['2000-01-01 09:01' , '2000-01-01 09:05'
870
+ '2000-01-01 09:08' ], freq = 'T' )
871
+ expected5 = pd .PeriodIndex (['2000-01-01 09:01' , '2000-01-01 09:03' ,
872
+ '2000-01-01 09:05' , '2000-01-01 09:08' ],
873
+ freq = 'T' )
874
+
875
+ rng6 = pd .period_range ('2000-01-01' , freq = 'M' , periods = 7 )
876
+ other6 = pd .period_range ('2000-04-01' , freq = 'M' , periods = 7 )
877
+ expected6 = pd .period_range ('2000-01-01' , freq = 'M' , periods = 10 )
878
+
879
+ rng7 = pd .period_range ('2003-01-01' , freq = 'A' , periods = 5 )
880
+ other7 = pd .period_range ('1998-01-01' , freq = 'A' , periods = 8 )
881
+ expected7 = pd .period_range ('1998-01-01' , freq = 'A' , periods = 10 )
882
+
883
+ for rng , other , expected in [(rng1 , other1 , expected1 ), (rng2 , other2 , expected2 ),
884
+ (rng3 , other3 , expected3 ), (rng4 , other4 , expected4 ),
885
+ (rng5 , other5 , expected5 ), (rng6 , other6 , expected6 ),
886
+ (rng7 , other7 , expected7 )]:
887
+
888
+ result_add = rng + other
889
+ result_union = rng .union (other )
890
+
891
+ tm .assert_index_equal (result_add , expected )
892
+ tm .assert_index_equal (result_union , expected )
893
+ # GH 6527
894
+ rng += other
895
+ tm .assert_index_equal (rng , expected )
896
+
897
+ # offset
898
+ for delta in [pd .offsets .Hour (2 ), timedelta (hours = 2 )]:
899
+ rng = pd .period_range ('2000-01-01' , '2000-02-01' )
900
+ with tm .assertRaisesRegexp (TypeError , 'unsupported operand type\(s\)' ):
901
+ result = rng + delta
902
+ with tm .assertRaisesRegexp (TypeError , 'unsupported operand type\(s\)' ):
903
+ rng += delta
904
+
905
+ # int
906
+ rng = pd .period_range ('2000-01-01 09:00' , freq = 'H' , periods = 10 )
907
+ result = rng + 1
908
+ expected = pd .period_range ('2000-01-01 10:00' , freq = 'H' , periods = 10 )
909
+ tm .assert_index_equal (result , expected )
910
+ rng += 1
911
+ tm .assert_index_equal (rng , expected )
912
+
913
+ def test_sub_isub (self ):
914
+ # diff
915
+ rng1 = pd .period_range ('1/1/2000' , freq = 'D' , periods = 5 )
916
+ other1 = pd .period_range ('1/6/2000' , freq = 'D' , periods = 5 )
917
+ expected1 = pd .period_range ('1/1/2000' , freq = 'D' , periods = 5 )
918
+
919
+ rng2 = pd .period_range ('1/1/2000' , freq = 'D' , periods = 5 )
920
+ other2 = pd .period_range ('1/4/2000' , freq = 'D' , periods = 5 )
921
+ expected2 = pd .period_range ('1/1/2000' , freq = 'D' , periods = 3 )
922
+
923
+ rng3 = pd .period_range ('1/1/2000' , freq = 'D' , periods = 5 )
924
+ other3 = pd .PeriodIndex ([], freq = 'D' )
925
+ expected3 = pd .period_range ('1/1/2000' , freq = 'D' , periods = 5 )
926
+
927
+ rng4 = pd .period_range ('2000-01-01 09:00' , freq = 'H' , periods = 5 )
928
+ other4 = pd .period_range ('2000-01-02 09:00' , freq = 'H' , periods = 5 )
929
+ expected4 = rng4
930
+
931
+ rng5 = pd .PeriodIndex (['2000-01-01 09:01' , '2000-01-01 09:03' ,
932
+ '2000-01-01 09:05' ], freq = 'T' )
933
+ other5 = pd .PeriodIndex (['2000-01-01 09:01' , '2000-01-01 09:05' ], freq = 'T' )
934
+ expected5 = pd .PeriodIndex (['2000-01-01 09:03' ], freq = 'T' )
935
+
936
+ rng6 = pd .period_range ('2000-01-01' , freq = 'M' , periods = 7 )
937
+ other6 = pd .period_range ('2000-04-01' , freq = 'M' , periods = 7 )
938
+ expected6 = pd .period_range ('2000-01-01' , freq = 'M' , periods = 3 )
939
+
940
+ rng7 = pd .period_range ('2003-01-01' , freq = 'A' , periods = 5 )
941
+ other7 = pd .period_range ('1998-01-01' , freq = 'A' , periods = 8 )
942
+ expected7 = pd .period_range ('2006-01-01' , freq = 'A' , periods = 2 )
943
+
944
+ for rng , other , expected in [(rng1 , other1 , expected1 ), (rng2 , other2 , expected2 ),
945
+ (rng3 , other3 , expected3 ), (rng4 , other4 , expected4 ),
946
+ (rng5 , other5 , expected5 ), (rng6 , other6 , expected6 ),
947
+ (rng7 , other7 , expected7 ),]:
948
+ result_add = rng - other
949
+ result_union = rng .diff (other )
950
+
951
+ tm .assert_index_equal (result_add , expected )
952
+ tm .assert_index_equal (result_union , expected )
953
+ rng -= other
954
+ tm .assert_index_equal (rng , expected )
955
+
956
+ # offset
957
+ for delta in [pd .offsets .Hour (2 ), timedelta (hours = 2 )]:
958
+ with tm .assertRaisesRegexp (TypeError , 'unsupported operand type\(s\)' ):
959
+ result = rng + delta
960
+ with tm .assertRaisesRegexp (TypeError , 'unsupported operand type\(s\)' ):
961
+ rng += delta
962
+
963
+ # int
964
+ rng = pd .period_range ('2000-01-01 09:00' , freq = 'H' , periods = 10 )
965
+ result = rng - 1
966
+ expected = pd .period_range ('2000-01-01 08:00' , freq = 'H' , periods = 10 )
967
+ tm .assert_index_equal (result , expected )
968
+ rng -= 1
969
+ tm .assert_index_equal (rng , expected )
970
+
748
971
749
972
if __name__ == '__main__' :
750
973
import nose
0 commit comments