diff --git a/pandas/_libs/missing.pxd b/pandas/_libs/missing.pxd index b32492c1a83fc..090c5c5173280 100644 --- a/pandas/_libs/missing.pxd +++ b/pandas/_libs/missing.pxd @@ -6,6 +6,7 @@ cpdef ndarray[uint8_t] isnaobj(ndarray arr) cdef bint is_null_datetime64(v) cdef bint is_null_timedelta64(v) +cdef bint checknull_with_nat_and_na(object obj) cdef class C_NAType: pass diff --git a/pandas/_libs/missing.pyx b/pandas/_libs/missing.pyx index 490abdf473319..62a8bfccaa432 100644 --- a/pandas/_libs/missing.pyx +++ b/pandas/_libs/missing.pyx @@ -279,6 +279,11 @@ cdef inline bint is_null_timedelta64(v): return False +cdef bint checknull_with_nat_and_na(object obj): + # See GH#32214 + return checknull_with_nat(obj) or obj is C_NA + + # ----------------------------------------------------------------------------- # Implementation of NA singleton diff --git a/pandas/_libs/tslib.pyx b/pandas/_libs/tslib.pyx index 556cab565860c..e1205bb1f4820 100644 --- a/pandas/_libs/tslib.pyx +++ b/pandas/_libs/tslib.pyx @@ -51,8 +51,7 @@ from pandas._libs.tslibs.conversion cimport ( get_datetime64_nanos) from pandas._libs.tslibs.nattype import nat_strings -from pandas._libs.tslibs.nattype cimport ( - checknull_with_nat, NPY_NAT, c_NaT as NaT) +from pandas._libs.tslibs.nattype cimport NPY_NAT, c_NaT as NaT from pandas._libs.tslibs.offsets cimport to_offset @@ -64,6 +63,9 @@ from pandas._libs.tslibs.tzconversion cimport ( tz_convert_utc_to_tzlocal, ) +# Note: this is the only non-tslibs intra-pandas dependency here +from pandas._libs.missing cimport checknull_with_nat_and_na + cdef inline object create_datetime_from_ts( int64_t value, @@ -438,7 +440,7 @@ def array_with_unit_to_datetime( for i in range(n): val = values[i] - if checknull_with_nat(val): + if checknull_with_nat_and_na(val): iresult[i] = NPY_NAT elif is_integer_object(val) or is_float_object(val): @@ -505,7 +507,7 @@ def array_with_unit_to_datetime( for i in range(n): val = values[i] - if checknull_with_nat(val): + if checknull_with_nat_and_na(val): oresult[i] = NaT elif is_integer_object(val) or is_float_object(val): @@ -602,7 +604,7 @@ cpdef array_to_datetime( val = values[i] try: - if checknull_with_nat(val): + if checknull_with_nat_and_na(val): iresult[i] = NPY_NAT elif PyDateTime_Check(val): @@ -812,7 +814,7 @@ cdef ignore_errors_out_of_bounds_fallback(ndarray[object] values): val = values[i] # set as nan except if its a NaT - if checknull_with_nat(val): + if checknull_with_nat_and_na(val): if isinstance(val, float): oresult[i] = np.nan else: @@ -874,7 +876,7 @@ cdef array_to_datetime_object( # 2) datetime strings, which we return as datetime.datetime for i in range(n): val = values[i] - if checknull_with_nat(val) or PyDateTime_Check(val): + if checknull_with_nat_and_na(val) or PyDateTime_Check(val): # GH 25978. No need to parse NaT-like or datetime-like vals oresult[i] = val elif isinstance(val, str): diff --git a/pandas/_libs/tslibs/nattype.pyx b/pandas/_libs/tslibs/nattype.pyx index a45e10e8337a4..d0d03919f65ef 100644 --- a/pandas/_libs/tslibs/nattype.pyx +++ b/pandas/_libs/tslibs/nattype.pyx @@ -31,8 +31,6 @@ from pandas._libs.tslibs.np_datetime cimport ( ) cimport pandas._libs.tslibs.util as util -from pandas._libs.missing cimport C_NA - # ---------------------------------------------------------------------- # Constants @@ -809,7 +807,7 @@ cdef inline bint checknull_with_nat(object val): """ Utility to check if a value is a nat or not. """ - return val is None or util.is_nan(val) or val is c_NaT or val is C_NA + return val is None or util.is_nan(val) or val is c_NaT cpdef bint is_null_datetimelike(object val, bint inat_is_null=True):