diff --git a/src/_arraykit.c b/src/_arraykit.c index fe94c943..0a424aca 100644 --- a/src/_arraykit.c +++ b/src/_arraykit.c @@ -3770,17 +3770,29 @@ isna_element(PyObject *m, PyObject *args, PyObject *kwargs) } // Try to identify Pandas Timestamp NATs if (PyObject_HasAttrString(element, "to_numpy")) { - PyObject *to_numpy = PyObject_GetAttrString(element, "to_numpy"); - if (to_numpy == NULL) { - return NULL; - } - if (!PyCallable_Check(to_numpy)) { - Py_RETURN_FALSE; - } - PyObject* post = PyObject_CallFunction(to_numpy, NULL); - Py_DECREF(to_numpy); - if (post == NULL) return NULL; - return PyBool_FromLong(PyArrayScalar_VAL(post, Datetime) == NPY_DATETIME_NAT); + // strcmp returns 0 on match + return PyBool_FromLong(strcmp(element->ob_type->tp_name, "NaTType") == 0); + // the long way + // PyObject *to_numpy = PyObject_GetAttrString(element, "to_numpy"); + // if (to_numpy == NULL) { + // return NULL; + // } + // if (!PyCallable_Check(to_numpy)) { + // Py_DECREF(to_numpy); + // Py_RETURN_FALSE; + // } + // PyObject* scalar = PyObject_CallFunction(to_numpy, NULL); + // Py_DECREF(to_numpy); + // if (scalar == NULL) { + // return NULL; + // } + // if (!PyArray_IsScalar(scalar, Datetime)) { + // Py_DECREF(scalar); + // Py_RETURN_FALSE; + // } + // PyObject* pb = PyBool_FromLong(PyArrayScalar_VAL(scalar, Datetime) == NPY_DATETIME_NAT); + // Py_DECREF(scalar); + // return pb; } Py_RETURN_FALSE; } diff --git a/test/test_util.py b/test/test_util.py index d778d80d..f388e4b2 100644 --- a/test/test_util.py +++ b/test/test_util.py @@ -351,6 +351,9 @@ def test_isna_element_d(self) -> None: ts = pd.Timestamp('nat') self.assertTrue(isna_element(ts)) + s1 = pd.Series((0,)) + self.assertFalse(isna_element(s1)) + def test_isna_element_e(self) -> None: from types import SimpleNamespace @@ -358,6 +361,7 @@ def test_isna_element_e(self) -> None: sn.to_numpy = None self.assertFalse(isna_element(sn)) + #--------------------------------------------------------------------------- def test_dtype_from_element_core_dtypes(self) -> None: