Skip to content

Commit e799ec1

Browse files
GH1327 Add overloead for date_range and timedelta_range (#1333)
* GH1327 Add overloead for date_range and timedelta_range * GH1327 Fix CI * GH1327 PR feedback * GH1327 Revert changes to start clean * GH1327 PR Feedback
1 parent fd43653 commit e799ec1

File tree

4 files changed

+180
-8
lines changed

4 files changed

+180
-8
lines changed

pandas-stubs/core/indexes/datetimes.pyi

Lines changed: 39 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -102,11 +102,46 @@ class DatetimeIndex(
102102
self, periods: int = 1, freq: DateOffset | Timedelta | str | None = None
103103
) -> Self: ...
104104

105+
@overload
106+
def date_range(
107+
start: str | DateAndDatetimeLike,
108+
end: str | DateAndDatetimeLike,
109+
freq: str | timedelta | Timedelta | BaseOffset | None = None,
110+
tz: TimeZones = None,
111+
normalize: bool = False,
112+
name: Hashable | None = None,
113+
inclusive: IntervalClosedType = "both",
114+
unit: TimeUnit | None = None,
115+
) -> DatetimeIndex: ...
116+
@overload
105117
def date_range(
106-
start: str | DateAndDatetimeLike | None = None,
107-
end: str | DateAndDatetimeLike | None = None,
108-
periods: int | None = None,
109-
freq: str | timedelta | Timedelta | BaseOffset = "D",
118+
start: str | DateAndDatetimeLike,
119+
end: str | DateAndDatetimeLike,
120+
periods: int,
121+
tz: TimeZones = None,
122+
normalize: bool = False,
123+
name: Hashable | None = None,
124+
inclusive: IntervalClosedType = "both",
125+
unit: TimeUnit | None = None,
126+
) -> DatetimeIndex: ...
127+
@overload
128+
def date_range(
129+
start: str | DateAndDatetimeLike,
130+
*,
131+
periods: int,
132+
freq: str | timedelta | Timedelta | BaseOffset | None = None,
133+
tz: TimeZones = None,
134+
normalize: bool = False,
135+
name: Hashable | None = None,
136+
inclusive: IntervalClosedType = "both",
137+
unit: TimeUnit | None = None,
138+
) -> DatetimeIndex: ...
139+
@overload
140+
def date_range(
141+
*,
142+
end: str | DateAndDatetimeLike,
143+
periods: int,
144+
freq: str | timedelta | Timedelta | BaseOffset | None = None,
110145
tz: TimeZones = None,
111146
normalize: bool = False,
112147
name: Hashable | None = None,

pandas-stubs/core/indexes/timedeltas.pyi

Lines changed: 33 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -79,13 +79,43 @@ class TimedeltaIndex(
7979
def to_series(self, index=..., name: Hashable = ...) -> TimedeltaSeries: ...
8080
def shift(self, periods: int = 1, freq=...) -> Self: ...
8181

82+
@overload
8283
def timedelta_range(
83-
start: TimedeltaConvertibleTypes | None = None,
84-
end: TimedeltaConvertibleTypes | None = None,
85-
periods: int | None = None,
84+
start: TimedeltaConvertibleTypes,
85+
end: TimedeltaConvertibleTypes,
86+
*,
87+
freq: str | DateOffset | Timedelta | dt.timedelta | None = None,
88+
name: Hashable | None = None,
89+
closed: Literal["left", "right"] | None = None,
90+
unit: None | str = ...,
91+
) -> TimedeltaIndex: ...
92+
@overload
93+
def timedelta_range(
94+
*,
95+
end: TimedeltaConvertibleTypes,
96+
periods: int,
97+
freq: str | DateOffset | Timedelta | dt.timedelta | None = None,
98+
name: Hashable | None = None,
99+
closed: Literal["left", "right"] | None = None,
100+
unit: None | str = ...,
101+
) -> TimedeltaIndex: ...
102+
@overload
103+
def timedelta_range(
104+
start: TimedeltaConvertibleTypes,
105+
*,
106+
periods: int,
86107
freq: str | DateOffset | Timedelta | dt.timedelta | None = None,
87108
name: Hashable | None = None,
88109
closed: Literal["left", "right"] | None = None,
110+
unit: None | str = ...,
111+
) -> TimedeltaIndex: ...
112+
@overload
113+
def timedelta_range(
114+
start: TimedeltaConvertibleTypes,
115+
end: TimedeltaConvertibleTypes,
116+
periods: int,
89117
*,
118+
name: Hashable | None = None,
119+
closed: Literal["left", "right"] | None = None,
90120
unit: None | str = ...,
91121
) -> TimedeltaIndex: ...

tests/test_styler.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
from pandas._typing import Scalar
2323

2424
from tests import (
25+
PD_LTE_23,
2526
check,
2627
ensure_clean,
2728
)
@@ -141,7 +142,9 @@ def test_highlight_quantile() -> None:
141142

142143

143144
def test_loader() -> None:
144-
check(assert_type(DF.style.loader, PackageLoader), PackageLoader)
145+
if PD_LTE_23:
146+
# see GH62123 for pandas main repo, type changes in pandas 3.0
147+
check(assert_type(DF.style.loader, PackageLoader), PackageLoader)
145148

146149

147150
def test_pipe() -> None:

tests/test_timefuncs.py

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1705,6 +1705,110 @@ def test_date_range_unit():
17051705
)
17061706

17071707

1708+
def test_date_range_overloads() -> None:
1709+
"""Test different overloads of pd.date_range (GH1327)."""
1710+
t1 = pd.Timestamp("2023-04-05")
1711+
t2 = pd.Timestamp("2023-05-05")
1712+
# start end (freq None)
1713+
check(assert_type(pd.date_range(t1, t2), pd.DatetimeIndex), pd.DatetimeIndex)
1714+
# start end positional (freq None)
1715+
check(
1716+
assert_type(pd.date_range(start=t1, end=t2), pd.DatetimeIndex), pd.DatetimeIndex
1717+
)
1718+
# start periods (freq None)
1719+
check(
1720+
assert_type(pd.date_range(start=t1, periods=10), pd.DatetimeIndex),
1721+
pd.DatetimeIndex,
1722+
)
1723+
# end periods (freq None)
1724+
check(
1725+
assert_type(pd.date_range(end=t2, periods=10), pd.DatetimeIndex),
1726+
pd.DatetimeIndex,
1727+
)
1728+
# start periods (freq None)
1729+
check(assert_type(pd.date_range(t1, t2, 10), pd.DatetimeIndex), pd.DatetimeIndex)
1730+
# start end periods
1731+
check(
1732+
assert_type(pd.date_range(start=t1, end=t2, periods=10), pd.DatetimeIndex),
1733+
pd.DatetimeIndex,
1734+
)
1735+
# start end freq
1736+
check(
1737+
assert_type(pd.date_range(start=t1, end=t2, freq="ME"), pd.DatetimeIndex),
1738+
pd.DatetimeIndex,
1739+
)
1740+
# start periods freq
1741+
check(
1742+
assert_type(pd.date_range(start=t1, periods=10, freq="ME"), pd.DatetimeIndex),
1743+
pd.DatetimeIndex,
1744+
)
1745+
1746+
if TYPE_CHECKING_INVALID_USAGE:
1747+
pd.date_range(t1) # type: ignore[call-overload] # pyright: ignore[reportCallIssue]
1748+
pd.date_range(start=t1) # type: ignore[call-overload] # pyright: ignore[reportCallIssue]
1749+
pd.date_range(end=t1) # type: ignore[call-overload] # pyright: ignore[reportCallIssue]
1750+
pd.date_range(periods=10) # type: ignore[call-overload] # pyright: ignore[reportCallIssue]
1751+
pd.date_range(freq="BD") # type: ignore[call-overload] # pyright: ignore[reportCallIssue]
1752+
pd.date_range(start=t1, end=t2, periods=10, freq="BD") # type: ignore[call-overload] # pyright: ignore[reportCallIssue]
1753+
1754+
1755+
def test_timedelta_range_overloads() -> None:
1756+
"""Test different overloads of pd.timedelta_range (GH1327)."""
1757+
t1 = "1 day"
1758+
t2 = "20 day"
1759+
# start end (freq None)
1760+
check(assert_type(pd.timedelta_range(t1, t2), pd.TimedeltaIndex), pd.TimedeltaIndex)
1761+
# start end positional (freq None)
1762+
check(
1763+
assert_type(pd.timedelta_range(start=t1, end=t2), pd.TimedeltaIndex),
1764+
pd.TimedeltaIndex,
1765+
)
1766+
# start periods (freq None)
1767+
check(
1768+
assert_type(pd.timedelta_range(start=t1, periods=10), pd.TimedeltaIndex),
1769+
pd.TimedeltaIndex,
1770+
)
1771+
# end periods (freq None)
1772+
check(
1773+
assert_type(pd.timedelta_range(end=t2, periods=10), pd.TimedeltaIndex),
1774+
pd.TimedeltaIndex,
1775+
)
1776+
# start periods (freq None)
1777+
check(
1778+
assert_type(pd.timedelta_range(t1, t2, 10), pd.TimedeltaIndex),
1779+
pd.TimedeltaIndex,
1780+
)
1781+
# start end periods
1782+
check(
1783+
assert_type(
1784+
pd.timedelta_range(start=t1, end=t2, periods=10), pd.TimedeltaIndex
1785+
),
1786+
pd.TimedeltaIndex,
1787+
)
1788+
# start end freq
1789+
check(
1790+
assert_type(
1791+
pd.timedelta_range(start=t1, end=t2, freq="48h"), pd.TimedeltaIndex
1792+
),
1793+
pd.TimedeltaIndex,
1794+
)
1795+
# start periods freq
1796+
check(
1797+
assert_type(
1798+
pd.timedelta_range(start=t1, periods=10, freq="48h"), pd.TimedeltaIndex
1799+
),
1800+
pd.TimedeltaIndex,
1801+
)
1802+
1803+
if TYPE_CHECKING_INVALID_USAGE:
1804+
pd.timedelta_range(t1) # type: ignore[call-overload] # pyright: ignore[reportCallIssue]
1805+
pd.timedelta_range(start=t1) # type: ignore[call-overload] # pyright: ignore[reportCallIssue]
1806+
pd.timedelta_range(end=t1) # type: ignore[call-overload] # pyright: ignore[reportCallIssue]
1807+
pd.timedelta_range(periods=10) # type: ignore[call-overload] # pyright: ignore[reportCallIssue]
1808+
pd.timedelta_range(freq="BD") # type: ignore[call-overload] # pyright: ignore[reportCallIssue]
1809+
pd.timedelta_range(start=t1, end=t2, periods=10, freq="BD") # type: ignore[call-overload] # pyright: ignore[reportCallIssue]
1810+
1811+
17081812
def test_DatetimeIndex_sub_timedelta() -> None:
17091813
# GH838
17101814
check(

0 commit comments

Comments
 (0)