@@ -732,6 +732,31 @@ def test_fillna_datetime64(self):
732
732
dtype = object )
733
733
self .assert_index_equal (idx .fillna ('x' ), exp )
734
734
735
+ def test_difference_of_union (self ):
736
+ # GH14323: Test taking the union of differences of an Index.
737
+ # Difference of DatetimeIndex does not preserve frequency,
738
+ # so a differencing operation should not retain the freq field of the
739
+ # original index.
740
+ i = pd .date_range ("20160920" , "20160925" , freq = "D" )
741
+
742
+ a = pd .date_range ("20160921" , "20160924" , freq = "D" )
743
+ expected = pd .DatetimeIndex (["20160920" , "20160925" ], freq = None )
744
+ a_diff = i .difference (a )
745
+ tm .assert_index_equal (a_diff , expected )
746
+ tm .assert_attr_equal ('freq' , a_diff , expected )
747
+
748
+ b = pd .date_range ("20160922" , "20160925" , freq = "D" )
749
+ b_diff = i .difference (b )
750
+ expected = pd .DatetimeIndex (["20160920" , "20160921" ], freq = None )
751
+ tm .assert_index_equal (b_diff , expected )
752
+ tm .assert_attr_equal ('freq' , b_diff , expected )
753
+
754
+ union_of_diff = a_diff .union (b_diff )
755
+ expected = pd .DatetimeIndex (["20160920" , "20160921" , "20160925" ],
756
+ freq = None )
757
+ tm .assert_index_equal (union_of_diff , expected )
758
+ tm .assert_attr_equal ('freq' , union_of_diff , expected )
759
+
735
760
736
761
class TestPeriodIndex (DatetimeLike , tm .TestCase ):
737
762
_holder = PeriodIndex
@@ -938,6 +963,30 @@ def test_no_millisecond_field(self):
938
963
with self .assertRaises (AttributeError ):
939
964
DatetimeIndex ([]).millisecond
940
965
966
+ def test_difference_of_union (self ):
967
+ # GH14323: Test taking the union of differences of an Index.
968
+ # Difference of Period MUST preserve frequency, but the ability
969
+ # to union results must be preserved
970
+ i = pd .period_range ("20160920" , "20160925" , freq = "D" )
971
+
972
+ a = pd .period_range ("20160921" , "20160924" , freq = "D" )
973
+ expected = pd .PeriodIndex (["20160920" , "20160925" ], freq = 'D' )
974
+ a_diff = i .difference (a )
975
+ tm .assert_index_equal (a_diff , expected )
976
+ tm .assert_attr_equal ('freq' , a_diff , expected )
977
+
978
+ b = pd .period_range ("20160922" , "20160925" , freq = "D" )
979
+ b_diff = i .difference (b )
980
+ expected = pd .PeriodIndex (["20160920" , "20160921" ], freq = 'D' )
981
+ tm .assert_index_equal (b_diff , expected )
982
+ tm .assert_attr_equal ('freq' , b_diff , expected )
983
+
984
+ union_of_diff = a_diff .union (b_diff )
985
+ expected = pd .PeriodIndex (["20160920" , "20160921" , "20160925" ],
986
+ freq = 'D' )
987
+ tm .assert_index_equal (union_of_diff , expected )
988
+ tm .assert_attr_equal ('freq' , union_of_diff , expected )
989
+
941
990
942
991
class TestTimedeltaIndex (DatetimeLike , tm .TestCase ):
943
992
_holder = TimedeltaIndex
@@ -1149,3 +1198,28 @@ def test_fillna_timedelta(self):
1149
1198
exp = pd .Index (
1150
1199
[pd .Timedelta ('1 day' ), 'x' , pd .Timedelta ('3 day' )], dtype = object )
1151
1200
self .assert_index_equal (idx .fillna ('x' ), exp )
1201
+
1202
+ def test_difference_of_union (self ):
1203
+ # GH14323: Test taking the union of differences of an Index.
1204
+ # Difference of TimedeltaIndex does not preserve frequency,
1205
+ # so a differencing operation should not retain the freq field of the
1206
+ # original index.
1207
+ i = pd .timedelta_range ("0 days" , "5 days" , freq = "D" )
1208
+
1209
+ a = pd .timedelta_range ("1 days" , "4 days" , freq = "D" )
1210
+ expected = pd .TimedeltaIndex (["0 days" , "5 days" ], freq = None )
1211
+ a_diff = i .difference (a )
1212
+ tm .assert_index_equal (a_diff , expected )
1213
+ tm .assert_attr_equal ('freq' , a_diff , expected )
1214
+
1215
+ b = pd .timedelta_range ("2 days" , "5 days" , freq = "D" )
1216
+ b_diff = i .difference (b )
1217
+ expected = pd .TimedeltaIndex (["0 days" , "1 days" ], freq = None )
1218
+ tm .assert_index_equal (b_diff , expected )
1219
+ tm .assert_attr_equal ('freq' , b_diff , expected )
1220
+
1221
+ union_of_difference = a_diff .union (b_diff )
1222
+ expected = pd .TimedeltaIndex (["0 days" , "1 days" , "5 days" ],
1223
+ freq = None )
1224
+ tm .assert_index_equal (union_of_difference , expected )
1225
+ tm .assert_attr_equal ('freq' , union_of_difference , expected )
0 commit comments