66import pandas as pd
77from pandas import Timedelta
88import pandas ._testing as tm
9- from pandas .core .arrays import TimedeltaArray
9+ from pandas .core .arrays import (
10+ DatetimeArray ,
11+ TimedeltaArray ,
12+ )
1013
1114
1215class TestNonNano :
@@ -25,6 +28,11 @@ def reso(self, unit):
2528 else :
2629 raise NotImplementedError (unit )
2730
31+ @pytest .fixture
32+ def tda (self , unit ):
33+ arr = np .arange (5 , dtype = np .int64 ).view (f"m8[{ unit } ]" )
34+ return TimedeltaArray ._simple_new (arr , dtype = arr .dtype )
35+
2836 def test_non_nano (self , unit , reso ):
2937 arr = np .arange (5 , dtype = np .int64 ).view (f"m8[{ unit } ]" )
3038 tda = TimedeltaArray ._simple_new (arr , dtype = arr .dtype )
@@ -33,39 +41,55 @@ def test_non_nano(self, unit, reso):
3341 assert tda [0 ]._reso == reso
3442
3543 @pytest .mark .parametrize ("field" , TimedeltaArray ._field_ops )
36- def test_fields (self , unit , field ):
37- arr = np .arange (5 , dtype = np .int64 ).view (f"m8[{ unit } ]" )
38- tda = TimedeltaArray ._simple_new (arr , dtype = arr .dtype )
39-
40- as_nano = arr .astype ("m8[ns]" )
44+ def test_fields (self , tda , field ):
45+ as_nano = tda ._ndarray .astype ("m8[ns]" )
4146 tda_nano = TimedeltaArray ._simple_new (as_nano , dtype = as_nano .dtype )
4247
4348 result = getattr (tda , field )
4449 expected = getattr (tda_nano , field )
4550 tm .assert_numpy_array_equal (result , expected )
4651
47- def test_to_pytimedelta (self , unit ):
48- arr = np .arange (5 , dtype = np .int64 ).view (f"m8[{ unit } ]" )
49- tda = TimedeltaArray ._simple_new (arr , dtype = arr .dtype )
50-
51- as_nano = arr .astype ("m8[ns]" )
52+ def test_to_pytimedelta (self , tda ):
53+ as_nano = tda ._ndarray .astype ("m8[ns]" )
5254 tda_nano = TimedeltaArray ._simple_new (as_nano , dtype = as_nano .dtype )
5355
5456 result = tda .to_pytimedelta ()
5557 expected = tda_nano .to_pytimedelta ()
5658 tm .assert_numpy_array_equal (result , expected )
5759
58- def test_total_seconds (self , unit ):
59- arr = np .arange (5 , dtype = np .int64 ).view (f"m8[{ unit } ]" )
60- tda = TimedeltaArray ._simple_new (arr , dtype = arr .dtype )
61-
62- as_nano = arr .astype ("m8[ns]" )
60+ def test_total_seconds (self , unit , tda ):
61+ as_nano = tda ._ndarray .astype ("m8[ns]" )
6362 tda_nano = TimedeltaArray ._simple_new (as_nano , dtype = as_nano .dtype )
6463
6564 result = tda .total_seconds ()
6665 expected = tda_nano .total_seconds ()
6766 tm .assert_numpy_array_equal (result , expected )
6867
68+ @pytest .mark .parametrize (
69+ "nat" , [np .datetime64 ("NaT" , "ns" ), np .datetime64 ("NaT" , "us" )]
70+ )
71+ def test_add_nat_datetimelike_scalar (self , nat , tda ):
72+ result = tda + nat
73+ assert isinstance (result , DatetimeArray )
74+ assert result ._reso == tda ._reso
75+ assert result .isna ().all ()
76+
77+ result = nat + tda
78+ assert isinstance (result , DatetimeArray )
79+ assert result ._reso == tda ._reso
80+ assert result .isna ().all ()
81+
82+ def test_add_pdnat (self , tda ):
83+ result = tda + pd .NaT
84+ assert isinstance (result , TimedeltaArray )
85+ assert result ._reso == tda ._reso
86+ assert result .isna ().all ()
87+
88+ result = pd .NaT + tda
89+ assert isinstance (result , TimedeltaArray )
90+ assert result ._reso == tda ._reso
91+ assert result .isna ().all ()
92+
6993
7094class TestTimedeltaArray :
7195 @pytest .mark .parametrize ("dtype" , [int , np .int32 , np .int64 , "uint32" , "uint64" ])
0 commit comments