From a2a8cd183ba500e40299f5a48bbad72712259916 Mon Sep 17 00:00:00 2001
From: Marco Gorelli <33491632+MarcoGorelli@users.noreply.github.com>
Date: Fri, 7 Mar 2025 14:40:50 +0000
Subject: [PATCH 01/10] make some tslibs files pass with pyright-strict

---
 pandas-stubs/_libs/tslibs/strptime.pyi   |  1 +
 pandas-stubs/_libs/tslibs/timedeltas.pyi |  5 ++++-
 pandas-stubs/_libs/tslibs/timestamps.pyi | 23 ++++++++++++++++-------
 tests/test_scalars.py                    | 12 ++++++++++--
 4 files changed, 31 insertions(+), 10 deletions(-)

diff --git a/pandas-stubs/_libs/tslibs/strptime.pyi b/pandas-stubs/_libs/tslibs/strptime.pyi
index 53f1252dd..aa04e7991 100644
--- a/pandas-stubs/_libs/tslibs/strptime.pyi
+++ b/pandas-stubs/_libs/tslibs/strptime.pyi
@@ -1,3 +1,4 @@
+# pyright
 from typing import Any
 
 def array_strptime(*args, **kwargs) -> Any: ...
diff --git a/pandas-stubs/_libs/tslibs/timedeltas.pyi b/pandas-stubs/_libs/tslibs/timedeltas.pyi
index 081f11e9e..01a17e1df 100644
--- a/pandas-stubs/_libs/tslibs/timedeltas.pyi
+++ b/pandas-stubs/_libs/tslibs/timedeltas.pyi
@@ -1,3 +1,4 @@
+# pyright: strict
 import datetime as dt
 from datetime import timedelta
 from typing import (
@@ -241,7 +242,9 @@ class Timedelta(timedelta):
     @overload
     def __rmul__(self, other: float) -> Timedelta: ...
     @overload
-    def __rmul__(self, other: np.ndarray) -> np.ndarray: ...
+    def __rmul__(
+        self, other: npt.NDArray[np.floating] | npt.NDArray[np.integer]
+    ) -> npt.NDArray[np.timedelta64]: ...
     @overload
     def __rmul__(self, other: Series[int]) -> TimedeltaSeries: ...
     @overload
diff --git a/pandas-stubs/_libs/tslibs/timestamps.pyi b/pandas-stubs/_libs/tslibs/timestamps.pyi
index 702c1287d..c94b41253 100644
--- a/pandas-stubs/_libs/tslibs/timestamps.pyi
+++ b/pandas-stubs/_libs/tslibs/timestamps.pyi
@@ -1,11 +1,12 @@
+# pyright: strict
 from datetime import (
-    _IsoCalendarDate,
     date as _date,
     datetime,
     time as _time,
     timedelta,
     tzinfo as _tzinfo,
 )
+from datetime import _IsoCalendarDate  # pyright: ignore[reportPrivateUsage]
 import sys
 from time import struct_time
 from typing import (
@@ -166,25 +167,33 @@ class Timestamp(datetime, SupportsIndex):
     @overload  # type: ignore[override]
     def __le__(self, other: Timestamp | datetime | np.datetime64) -> bool: ...  # type: ignore[misc]
     @overload
-    def __le__(self, other: Index | npt.NDArray[np.datetime64]) -> np_ndarray_bool: ...
+    def __le__(
+        self, other: Index[Timestamp] | npt.NDArray[np.datetime64]
+    ) -> np_ndarray_bool: ...
     @overload
     def __le__(self, other: TimestampSeries) -> Series[bool]: ...
     @overload  # type: ignore[override]
     def __lt__(self, other: Timestamp | datetime | np.datetime64) -> bool: ...  # type: ignore[misc]
     @overload
-    def __lt__(self, other: Index | npt.NDArray[np.datetime64]) -> np_ndarray_bool: ...
+    def __lt__(
+        self, other: Index[Timestamp] | npt.NDArray[np.datetime64]
+    ) -> np_ndarray_bool: ...
     @overload
     def __lt__(self, other: TimestampSeries) -> Series[bool]: ...
     @overload  # type: ignore[override]
     def __ge__(self, other: Timestamp | datetime | np.datetime64) -> bool: ...  # type: ignore[misc]
     @overload
-    def __ge__(self, other: Index | npt.NDArray[np.datetime64]) -> np_ndarray_bool: ...
+    def __ge__(
+        self, other: Index[Timestamp] | npt.NDArray[np.datetime64]
+    ) -> np_ndarray_bool: ...
     @overload
     def __ge__(self, other: TimestampSeries) -> Series[bool]: ...
     @overload  # type: ignore[override]
     def __gt__(self, other: Timestamp | datetime | np.datetime64) -> bool: ...  # type: ignore[misc]
     @overload
-    def __gt__(self, other: Index | npt.NDArray[np.datetime64]) -> np_ndarray_bool: ...
+    def __gt__(
+        self, other: Index[Timestamp] | npt.NDArray[np.datetime64]
+    ) -> np_ndarray_bool: ...
     @overload
     def __gt__(self, other: TimestampSeries) -> Series[bool]: ...
     # error: Signature of "__add__" incompatible with supertype "date"/"datetime"
@@ -224,7 +233,7 @@ class Timestamp(datetime, SupportsIndex):
     @overload
     def __eq__(self, other: TimestampSeries) -> Series[bool]: ...  # type: ignore[overload-overlap]
     @overload
-    def __eq__(self, other: npt.NDArray[np.datetime64] | Index) -> np_ndarray_bool: ...  # type: ignore[overload-overlap]
+    def __eq__(self, other: npt.NDArray[np.datetime64] | Index[Timestamp]) -> np_ndarray_bool: ...  # type: ignore[overload-overlap]
     @overload
     def __eq__(self, other: object) -> Literal[False]: ...
     @overload
@@ -232,7 +241,7 @@ class Timestamp(datetime, SupportsIndex):
     @overload
     def __ne__(self, other: TimestampSeries) -> Series[bool]: ...  # type: ignore[overload-overlap]
     @overload
-    def __ne__(self, other: npt.NDArray[np.datetime64] | Index) -> np_ndarray_bool: ...  # type: ignore[overload-overlap]
+    def __ne__(self, other: npt.NDArray[np.datetime64] | Index[Timestamp]) -> np_ndarray_bool: ...  # type: ignore[overload-overlap]
     @overload
     def __ne__(self, other: object) -> Literal[True]: ...
     def __hash__(self) -> int: ...
diff --git a/tests/test_scalars.py b/tests/test_scalars.py
index 69a3dbf7d..de6d42973 100644
--- a/tests/test_scalars.py
+++ b/tests/test_scalars.py
@@ -713,8 +713,16 @@ def test_timedelta_mul_div() -> None:
 
     check(assert_type(md_int * td, pd.Timedelta), pd.Timedelta)
     check(assert_type(md_float * td, pd.Timedelta), pd.Timedelta)
-    check(assert_type(md_ndarray_intp * td, np.ndarray), np.ndarray, np.timedelta64)
-    check(assert_type(md_ndarray_float * td, np.ndarray), np.ndarray, np.timedelta64)
+    check(
+        assert_type(md_ndarray_intp * td, npt.NDArray[np.timedelta64]),
+        np.ndarray,
+        np.timedelta64,
+    )
+    check(
+        assert_type(md_ndarray_float * td, npt.NDArray[np.timedelta64]),
+        np.ndarray,
+        np.timedelta64,
+    )
     check(assert_type(mp_series_int * td, TimedeltaSeries), pd.Series, pd.Timedelta)
     check(assert_type(md_series_float * td, TimedeltaSeries), pd.Series, pd.Timedelta)
     check(assert_type(md_int64_index * td, pd.TimedeltaIndex), pd.TimedeltaIndex)

From 5fb4fcb48f7c8b224af43befc871a83442043344 Mon Sep 17 00:00:00 2001
From: Marco Gorelli <33491632+MarcoGorelli@users.noreply.github.com>
Date: Mon, 10 Mar 2025 14:00:55 +0000
Subject: [PATCH 02/10] add test which uses unknown index

---
 pandas-stubs/_libs/tslibs/timestamps.pyi | 13 ++++++-------
 tests/test_scalars.py                    |  4 ++++
 2 files changed, 10 insertions(+), 7 deletions(-)

diff --git a/pandas-stubs/_libs/tslibs/timestamps.pyi b/pandas-stubs/_libs/tslibs/timestamps.pyi
index c94b41253..b3f87910f 100644
--- a/pandas-stubs/_libs/tslibs/timestamps.pyi
+++ b/pandas-stubs/_libs/tslibs/timestamps.pyi
@@ -20,7 +20,6 @@ from _typing import TimeZones
 import numpy as np
 from pandas import (
     DatetimeIndex,
-    Index,
     TimedeltaIndex,
 )
 from pandas.core.series import (
@@ -168,7 +167,7 @@ class Timestamp(datetime, SupportsIndex):
     def __le__(self, other: Timestamp | datetime | np.datetime64) -> bool: ...  # type: ignore[misc]
     @overload
     def __le__(
-        self, other: Index[Timestamp] | npt.NDArray[np.datetime64]
+        self, other: DatetimeIndex | npt.NDArray[np.datetime64]
     ) -> np_ndarray_bool: ...
     @overload
     def __le__(self, other: TimestampSeries) -> Series[bool]: ...
@@ -176,7 +175,7 @@ class Timestamp(datetime, SupportsIndex):
     def __lt__(self, other: Timestamp | datetime | np.datetime64) -> bool: ...  # type: ignore[misc]
     @overload
     def __lt__(
-        self, other: Index[Timestamp] | npt.NDArray[np.datetime64]
+        self, other: DatetimeIndex | npt.NDArray[np.datetime64]
     ) -> np_ndarray_bool: ...
     @overload
     def __lt__(self, other: TimestampSeries) -> Series[bool]: ...
@@ -184,7 +183,7 @@ class Timestamp(datetime, SupportsIndex):
     def __ge__(self, other: Timestamp | datetime | np.datetime64) -> bool: ...  # type: ignore[misc]
     @overload
     def __ge__(
-        self, other: Index[Timestamp] | npt.NDArray[np.datetime64]
+        self, other: DatetimeIndex | npt.NDArray[np.datetime64]
     ) -> np_ndarray_bool: ...
     @overload
     def __ge__(self, other: TimestampSeries) -> Series[bool]: ...
@@ -192,7 +191,7 @@ class Timestamp(datetime, SupportsIndex):
     def __gt__(self, other: Timestamp | datetime | np.datetime64) -> bool: ...  # type: ignore[misc]
     @overload
     def __gt__(
-        self, other: Index[Timestamp] | npt.NDArray[np.datetime64]
+        self, other: DatetimeIndex | npt.NDArray[np.datetime64]
     ) -> np_ndarray_bool: ...
     @overload
     def __gt__(self, other: TimestampSeries) -> Series[bool]: ...
@@ -233,7 +232,7 @@ class Timestamp(datetime, SupportsIndex):
     @overload
     def __eq__(self, other: TimestampSeries) -> Series[bool]: ...  # type: ignore[overload-overlap]
     @overload
-    def __eq__(self, other: npt.NDArray[np.datetime64] | Index[Timestamp]) -> np_ndarray_bool: ...  # type: ignore[overload-overlap]
+    def __eq__(self, other: npt.NDArray[np.datetime64] | DatetimeIndex) -> np_ndarray_bool: ...  # type: ignore[overload-overlap]
     @overload
     def __eq__(self, other: object) -> Literal[False]: ...
     @overload
@@ -241,7 +240,7 @@ class Timestamp(datetime, SupportsIndex):
     @overload
     def __ne__(self, other: TimestampSeries) -> Series[bool]: ...  # type: ignore[overload-overlap]
     @overload
-    def __ne__(self, other: npt.NDArray[np.datetime64] | Index[Timestamp]) -> np_ndarray_bool: ...  # type: ignore[overload-overlap]
+    def __ne__(self, other: npt.NDArray[np.datetime64] | DatetimeIndex) -> np_ndarray_bool: ...  # type: ignore[overload-overlap]
     @overload
     def __ne__(self, other: object) -> Literal[True]: ...
     def __hash__(self) -> int: ...
diff --git a/tests/test_scalars.py b/tests/test_scalars.py
index de6d42973..4d02cd54a 100644
--- a/tests/test_scalars.py
+++ b/tests/test_scalars.py
@@ -1261,6 +1261,8 @@ def test_timestamp_cmp() -> None:
     c_np_dt64 = np.datetime64(1, "ns")
     c_dt_datetime = dt.datetime(year=2000, month=1, day=1)
     c_datetimeindex = pd.DatetimeIndex(["2000-1-1"])
+    # DatetimeIndex, but the type checker detects it to be Index[Unknown].
+    c_unknown_index = pd.DataFrame({"a": [1]}, index=c_datetimeindex).index
     c_np_ndarray_dt64 = np_dt64_arr
     c_series_dt64: TimestampSeries = pd.Series([1, 2, 3], dtype="datetime64[ns]")
     c_series_timestamp = pd.Series(pd.DatetimeIndex(["2000-1-1"]))
@@ -1281,6 +1283,8 @@ def test_timestamp_cmp() -> None:
 
     check(assert_type(ts > c_datetimeindex, np_ndarray_bool), np.ndarray, np.bool_)
     check(assert_type(ts <= c_datetimeindex, np_ndarray_bool), np.ndarray, np.bool_)
+    check(assert_type(ts > c_unknown_index, np_ndarray_bool), np.ndarray, np.bool_)
+    check(assert_type(ts <= c_unknown_index, np_ndarray_bool), np.ndarray, np.bool_)
 
     check(assert_type(ts > c_np_ndarray_dt64, np_ndarray_bool), np.ndarray, np.bool_)
     check(assert_type(ts <= c_np_ndarray_dt64, np_ndarray_bool), np.ndarray, np.bool_)

From f39c5c49b61ee344b72b1a29b0a24d8d3f1c6a29 Mon Sep 17 00:00:00 2001
From: Marco Gorelli <33491632+MarcoGorelli@users.noreply.github.com>
Date: Mon, 10 Mar 2025 14:36:54 +0000
Subject: [PATCH 03/10] try reverting strict in timestamps.pyi

---
 pandas-stubs/_libs/tslibs/timestamps.pyi | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/pandas-stubs/_libs/tslibs/timestamps.pyi b/pandas-stubs/_libs/tslibs/timestamps.pyi
index b3f87910f..a970f4192 100644
--- a/pandas-stubs/_libs/tslibs/timestamps.pyi
+++ b/pandas-stubs/_libs/tslibs/timestamps.pyi
@@ -1,12 +1,11 @@
-# pyright: strict
 from datetime import (
+    _IsoCalendarDate,
     date as _date,
     datetime,
     time as _time,
     timedelta,
     tzinfo as _tzinfo,
 )
-from datetime import _IsoCalendarDate  # pyright: ignore[reportPrivateUsage]
 import sys
 from time import struct_time
 from typing import (

From ae12843a25dcd73a1bfc639425f94e6f8bb8704a Mon Sep 17 00:00:00 2001
From: Marco Gorelli <33491632+MarcoGorelli@users.noreply.github.com>
Date: Mon, 10 Mar 2025 19:22:16 +0000
Subject: [PATCH 04/10] use Index[Any] for __eq__ and __neq__

---
 pandas-stubs/_libs/tslibs/timestamps.pyi | 6 ++++--
 tests/test_scalars.py                    | 9 +++++++++
 2 files changed, 13 insertions(+), 2 deletions(-)

diff --git a/pandas-stubs/_libs/tslibs/timestamps.pyi b/pandas-stubs/_libs/tslibs/timestamps.pyi
index a970f4192..7c12da3ad 100644
--- a/pandas-stubs/_libs/tslibs/timestamps.pyi
+++ b/pandas-stubs/_libs/tslibs/timestamps.pyi
@@ -9,6 +9,7 @@ from datetime import (
 import sys
 from time import struct_time
 from typing import (
+    Any,
     ClassVar,
     Literal,
     SupportsIndex,
@@ -19,6 +20,7 @@ from _typing import TimeZones
 import numpy as np
 from pandas import (
     DatetimeIndex,
+    Index,
     TimedeltaIndex,
 )
 from pandas.core.series import (
@@ -231,7 +233,7 @@ class Timestamp(datetime, SupportsIndex):
     @overload
     def __eq__(self, other: TimestampSeries) -> Series[bool]: ...  # type: ignore[overload-overlap]
     @overload
-    def __eq__(self, other: npt.NDArray[np.datetime64] | DatetimeIndex) -> np_ndarray_bool: ...  # type: ignore[overload-overlap]
+    def __eq__(self, other: npt.NDArray[np.datetime64] | Index[Any]) -> np_ndarray_bool: ...  # type: ignore[overload-overlap]
     @overload
     def __eq__(self, other: object) -> Literal[False]: ...
     @overload
@@ -239,7 +241,7 @@ class Timestamp(datetime, SupportsIndex):
     @overload
     def __ne__(self, other: TimestampSeries) -> Series[bool]: ...  # type: ignore[overload-overlap]
     @overload
-    def __ne__(self, other: npt.NDArray[np.datetime64] | DatetimeIndex) -> np_ndarray_bool: ...  # type: ignore[overload-overlap]
+    def __ne__(self, other: npt.NDArray[np.datetime64] | Index[Any]) -> np_ndarray_bool: ...  # type: ignore[overload-overlap]
     @overload
     def __ne__(self, other: object) -> Literal[True]: ...
     def __hash__(self) -> int: ...
diff --git a/tests/test_scalars.py b/tests/test_scalars.py
index 4d02cd54a..086324799 100644
--- a/tests/test_scalars.py
+++ b/tests/test_scalars.py
@@ -1325,6 +1325,8 @@ def test_timestamp_cmp() -> None:
 
     check(assert_type(ts >= c_datetimeindex, np_ndarray_bool), np.ndarray, np.bool_)
     check(assert_type(ts < c_datetimeindex, np_ndarray_bool), np.ndarray, np.bool_)
+    check(assert_type(ts >= c_unknown_index, np_ndarray_bool), np.ndarray, np.bool_)
+    check(assert_type(ts < c_unknown_index, np_ndarray_bool), np.ndarray, np.bool_)
 
     check(assert_type(ts >= c_np_ndarray_dt64, np_ndarray_bool), np.ndarray, np.bool_)
     check(assert_type(ts < c_np_ndarray_dt64, np_ndarray_bool), np.ndarray, np.bool_)
@@ -1370,6 +1372,13 @@ def test_timestamp_cmp() -> None:
         assert_type(ts != c_datetimeindex, np_ndarray_bool), np.ndarray, np.bool_
     )
     assert (eq_arr != ne_arr).all()
+    eq_arr = check(
+        assert_type(ts == c_unknown_index, np_ndarray_bool), np.ndarray, np.bool_
+    )
+    ne_arr = check(
+        assert_type(ts != c_unknown_index, np_ndarray_bool), np.ndarray, np.bool_
+    )
+    assert (eq_arr != ne_arr).all()
 
     eq_arr = check(
         assert_type(ts == c_np_ndarray_dt64, np_ndarray_bool), np.ndarray, np.bool_

From e39056f59e8adcd600b9a9318bc7a035c730a96a Mon Sep 17 00:00:00 2001
From: Marco Gorelli <33491632+MarcoGorelli@users.noreply.github.com>
Date: Mon, 10 Mar 2025 19:23:23 +0000
Subject: [PATCH 05/10] try putting strict back

---
 pandas-stubs/_libs/tslibs/timestamps.pyi | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/pandas-stubs/_libs/tslibs/timestamps.pyi b/pandas-stubs/_libs/tslibs/timestamps.pyi
index 7c12da3ad..5140f6e56 100644
--- a/pandas-stubs/_libs/tslibs/timestamps.pyi
+++ b/pandas-stubs/_libs/tslibs/timestamps.pyi
@@ -1,11 +1,12 @@
+# pyright: strict
 from datetime import (
-    _IsoCalendarDate,
     date as _date,
     datetime,
     time as _time,
     timedelta,
     tzinfo as _tzinfo,
 )
+from datetime import _IsoCalendarDate  # pyright: ignore[reportPrivateUsage]
 import sys
 from time import struct_time
 from typing import (

From 21c6f6bc4b1b2d7942cbf877fe38d417c0b23bd1 Mon Sep 17 00:00:00 2001
From: Marco Gorelli <33491632+MarcoGorelli@users.noreply.github.com>
Date: Tue, 11 Mar 2025 15:32:20 +0000
Subject: [PATCH 06/10] DataFrame.index -> UnknownIndex

---
 pandas-stubs/core/frame.pyi | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/pandas-stubs/core/frame.pyi b/pandas-stubs/core/frame.pyi
index 03fab417e..0fd4a673e 100644
--- a/pandas-stubs/core/frame.pyi
+++ b/pandas-stubs/core/frame.pyi
@@ -31,7 +31,10 @@ from pandas.core.generic import NDFrame
 from pandas.core.groupby.generic import DataFrameGroupBy
 from pandas.core.groupby.grouper import Grouper
 from pandas.core.indexers import BaseIndexer
-from pandas.core.indexes.base import Index
+from pandas.core.indexes.base import (
+    Index,
+    UnknownIndex,
+)
 from pandas.core.indexes.category import CategoricalIndex
 from pandas.core.indexes.datetimes import DatetimeIndex
 from pandas.core.indexes.interval import IntervalIndex
@@ -1617,7 +1620,7 @@ class DataFrame(NDFrame, OpsMixin, _GetItemHack):
     @property
     def iloc(self) -> _iLocIndexerFrame[Self]: ...
     @property
-    def index(self) -> Index: ...
+    def index(self) -> UnknownIndex: ...
     @index.setter
     def index(self, idx: Index) -> None: ...
     @property

From 8e582fa4cf892edb5136f8ca3e89ba580561cb0f Mon Sep 17 00:00:00 2001
From: Irv Lustig <irv@princeton.com>
Date: Tue, 11 Mar 2025 12:32:19 -0400
Subject: [PATCH 07/10] try using _tzinfo

---
 pandas-stubs/_typing.pyi | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/pandas-stubs/_typing.pyi b/pandas-stubs/_typing.pyi
index 478f60da0..cb4b05850 100644
--- a/pandas-stubs/_typing.pyi
+++ b/pandas-stubs/_typing.pyi
@@ -8,7 +8,7 @@ from collections.abc import (
     Sequence,
 )
 import datetime
-from datetime import tzinfo
+from datetime import tzinfo as _tzinfo
 from os import PathLike
 from re import Pattern
 import sys
@@ -833,6 +833,6 @@ TimeGrouperOrigin: TypeAlias = (
 ExcelReadEngine: TypeAlias = Literal["xlrd", "openpyxl", "odf", "pyxlsb", "calamine"]
 ExcelWriteEngine: TypeAlias = Literal["openpyxl", "odf", "xlsxwriter"]
 
-TimeZones: TypeAlias = str | tzinfo | None | int
+TimeZones: TypeAlias = str | _tzinfo | None | int
 
 __all__ = ["npt", "type_t"]

From e0feec3e86f3f92488a4dd3130bd137249415086 Mon Sep 17 00:00:00 2001
From: Irv Lustig <irv@princeton.com>
Date: Tue, 11 Mar 2025 12:36:45 -0400
Subject: [PATCH 08/10] try changing pyproject to avoid cache

---
 pyproject.toml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pyproject.toml b/pyproject.toml
index 2570e0898..ca1f3c13f 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -42,7 +42,7 @@ pytest = ">=7.1.2"
 pyright = ">=1.1.396"
 poethepoet = ">=0.16.5"
 loguru = ">=0.6.0"
-typing-extensions = ">=4.4.0"
+typing-extensions = ">=4.12.2"
 matplotlib = ">=3.6.3"
 pre-commit = ">=2.19.0"
 black = ">=23.3.0"

From c56914972cdd6f5c03dec6e6e24c55f7005f6cc6 Mon Sep 17 00:00:00 2001
From: Irv Lustig <irv@princeton.com>
Date: Tue, 11 Mar 2025 12:45:11 -0400
Subject: [PATCH 09/10] try pyright 1.1.394

---
 pyproject.toml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pyproject.toml b/pyproject.toml
index ca1f3c13f..6b71f358a 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -39,7 +39,7 @@ mypy = "1.15.0"
 pandas = "2.2.3"
 pyarrow = ">=10.0.1"
 pytest = ">=7.1.2"
-pyright = ">=1.1.396"
+pyright = "1.1.394"
 poethepoet = ">=0.16.5"
 loguru = ">=0.6.0"
 typing-extensions = ">=4.12.2"

From ba674e4b260546f2c6cbe267b6ff61ae972ce4b4 Mon Sep 17 00:00:00 2001
From: Irv Lustig <irv@princeton.com>
Date: Tue, 11 Mar 2025 13:12:21 -0400
Subject: [PATCH 10/10] move Timezones into timestamps.pyi

---
 pandas-stubs/_libs/tslibs/timestamps.pyi | 3 ++-
 pyproject.toml                           | 2 +-
 2 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/pandas-stubs/_libs/tslibs/timestamps.pyi b/pandas-stubs/_libs/tslibs/timestamps.pyi
index 5140f6e56..b311dbfd6 100644
--- a/pandas-stubs/_libs/tslibs/timestamps.pyi
+++ b/pandas-stubs/_libs/tslibs/timestamps.pyi
@@ -17,7 +17,7 @@ from typing import (
     overload,
 )
 
-from _typing import TimeZones
+# from _typing import TimeZones
 import numpy as np
 from pandas import (
     DatetimeIndex,
@@ -51,6 +51,7 @@ _Ambiguous: TypeAlias = bool | Literal["raise", "NaT"]
 _Nonexistent: TypeAlias = (
     Literal["raise", "NaT", "shift_backward", "shift_forward"] | Timedelta | timedelta
 )
+TimeZones: TypeAlias = str | _tzinfo | None | int
 
 class Timestamp(datetime, SupportsIndex):
     min: ClassVar[Timestamp]  # pyright: ignore[reportIncompatibleVariableOverride]
diff --git a/pyproject.toml b/pyproject.toml
index 6b71f358a..ca1f3c13f 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -39,7 +39,7 @@ mypy = "1.15.0"
 pandas = "2.2.3"
 pyarrow = ">=10.0.1"
 pytest = ">=7.1.2"
-pyright = "1.1.394"
+pyright = ">=1.1.396"
 poethepoet = ">=0.16.5"
 loguru = ">=0.6.0"
 typing-extensions = ">=4.12.2"