25
25
from pandas import (
26
26
Timestamp , Timedelta , Period , Series , date_range , NaT ,
27
27
DatetimeIndex , TimedeltaIndex )
28
+ from pandas .core .arrays import DatetimeArrayMixin as DatetimeArray
28
29
29
30
30
31
# ------------------------------------------------------------------
@@ -158,12 +159,16 @@ def test_dt64_ser_cmp_date_warning(self):
158
159
assert "a TypeError will be raised" in str (m [0 ].message )
159
160
160
161
@pytest .mark .skip (reason = "GH#21359" )
161
- def test_dt64ser_cmp_date_invalid (self ):
162
+ def test_dt64ser_cmp_date_invalid (self , box_with_datetime ):
162
163
# GH#19800 datetime.date comparison raises to
163
164
# match DatetimeIndex/Timestamp. This also matches the behavior
164
165
# of stdlib datetime.datetime
165
- ser = pd .Series (pd .date_range ('20010101' , periods = 10 ), name = 'dates' )
166
+ box = box_with_datetime
167
+
168
+ ser = pd .date_range ('20010101' , periods = 10 )
166
169
date = ser .iloc [0 ].to_pydatetime ().date ()
170
+
171
+ ser = tm .box_expected (ser , box )
167
172
assert not (ser == date ).any ()
168
173
assert (ser != date ).all ()
169
174
with pytest .raises (TypeError ):
@@ -225,22 +230,37 @@ def test_timestamp_compare_series(self, left, right):
225
230
result = right_f (pd .Timestamp ("nat" ), s_nat )
226
231
tm .assert_series_equal (result , expected )
227
232
228
- def test_timestamp_equality (self ):
233
+ def test_dt64arr_timestamp_equality (self , box_with_datetime ):
229
234
# GH#11034
235
+ box = box_with_datetime
236
+ xbox = box if box not in [pd .Index , DatetimeArray ] else np .ndarray
237
+
230
238
ser = pd .Series ([pd .Timestamp ('2000-01-29 01:59:00' ), 'NaT' ])
239
+ ser = tm .box_expected (ser , box )
240
+
231
241
result = ser != ser
232
- tm .assert_series_equal (result , pd .Series ([False , True ]))
242
+ expected = tm .box_expected ([False , True ], xbox )
243
+ tm .assert_equal (result , expected )
244
+
233
245
result = ser != ser [0 ]
234
- tm .assert_series_equal (result , pd .Series ([False , True ]))
246
+ expected = tm .box_expected ([False , True ], xbox )
247
+ tm .assert_equal (result , expected )
248
+
235
249
result = ser != ser [1 ]
236
- tm .assert_series_equal (result , pd .Series ([True , True ]))
250
+ expected = tm .box_expected ([True , True ], xbox )
251
+ tm .assert_equal (result , expected )
237
252
238
253
result = ser == ser
239
- tm .assert_series_equal (result , pd .Series ([True , False ]))
254
+ expected = tm .box_expected ([True , False ], xbox )
255
+ tm .assert_equal (result , expected )
256
+
240
257
result = ser == ser [0 ]
241
- tm .assert_series_equal (result , pd .Series ([True , False ]))
258
+ expected = tm .box_expected ([True , False ], xbox )
259
+ tm .assert_equal (result , expected )
260
+
242
261
result = ser == ser [1 ]
243
- tm .assert_series_equal (result , pd .Series ([False , False ]))
262
+ expected = tm .box_expected ([False , False ], xbox )
263
+ tm .assert_equal (result , expected )
244
264
245
265
246
266
class TestDatetimeIndexComparisons (object ):
@@ -629,7 +649,7 @@ def test_dti_cmp_object_dtype(self):
629
649
# Arithmetic
630
650
631
651
class TestFrameArithmetic (object ):
632
- def test_dt64arr_sub_dtscalar (self , box ):
652
+ def test_dt64arr_sub_timestamp (self , box ):
633
653
# GH#8554, GH#22163 DataFrame op should _not_ return dt64 dtype
634
654
idx = pd .date_range ('2013-01-01' , periods = 3 )
635
655
idx = tm .box_expected (idx , box )
@@ -643,28 +663,39 @@ def test_dt64arr_sub_dtscalar(self, box):
643
663
result = idx - ts
644
664
tm .assert_equal (result , expected )
645
665
646
- def test_df_sub_datetime64_not_ns (self ):
666
+ def test_dt64arr_sub_datetime64_not_ns (self , box ):
647
667
# GH#7996, GH#22163 ensure non-nano datetime64 is converted to nano
648
- df = pd .DataFrame (pd .date_range ('20130101' , periods = 3 ))
668
+ # for DataFrame operation
669
+
670
+ dti = pd .date_range ('20130101' , periods = 3 )
671
+ dtarr = tm .box_expected (dti , box )
672
+
649
673
dt64 = np .datetime64 ('2013-01-01' )
650
674
assert dt64 .dtype == 'datetime64[D]'
651
- res = df - dt64
652
- expected = pd .DataFrame ([pd .Timedelta (days = 0 ), pd .Timedelta (days = 1 ),
653
- pd .Timedelta (days = 2 )])
654
- tm .assert_frame_equal (res , expected )
675
+
676
+ expected = pd .TimedeltaIndex (['0 Days' , '1 Day' , '2 Days' ])
677
+ expected = tm .box_expected (expected , box )
678
+
679
+ result = dtarr - dt64
680
+ tm .assert_equal (result , expected )
655
681
656
682
657
683
class TestTimestampSeriesArithmetic (object ):
658
684
659
- def test_timestamp_sub_series (self ):
660
- ser = pd .Series ( pd . date_range ('2014-03-17' , periods = 2 , freq = 'D' ,
661
- tz = 'US/Eastern' ) )
685
+ def test_dt64arr_sub_timestamp (self , box ):
686
+ ser = pd .date_range ('2014-03-17' , periods = 2 , freq = 'D' ,
687
+ tz = 'US/Eastern' )
662
688
ts = ser [0 ]
663
689
690
+ # FIXME: transpose raises ValueError
691
+ ser = tm .box_expected (ser , box , transpose = False )
692
+
664
693
delta_series = pd .Series ([np .timedelta64 (0 , 'D' ),
665
694
np .timedelta64 (1 , 'D' )])
666
- tm .assert_series_equal (ser - ts , delta_series )
667
- tm .assert_series_equal (ts - ser , - delta_series )
695
+ expected = tm .box_expected (delta_series , box , transpose = False )
696
+
697
+ tm .assert_equal (ser - ts , expected )
698
+ tm .assert_equal (ts - ser , - expected )
668
699
669
700
def test_dt64ser_sub_datetime_dtype (self ):
670
701
ts = Timestamp (datetime (1993 , 1 , 7 , 13 , 30 , 00 ))
@@ -722,20 +753,23 @@ def check(get_ser, test_ser):
722
753
if op_str not in ['__add__' , '__radd__' , '__sub__' , '__rsub__' ]:
723
754
check (dt2 , td2 )
724
755
725
- @pytest .mark .parametrize ('klass' , [Series , pd .Index ])
726
- def test_sub_datetime64_not_ns (self , klass ):
727
- # GH#7996
756
+ def test_sub_datetime64_not_ns (self , box ):
757
+ # GH#7996 operation with non-nano datetime64 scalar
728
758
dt64 = np .datetime64 ('2013-01-01' )
729
759
assert dt64 .dtype == 'datetime64[D]'
730
760
731
- obj = klass (date_range ('20130101' , periods = 3 ))
732
- res = obj - dt64
733
- expected = klass ([Timedelta (days = 0 ), Timedelta (days = 1 ),
734
- Timedelta (days = 2 )])
735
- tm .assert_equal (res , expected )
761
+ obj = date_range ('20130101' , periods = 3 )
762
+ obj = tm .box_expected (obj , box )
763
+
764
+ expected = TimedeltaIndex ([Timedelta (days = 0 ), Timedelta (days = 1 ),
765
+ Timedelta (days = 2 )])
766
+ expected = tm .box_expected (expected , box )
767
+
768
+ result = obj - dt64
769
+ tm .assert_equal (result , expected )
736
770
737
- res = dt64 - obj
738
- tm .assert_equal (res , - expected )
771
+ result = dt64 - obj
772
+ tm .assert_equal (result , - expected )
739
773
740
774
def test_sub_single_tz (self ):
741
775
# GH12290
@@ -1438,34 +1472,43 @@ def test_sub_dti_dti(self):
1438
1472
result = dti2 - dti1
1439
1473
tm .assert_index_equal (result , expected )
1440
1474
1441
- @pytest .mark .parametrize ('freq ' , [None , 'D' ])
1442
- def test_sub_period (self , freq , box_with_datetime ):
1475
+ @pytest .mark .parametrize ('dti_freq ' , [None , 'D' ])
1476
+ def test_dt64arr_add_sub_period (self , dti_freq , box_with_datetime ):
1443
1477
# GH#13078
1444
1478
# not supported, check TypeError
1445
1479
p = pd .Period ('2011-01-01' , freq = 'D' )
1446
1480
1447
- idx = pd .DatetimeIndex (['2011-01-01' , '2011-01-02' ], freq = freq )
1481
+ idx = pd .DatetimeIndex (['2011-01-01' , '2011-01-02' ], freq = dti_freq )
1448
1482
idx = tm .box_expected (idx , box_with_datetime )
1449
1483
1484
+ with pytest .raises (TypeError ):
1485
+ idx + p
1486
+ with pytest .raises (TypeError ):
1487
+ p + idx
1450
1488
with pytest .raises (TypeError ):
1451
1489
idx - p
1452
-
1453
1490
with pytest .raises (TypeError ):
1454
1491
p - idx
1455
1492
1456
- @pytest .mark .parametrize ('op' , [operator .add , ops .radd ,
1457
- operator .sub , ops .rsub ])
1458
1493
@pytest .mark .parametrize ('pi_freq' , ['D' , 'W' , 'Q' , 'H' ])
1459
1494
@pytest .mark .parametrize ('dti_freq' , [None , 'D' ])
1460
- def test_dti_sub_pi (self , dti_freq , pi_freq , op , box ):
1495
+ def test_dti_add_sub_pi (self , dti_freq , pi_freq ,
1496
+ box_with_datetime , box_with_period ):
1461
1497
# GH#20049 subtracting PeriodIndex should raise TypeError
1462
1498
dti = pd .DatetimeIndex (['2011-01-01' , '2011-01-02' ], freq = dti_freq )
1463
1499
pi = dti .to_period (pi_freq )
1464
1500
1465
- dti = tm .box_expected (dti , box )
1466
- # TODO: Also box pi?
1501
+ dtarr = tm .box_expected (dti , box_with_datetime )
1502
+ parr = tm .box_expected (pi , box_with_period )
1503
+
1504
+ with pytest .raises (TypeError ):
1505
+ dtarr + parr
1506
+ with pytest .raises (TypeError ):
1507
+ parr + dtarr
1508
+ with pytest .raises (TypeError ):
1509
+ dtarr - parr
1467
1510
with pytest .raises (TypeError ):
1468
- op ( dti , pi )
1511
+ parr - dtarr
1469
1512
1470
1513
# -------------------------------------------------------------------
1471
1514
# TODO: Most of this block is moved from series or frame tests, needs
0 commit comments