From b945fbf03d8ef03d370f31b2c15430e58a0c82f0 Mon Sep 17 00:00:00 2001 From: Patrick Hoefler <61934744+phofl@users.noreply.github.com> Date: Wed, 26 Apr 2023 17:56:44 +0200 Subject: [PATCH 1/3] Remove compat for Python lower than 3.9 --- pandas/compat/__init__.py | 2 -- pandas/compat/_constants.py | 2 -- pandas/conftest.py | 23 ++++++++--------- pandas/core/computation/expr.py | 4 --- .../scalar/timestamp/test_constructors.py | 25 +++++++------------ 5 files changed, 19 insertions(+), 37 deletions(-) diff --git a/pandas/compat/__init__.py b/pandas/compat/__init__.py index 745b20dc4e764..3d7589bf67ee2 100644 --- a/pandas/compat/__init__.py +++ b/pandas/compat/__init__.py @@ -16,7 +16,6 @@ from pandas.compat._constants import ( IS64, - PY39, PY310, PY311, PYPY, @@ -161,7 +160,6 @@ def get_lzma_file() -> type[pandas.compat.compressors.LZMAFile]: "pa_version_under9p0", "pa_version_under11p0", "IS64", - "PY39", "PY310", "PY311", "PYPY", diff --git a/pandas/compat/_constants.py b/pandas/compat/_constants.py index 75d99f5ae51fb..1d522a5b4cd09 100644 --- a/pandas/compat/_constants.py +++ b/pandas/compat/_constants.py @@ -12,7 +12,6 @@ IS64 = sys.maxsize > 2**32 -PY39 = sys.version_info >= (3, 9) PY310 = sys.version_info >= (3, 10) PY311 = sys.version_info >= (3, 11) PYPY = platform.python_implementation() == "PyPy" @@ -20,7 +19,6 @@ __all__ = [ "IS64", - "PY39", "PY310", "PY311", "PYPY", diff --git a/pandas/conftest.py b/pandas/conftest.py index 9ede9e65a6839..1824eb418b735 100644 --- a/pandas/conftest.py +++ b/pandas/conftest.py @@ -64,7 +64,6 @@ Series, Timedelta, Timestamp, - compat, ) import pandas._testing as tm from pandas.core import ops @@ -81,18 +80,16 @@ del pa has_pyarrow = True -zoneinfo = None -if compat.PY39: - # Import "zoneinfo" could not be resolved (reportMissingImports) - import zoneinfo # type: ignore[assignment] - - # Although zoneinfo can be imported in Py39, it is effectively - # "not available" without tzdata/IANA tz data. - # We will set zoneinfo to not found in this case - try: - zoneinfo.ZoneInfo("UTC") # type: ignore[attr-defined] - except zoneinfo.ZoneInfoNotFoundError: # type: ignore[attr-defined] - zoneinfo = None +# Import "zoneinfo" could not be resolved (reportMissingImports) +import zoneinfo # type: ignore[assignment] + +# Although zoneinfo can be imported in Py39, it is effectively +# "not available" without tzdata/IANA tz data. +# We will set zoneinfo to not found in this case +try: + zoneinfo.ZoneInfo("UTC") # type: ignore[attr-defined] +except zoneinfo.ZoneInfoNotFoundError: # type: ignore[attr-defined] + zoneinfo = None # ---------------------------------------------------------------- diff --git a/pandas/core/computation/expr.py b/pandas/core/computation/expr.py index 75e8b30d2e1f5..8436126232cf9 100644 --- a/pandas/core/computation/expr.py +++ b/pandas/core/computation/expr.py @@ -17,7 +17,6 @@ import numpy as np -from pandas.compat import PY39 from pandas.errors import UndefinedVariableError import pandas.core.common as com @@ -208,9 +207,6 @@ def _filter_nodes(superclass, all_nodes=_all_nodes): _keyword_nodes = _filter_nodes(ast.keyword) _alias_nodes = _filter_nodes(ast.alias) -if not PY39: - _slice_nodes = _filter_nodes(ast.slice) - # nodes that we don't support directly but are needed for parsing _hacked_nodes = frozenset(["Assign", "Module", "Expr"]) diff --git a/pandas/tests/scalar/timestamp/test_constructors.py b/pandas/tests/scalar/timestamp/test_constructors.py index 4851612392e68..7b5fb41865121 100644 --- a/pandas/tests/scalar/timestamp/test_constructors.py +++ b/pandas/tests/scalar/timestamp/test_constructors.py @@ -5,6 +5,7 @@ timedelta, timezone, ) +import zoneinfo import dateutil.tz from dateutil.tz import tzutc @@ -13,10 +14,7 @@ import pytz from pandas._libs.tslibs.dtypes import NpyDatetimeUnit -from pandas.compat import ( - PY39, - PY310, -) +from pandas.compat import PY310 from pandas.errors import OutOfBoundsDatetime from pandas import ( @@ -25,9 +23,6 @@ Timestamp, ) -if PY39: - import zoneinfo - class TestTimestampConstructors: def test_construct_from_string_invalid_raises(self): @@ -845,15 +840,13 @@ def test_timestamp_constructor_retain_fold(tz, fold): assert result == expected -_tzs = ["dateutil/Europe/London"] -if PY39: - try: - _tzs = [ - "dateutil/Europe/London", - zoneinfo.ZoneInfo("Europe/London"), # type: ignore[list-item] - ] - except zoneinfo.ZoneInfoNotFoundError: - pass +try: + _tzs = [ + "dateutil/Europe/London", + zoneinfo.ZoneInfo("Europe/London"), # type: ignore[list-item] + ] +except zoneinfo.ZoneInfoNotFoundError: + _tzs = ["dateutil/Europe/London"] @pytest.mark.parametrize("tz", _tzs) From a5dd6b50d986ed040d7bbd165af4e27d9c20c881 Mon Sep 17 00:00:00 2001 From: Patrick Hoefler <61934744+phofl@users.noreply.github.com> Date: Wed, 26 Apr 2023 18:23:30 +0200 Subject: [PATCH 2/3] Remove wheel build --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index e7322e748662f..549a6374246a0 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -92,4 +92,4 @@ workflows: only: /^v.*/ matrix: parameters: - cibw-build: ["cp38-manylinux_aarch64", "cp39-manylinux_aarch64", "cp310-manylinux_aarch64", "cp311-manylinux_aarch64"] + cibw-build: ["cp39-manylinux_aarch64", "cp310-manylinux_aarch64", "cp311-manylinux_aarch64"] From c7eadb990fc8e8993daf19eb09fd575e3896fc3d Mon Sep 17 00:00:00 2001 From: Patrick Hoefler <61934744+phofl@users.noreply.github.com> Date: Wed, 26 Apr 2023 20:11:44 +0200 Subject: [PATCH 3/3] Fix mypy --- pandas/conftest.py | 23 +++++++++---------- .../scalar/timestamp/test_constructors.py | 2 +- 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/pandas/conftest.py b/pandas/conftest.py index 1824eb418b735..86f0121dd00a9 100644 --- a/pandas/conftest.py +++ b/pandas/conftest.py @@ -80,16 +80,12 @@ del pa has_pyarrow = True -# Import "zoneinfo" could not be resolved (reportMissingImports) -import zoneinfo # type: ignore[assignment] +import zoneinfo -# Although zoneinfo can be imported in Py39, it is effectively -# "not available" without tzdata/IANA tz data. -# We will set zoneinfo to not found in this case try: - zoneinfo.ZoneInfo("UTC") # type: ignore[attr-defined] -except zoneinfo.ZoneInfoNotFoundError: # type: ignore[attr-defined] - zoneinfo = None + zoneinfo.ZoneInfo("UTC") +except zoneinfo.ZoneInfoNotFoundError: + zoneinfo = None # type: ignore[assignment] # ---------------------------------------------------------------- @@ -1218,7 +1214,12 @@ def iris(datapath) -> DataFrame: timezone(timedelta(hours=-1), name="foo"), ] if zoneinfo is not None: - TIMEZONES.extend([zoneinfo.ZoneInfo("US/Pacific"), zoneinfo.ZoneInfo("UTC")]) + TIMEZONES.extend( + [ + zoneinfo.ZoneInfo("US/Pacific"), # type: ignore[list-item] + zoneinfo.ZoneInfo("UTC"), # type: ignore[list-item] + ] + ) TIMEZONE_IDS = [repr(i) for i in TIMEZONES] @@ -1961,9 +1962,7 @@ def using_copy_on_write() -> bool: warsaws = ["Europe/Warsaw", "dateutil/Europe/Warsaw"] if zoneinfo is not None: - warsaws.append( - zoneinfo.ZoneInfo("Europe/Warsaw") # pyright: ignore[reportGeneralTypeIssues] - ) + warsaws.append(zoneinfo.ZoneInfo("Europe/Warsaw")) # type: ignore[arg-type] @pytest.fixture(params=warsaws) diff --git a/pandas/tests/scalar/timestamp/test_constructors.py b/pandas/tests/scalar/timestamp/test_constructors.py index 7b5fb41865121..ceadf7a280a1b 100644 --- a/pandas/tests/scalar/timestamp/test_constructors.py +++ b/pandas/tests/scalar/timestamp/test_constructors.py @@ -843,7 +843,7 @@ def test_timestamp_constructor_retain_fold(tz, fold): try: _tzs = [ "dateutil/Europe/London", - zoneinfo.ZoneInfo("Europe/London"), # type: ignore[list-item] + zoneinfo.ZoneInfo("Europe/London"), ] except zoneinfo.ZoneInfoNotFoundError: _tzs = ["dateutil/Europe/London"]