22
22
is_string_dtype ,
23
23
is_timedelta64_dtype ,
24
24
)
25
- from pandas .core .dtypes .dtypes import DatetimeTZDtype , PandasExtensionDtype
25
+ from pandas .core .dtypes .dtypes import DatetimeTZDtype
26
26
from pandas .core .dtypes .missing import isna
27
27
28
28
import pandas as pd
@@ -92,20 +92,6 @@ def box(request):
92
92
return request .param
93
93
94
94
95
- def _safe_dtype_assert (left_dtype , right_dtype ):
96
- """
97
- Compare two dtypes without raising TypeError.
98
- """
99
- __tracebackhide__ = True
100
- if isinstance (right_dtype , PandasExtensionDtype ):
101
- # switch order of equality check because numpy dtypes (e.g. if
102
- # left_dtype is np.object_) do not know some expected dtypes (e.g.
103
- # DatetimeTZDtype) and would raise a TypeError in their __eq__-method.
104
- assert right_dtype == left_dtype
105
- else :
106
- assert left_dtype == right_dtype
107
-
108
-
109
95
def _check_promote (
110
96
dtype ,
111
97
fill_value ,
@@ -157,8 +143,11 @@ def _check_promote(
157
143
result_dtype , result_fill_value = maybe_promote (dtype , fill_value )
158
144
expected_fill_value = exp_val_for_scalar
159
145
160
- _safe_dtype_assert (result_dtype , expected_dtype )
146
+ assert result_dtype == expected_dtype
147
+ _assert_match (result_fill_value , expected_fill_value )
148
+
161
149
150
+ def _assert_match (result_fill_value , expected_fill_value ):
162
151
# GH#23982/25425 require the same type in addition to equality/NA-ness
163
152
res_type = type (result_fill_value )
164
153
ex_type = type (expected_fill_value )
@@ -369,8 +358,8 @@ def test_maybe_promote_any_with_datetime64(
369
358
if is_datetime64_dtype (dtype ):
370
359
expected_dtype = dtype
371
360
# for datetime dtypes, scalar values get cast to pd.Timestamp.value
372
- exp_val_for_scalar = pd .Timestamp (fill_value ).value
373
- exp_val_for_array = iNaT
361
+ exp_val_for_scalar = pd .Timestamp (fill_value ).to_datetime64 ()
362
+ exp_val_for_array = np . datetime64 ( "NaT" , "ns" )
374
363
else :
375
364
expected_dtype = np .dtype (object )
376
365
exp_val_for_scalar = fill_value
@@ -454,9 +443,7 @@ def test_maybe_promote_datetimetz_with_datetimetz(
454
443
)
455
444
456
445
457
- @pytest .mark .parametrize (
458
- "fill_value" , [None , np .nan , NaT , iNaT ], ids = ["None" , "np.nan" , "pd.NaT" , "iNaT" ]
459
- )
446
+ @pytest .mark .parametrize ("fill_value" , [None , np .nan , NaT , iNaT ])
460
447
# override parametrization due to to many xfails; see GH 23982 / 25425
461
448
@pytest .mark .parametrize ("box" , [(False , None )])
462
449
def test_maybe_promote_datetimetz_with_na (tz_aware_fixture , fill_value , box ):
@@ -572,8 +559,8 @@ def test_maybe_promote_any_with_timedelta64(
572
559
if is_timedelta64_dtype (dtype ):
573
560
expected_dtype = dtype
574
561
# for timedelta dtypes, scalar values get cast to pd.Timedelta.value
575
- exp_val_for_scalar = pd .Timedelta (fill_value ).value
576
- exp_val_for_array = iNaT
562
+ exp_val_for_scalar = pd .Timedelta (fill_value ).to_timedelta64 ()
563
+ exp_val_for_array = np . timedelta64 ( "NaT" , "ns" )
577
564
else :
578
565
expected_dtype = np .dtype (object )
579
566
exp_val_for_scalar = fill_value
@@ -714,9 +701,7 @@ def test_maybe_promote_any_with_object(any_numpy_dtype_reduced, object_dtype, bo
714
701
)
715
702
716
703
717
- @pytest .mark .parametrize (
718
- "fill_value" , [None , np .nan , NaT , iNaT ], ids = ["None" , "np.nan" , "pd.NaT" , "iNaT" ]
719
- )
704
+ @pytest .mark .parametrize ("fill_value" , [None , np .nan , NaT , iNaT ])
720
705
# override parametrization due to to many xfails; see GH 23982 / 25425
721
706
@pytest .mark .parametrize ("box" , [(False , None )])
722
707
def test_maybe_promote_any_numpy_dtype_with_na (
@@ -764,7 +749,7 @@ def test_maybe_promote_any_numpy_dtype_with_na(
764
749
elif is_datetime_or_timedelta_dtype (dtype ):
765
750
# datetime / timedelta cast all missing values to iNaT
766
751
expected_dtype = dtype
767
- exp_val_for_scalar = iNaT
752
+ exp_val_for_scalar = dtype . type ( "NaT" , "ns" )
768
753
elif fill_value is NaT :
769
754
# NaT upcasts everything that's not datetime/timedelta to object
770
755
expected_dtype = np .dtype (object )
@@ -783,7 +768,7 @@ def test_maybe_promote_any_numpy_dtype_with_na(
783
768
# integers cannot hold NaNs; maybe_promote_with_array returns None
784
769
exp_val_for_array = None
785
770
elif is_datetime_or_timedelta_dtype (expected_dtype ):
786
- exp_val_for_array = iNaT
771
+ exp_val_for_array = expected_dtype . type ( "NaT" , "ns" )
787
772
else : # expected_dtype = float / complex / object
788
773
exp_val_for_array = np .nan
789
774
@@ -817,7 +802,4 @@ def test_maybe_promote_dimensions(any_numpy_dtype_reduced, dim):
817
802
result_dtype , result_missing_value = maybe_promote (dtype , fill_array )
818
803
819
804
assert result_dtype == expected_dtype
820
- # None == None, iNaT == iNaT, but np.nan != np.nan
821
- assert (result_missing_value == expected_missing_value ) or (
822
- result_missing_value is np .nan and expected_missing_value is np .nan
823
- )
805
+ _assert_match (result_missing_value , expected_missing_value )
0 commit comments