diff --git a/doc/source/whatsnew/v1.3.0.rst b/doc/source/whatsnew/v1.3.0.rst index b061c4040096e..183f50b961d62 100644 --- a/doc/source/whatsnew/v1.3.0.rst +++ b/doc/source/whatsnew/v1.3.0.rst @@ -243,7 +243,7 @@ Timedelta Timezones ^^^^^^^^^ - Bug in different ``tzinfo`` objects representing UTC not being treated as equivalent (:issue:`39216`) -- +- Bug in ``dateutil.tz.gettz("UTC")`` not being recognized as equivalent to other UTC-representing tzinfos (:issue:`39276`) - Numeric diff --git a/pandas/_libs/tslibs/timezones.pyx b/pandas/_libs/tslibs/timezones.pyx index 0da9e2050907a..73d06d4641368 100644 --- a/pandas/_libs/tslibs/timezones.pyx +++ b/pandas/_libs/tslibs/timezones.pyx @@ -30,11 +30,18 @@ from pandas._libs.tslibs.util cimport get_nat, is_integer_object cdef int64_t NPY_NAT = get_nat() cdef tzinfo utc_stdlib = timezone.utc cdef tzinfo utc_pytz = UTC +cdef tzinfo utc_dateutil_str = dateutil_gettz("UTC") # NB: *not* the same as tzutc() + # ---------------------------------------------------------------------- cpdef inline bint is_utc(tzinfo tz): - return tz is utc_pytz or tz is utc_stdlib or isinstance(tz, _dateutil_tzutc) + return ( + tz is utc_pytz + or tz is utc_stdlib + or isinstance(tz, _dateutil_tzutc) + or tz is utc_dateutil_str + ) cdef inline bint is_tzlocal(tzinfo tz): diff --git a/pandas/conftest.py b/pandas/conftest.py index 45d545a522fc7..ff049a7cc3bac 100644 --- a/pandas/conftest.py +++ b/pandas/conftest.py @@ -1023,6 +1023,9 @@ def utc_fixture(request): return request.param +utc_fixture2 = utc_fixture + + # ---------------------------------------------------------------- # Dtypes # ---------------------------------------------------------------- diff --git a/pandas/tests/tslibs/test_timezones.py b/pandas/tests/tslibs/test_timezones.py index 3e825460d6ddd..33f83c3579c43 100644 --- a/pandas/tests/tslibs/test_timezones.py +++ b/pandas/tests/tslibs/test_timezones.py @@ -9,6 +9,11 @@ from pandas import Timestamp +def test_is_utc(utc_fixture): + tz = timezones.maybe_get_tz(utc_fixture) + assert timezones.is_utc(tz) + + @pytest.mark.parametrize("tz_name", list(pytz.common_timezones)) def test_cache_keys_are_distinct_for_pytz_vs_dateutil(tz_name): if tz_name == "UTC": @@ -56,6 +61,12 @@ def test_tzlocal_is_not_utc(): assert not timezones.tz_compare(tz, dateutil.tz.tzutc()) +def test_tz_compare_utc(utc_fixture, utc_fixture2): + tz = timezones.maybe_get_tz(utc_fixture) + tz2 = timezones.maybe_get_tz(utc_fixture2) + assert timezones.tz_compare(tz, tz2) + + @pytest.fixture( params=[ (pytz.timezone("US/Eastern"), lambda tz, x: tz.localize(x)),