Skip to content

Commit 351810b

Browse files
GH1189/GH1181 Timestamp subtraction and index shift (#1191)
* GH1189/GH1181 Timestamp subtraction and index shift * GH1189 PR feedback
1 parent 1793f88 commit 351810b

File tree

7 files changed

+29
-1
lines changed

7 files changed

+29
-1
lines changed

‎pandas-stubs/_libs/tslibs/timestamps.pyi

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -227,6 +227,8 @@ class Timestamp(datetime, SupportsIndex):
227227
@overload
228228
def __sub__(self, other: TimedeltaSeries) -> TimestampSeries: ...
229229
@overload
230+
def __sub__(self, other: TimestampSeries) -> TimedeltaSeries: ...
231+
@overload
230232
def __sub__(
231233
self, other: npt.NDArray[np.timedelta64]
232234
) -> npt.NDArray[np.datetime64]: ...

‎pandas-stubs/core/indexes/base.pyi

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -393,7 +393,6 @@ class Index(IndexOpsMixin[S1]):
393393
def asof_locs(self, where, mask): ...
394394
def sort_values(self, return_indexer: bool = ..., ascending: bool = ...): ...
395395
def sort(self, *args, **kwargs) -> None: ...
396-
def shift(self, periods: int = ..., freq=...) -> None: ...
397396
def argsort(self, *args, **kwargs): ...
398397
def get_indexer_non_unique(self, target): ...
399398
def get_indexer_for(self, target, **kwargs): ...

‎pandas-stubs/core/indexes/datetimes.pyi

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ from pandas.core.series import (
2727
TimedeltaSeries,
2828
TimestampSeries,
2929
)
30+
from typing_extensions import Self
3031

3132
from pandas._typing import (
3233
AnyArrayLike,
@@ -90,6 +91,7 @@ class DatetimeIndex(DatetimeTimedeltaMixin[Timestamp], DatetimeIndexProperties):
9091
def tzinfo(self) -> tzinfo | None: ...
9192
@property
9293
def dtype(self) -> np.dtype | DatetimeTZDtype: ...
94+
def shift(self, periods: int = ..., freq=...) -> Self: ...
9395

9496
def date_range(
9597
start: str | DateAndDatetimeLike | None = ...,

‎pandas-stubs/core/indexes/period.pyi

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ class PeriodIndex(DatetimeIndexOpsMixin[pd.Period], PeriodIndexFieldOps):
7575
def memory_usage(self, deep: bool = ...): ...
7676
@property
7777
def freqstr(self) -> str: ...
78+
def shift(self, periods: int = ..., freq=...) -> Self: ...
7879

7980
def period_range(
8081
start: (

‎pandas-stubs/core/indexes/timedeltas.pyi

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ class TimedeltaIndex(DatetimeTimedeltaMixin[Timedelta], TimedeltaIndexProperties
7777
def inferred_type(self) -> str: ...
7878
def insert(self, loc, item): ...
7979
def to_series(self, index=..., name: Hashable = ...) -> TimedeltaSeries: ...
80+
def shift(self, periods: int = ..., freq=...) -> Self: ...
8081

8182
def timedelta_range(
8283
start: TimedeltaConvertibleTypes = ...,

‎tests/test_indexes.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1272,3 +1272,18 @@ def test_datetime_index_max_min_reductions() -> None:
12721272
check(assert_type(dtidx.argmin(), np.int64), np.int64)
12731273
check(assert_type(dtidx.max(), pd.Timestamp), pd.Timestamp)
12741274
check(assert_type(dtidx.min(), pd.Timestamp), pd.Timestamp)
1275+
1276+
1277+
def test_periodindex_shift() -> None:
1278+
ind = pd.period_range(start="2022-06-01", periods=10)
1279+
check(assert_type(ind.shift(1), pd.PeriodIndex), pd.PeriodIndex)
1280+
1281+
1282+
def test_datetimeindex_shift() -> None:
1283+
ind = pd.date_range("2023-01-01", "2023-02-01")
1284+
check(assert_type(ind.shift(1), pd.DatetimeIndex), pd.DatetimeIndex)
1285+
1286+
1287+
def test_timedeltaindex_shift() -> None:
1288+
ind = pd.date_range("1/1/2021", "1/5/2021") - pd.Timestamp("1/3/2019")
1289+
check(assert_type(ind.shift(1), pd.TimedeltaIndex), pd.TimedeltaIndex)

‎tests/test_timefuncs.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1474,3 +1474,11 @@ def test_DatetimeIndex_sub_timedelta() -> None:
14741474
def test_to_offset() -> None:
14751475
check(assert_type(to_offset(None), None), type(None))
14761476
check(assert_type(to_offset("1D"), DateOffset), DateOffset)
1477+
1478+
1479+
def test_timestamp_sub_series() -> None:
1480+
"""Test subtracting Series[Timestamp] from Timestamp (see GH1189)."""
1481+
ts1 = pd.to_datetime(pd.Series(["2022-03-05", "2022-03-06"]))
1482+
one_ts = ts1.iloc[0]
1483+
check(assert_type(ts1.iloc[0], pd.Timestamp), pd.Timestamp)
1484+
check(assert_type(one_ts - ts1, "TimedeltaSeries"), pd.Series, pd.Timedelta)

0 commit comments

Comments
 (0)