From 46a47e085cdadc87162cbf043932121c18650fd3 Mon Sep 17 00:00:00 2001 From: jbrockmendel Date: Mon, 4 May 2020 18:35:02 -0700 Subject: [PATCH] Move NA import out of nattype.pyx --- pandas/_libs/missing.pxd | 1 + pandas/_libs/missing.pyx | 5 +++++ pandas/_libs/tslib.pyx | 16 +++++++++------- pandas/_libs/tslibs/nattype.pyx | 4 +--- 4 files changed, 16 insertions(+), 10 deletions(-) diff --git a/pandas/_libs/missing.pxd b/pandas/_libs/missing.pxd index 5ab42a736712f..40931629ce752 100644 --- a/pandas/_libs/missing.pxd +++ b/pandas/_libs/missing.pxd @@ -7,6 +7,7 @@ cpdef ndarray[uint8_t] isnaobj(ndarray arr) cdef bint is_null_datetime64(v) cdef bint is_null_timedelta64(v) cdef bint is_null_period(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 dacf454824190..78ec7a022ee78 100644 --- a/pandas/_libs/missing.pyx +++ b/pandas/_libs/missing.pyx @@ -284,6 +284,11 @@ cdef inline bint is_null_period(v): return checknull_with_nat(v) +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 53bcf5be2586a..8c4a51880918c 100644 --- a/pandas/_libs/tslib.pyx +++ b/pandas/_libs/tslib.pyx @@ -52,8 +52,7 @@ from pandas._libs.tslibs.conversion cimport ( # many modules still look for NaT and iNaT here despite them not being needed from pandas._libs.tslibs.nattype import nat_strings, iNaT # noqa:F821 -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 @@ -65,6 +64,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, @@ -439,7 +441,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): @@ -506,7 +508,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): @@ -603,7 +605,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): @@ -813,7 +815,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: @@ -875,7 +877,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 ec397a470f2ec..769fd32846599 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 @@ -811,7 +809,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):