diff --git a/pandas/_libs/tslib.pyx b/pandas/_libs/tslib.pyx index 458e58b52270b..f6034a1347f90 100644 --- a/pandas/_libs/tslib.pyx +++ b/pandas/_libs/tslib.pyx @@ -50,8 +50,11 @@ from pandas._libs.tslibs.conversion cimport ( _TSObject, convert_datetime_to_tsobject, get_datetime64_nanos) -from pandas._libs.tslibs.nattype import nat_strings -from pandas._libs.tslibs.nattype cimport NPY_NAT, c_NaT as NaT +from pandas._libs.tslibs.nattype cimport ( + NPY_NAT, + c_NaT as NaT, + c_nat_strings as nat_strings, +) from pandas._libs.tslibs.offsets cimport to_offset diff --git a/pandas/_libs/tslibs/__init__.py b/pandas/_libs/tslibs/__init__.py index 078832260cd58..d7bc77baa5e05 100644 --- a/pandas/_libs/tslibs/__init__.py +++ b/pandas/_libs/tslibs/__init__.py @@ -3,6 +3,7 @@ "NaT", "NaTType", "iNaT", + "nat_strings", "is_null_datetimelike", "OutOfBoundsDatetime", "IncompatibleFrequency", @@ -17,7 +18,7 @@ from .conversion import localize_pydatetime -from .nattype import NaT, NaTType, iNaT, is_null_datetimelike +from .nattype import NaT, NaTType, iNaT, is_null_datetimelike, nat_strings from .np_datetime import OutOfBoundsDatetime from .period import IncompatibleFrequency, Period from .timedeltas import Timedelta, delta_to_nanoseconds, ints_to_pytimedelta diff --git a/pandas/_libs/tslibs/conversion.pyx b/pandas/_libs/tslibs/conversion.pyx index c18425f7bb270..7d8c85b6c8e0b 100644 --- a/pandas/_libs/tslibs/conversion.pyx +++ b/pandas/_libs/tslibs/conversion.pyx @@ -33,9 +33,12 @@ from pandas._libs.tslibs.timezones cimport ( ) from pandas._libs.tslibs.parsing import parse_datetime_string -from pandas._libs.tslibs.nattype import nat_strings from pandas._libs.tslibs.nattype cimport ( - NPY_NAT, checknull_with_nat, c_NaT as NaT) + NPY_NAT, + checknull_with_nat, + c_NaT as NaT, + c_nat_strings as nat_strings, +) from pandas._libs.tslibs.tzconversion import tz_localize_to_utc from pandas._libs.tslibs.tzconversion cimport ( diff --git a/pandas/_libs/tslibs/nattype.pxd b/pandas/_libs/tslibs/nattype.pxd index bd97462381b58..3f7240654d7e8 100644 --- a/pandas/_libs/tslibs/nattype.pxd +++ b/pandas/_libs/tslibs/nattype.pxd @@ -4,7 +4,7 @@ from numpy cimport int64_t cdef int64_t NPY_NAT cdef bint _nat_scalar_rules[6] - +cdef set c_nat_strings cdef class _NaT(datetime): cdef readonly: diff --git a/pandas/_libs/tslibs/nattype.pyx b/pandas/_libs/tslibs/nattype.pyx index 99833109844dc..84733f50681e4 100644 --- a/pandas/_libs/tslibs/nattype.pyx +++ b/pandas/_libs/tslibs/nattype.pyx @@ -35,6 +35,7 @@ from pandas._libs.tslibs.base cimport is_period_object # ---------------------------------------------------------------------- # Constants nat_strings = {"NaT", "nat", "NAT", "nan", "NaN", "NAN"} +cdef set c_nat_strings = nat_strings cdef int64_t NPY_NAT = util.get_nat() iNaT = NPY_NAT # python-visible constant diff --git a/pandas/_libs/tslibs/parsing.pyx b/pandas/_libs/tslibs/parsing.pyx index bfa094fcf2891..bea8d66626f6b 100644 --- a/pandas/_libs/tslibs/parsing.pyx +++ b/pandas/_libs/tslibs/parsing.pyx @@ -33,7 +33,10 @@ from dateutil.parser import parse as du_parse from pandas._config import get_option from pandas._libs.tslibs.ccalendar cimport c_MONTH_NUMBERS -from pandas._libs.tslibs.nattype import nat_strings, NaT +from pandas._libs.tslibs.nattype cimport ( + c_nat_strings as nat_strings, + c_NaT as NaT, +) from pandas._libs.tslibs.util cimport ( is_array, is_offset_object, diff --git a/pandas/_libs/tslibs/period.pyx b/pandas/_libs/tslibs/period.pyx index f1bd666472408..a6aea912eac39 100644 --- a/pandas/_libs/tslibs/period.pyx +++ b/pandas/_libs/tslibs/period.pyx @@ -61,9 +61,13 @@ from pandas._libs.tslibs.frequencies cimport ( ) from pandas._libs.tslibs.parsing import parse_time_string from pandas._libs.tslibs.resolution import Resolution -from pandas._libs.tslibs.nattype import nat_strings from pandas._libs.tslibs.nattype cimport ( - _nat_scalar_rules, NPY_NAT, is_null_datetimelike, c_NaT as NaT) + _nat_scalar_rules, + NPY_NAT, + is_null_datetimelike, + c_NaT as NaT, + c_nat_strings as nat_strings, +) from pandas._libs.tslibs.offsets cimport to_offset, is_tick_object from pandas._libs.tslibs.tzconversion cimport tz_convert_utc_to_tzlocal diff --git a/pandas/_libs/tslibs/strptime.pyx b/pandas/_libs/tslibs/strptime.pyx index c56d24d68a175..a209f71dd0676 100644 --- a/pandas/_libs/tslibs/strptime.pyx +++ b/pandas/_libs/tslibs/strptime.pyx @@ -17,8 +17,11 @@ cimport cpython.datetime as datetime from pandas._libs.tslibs.np_datetime cimport ( check_dts_bounds, dtstruct_to_dt64, npy_datetimestruct) -from pandas._libs.tslibs.nattype cimport checknull_with_nat, NPY_NAT -from pandas._libs.tslibs.nattype import nat_strings +from pandas._libs.tslibs.nattype cimport ( + checknull_with_nat, + NPY_NAT, + c_nat_strings as nat_strings, +) cdef dict _parse_code_table = {'y': 0, 'Y': 1, diff --git a/pandas/_libs/tslibs/timedeltas.pyx b/pandas/_libs/tslibs/timedeltas.pyx index a56772c183b08..03419a6267983 100644 --- a/pandas/_libs/tslibs/timedeltas.pyx +++ b/pandas/_libs/tslibs/timedeltas.pyx @@ -28,9 +28,12 @@ from pandas._libs.tslibs.ccalendar cimport DAY_NANOS from pandas._libs.tslibs.np_datetime cimport ( cmp_scalar, reverse_ops, td64_to_tdstruct, pandas_timedeltastruct) -from pandas._libs.tslibs.nattype import nat_strings from pandas._libs.tslibs.nattype cimport ( - checknull_with_nat, NPY_NAT, c_NaT as NaT) + checknull_with_nat, + NPY_NAT, + c_NaT as NaT, + c_nat_strings as nat_strings, +) # ---------------------------------------------------------------------- # Constants diff --git a/pandas/core/tools/datetimes.py b/pandas/core/tools/datetimes.py index d27b30fc32e72..829dd7f7b94c8 100644 --- a/pandas/core/tools/datetimes.py +++ b/pandas/core/tools/datetimes.py @@ -936,7 +936,7 @@ def calc_with_mask(carg, mask): # string with NaN-like try: - mask = ~algorithms.isin(arg, list(tslib.nat_strings)) + mask = ~algorithms.isin(arg, list(tslibs.nat_strings)) return calc_with_mask(arg, mask) except (ValueError, OverflowError, TypeError): pass diff --git a/pandas/tests/tslibs/test_api.py b/pandas/tests/tslibs/test_api.py index 8356b136359d0..ce50b6729ec34 100644 --- a/pandas/tests/tslibs/test_api.py +++ b/pandas/tests/tslibs/test_api.py @@ -29,6 +29,7 @@ def test_namespace(): "NaTType", "iNaT", "is_null_datetimelike", + "nat_strings", "NullFrequencyError", "OutOfBoundsDatetime", "Period",