Skip to content

Commit 9f52314

Browse files
Dr-Irvtwoertwein
authored andcommitted
For time related series, allow lists to define type, and fix mean, median, std (pandas-dev#493)
* split Series[IntervalT] into separate __new__ * allow sequences to define TimestampSeries, TimedeltaSeries, fix mean, median, std for time related series * revert changes related to Series.__new__ and IntervalT
1 parent 30d3386 commit 9f52314

File tree

2 files changed

+83
-6
lines changed

2 files changed

+83
-6
lines changed

pandas-stubs/core/series.pyi

+65-6
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ from datetime import (
1010
date,
1111
datetime,
1212
time,
13+
timedelta,
1314
)
1415
from typing import (
1516
Any,
@@ -186,7 +187,7 @@ class Series(IndexOpsMixin, NDFrame, Generic[S1]):
186187
@overload
187188
def __new__(
188189
cls,
189-
data: DatetimeIndex,
190+
data: DatetimeIndex | Sequence[Timestamp | np.datetime64 | datetime],
190191
index: Axes | None = ...,
191192
dtype=...,
192193
name: Hashable | None = ...,
@@ -206,7 +207,7 @@ class Series(IndexOpsMixin, NDFrame, Generic[S1]):
206207
@overload
207208
def __new__(
208209
cls,
209-
data: TimedeltaIndex,
210+
data: TimedeltaIndex | Sequence[Timedelta | np.timedelta64 | timedelta],
210211
index: Axes | None = ...,
211212
dtype=...,
212213
name: Hashable | None = ...,
@@ -1261,8 +1262,12 @@ class Series(IndexOpsMixin, NDFrame, Generic[S1]):
12611262
def __div__(self, other: num | _ListLike | Series[S1]) -> Series[S1]: ...
12621263
def __eq__(self, other: object) -> Series[_bool]: ... # type: ignore[override]
12631264
def __floordiv__(self, other: num | _ListLike | Series[S1]) -> Series[int]: ...
1264-
def __ge__(self, other: S1 | _ListLike | Series[S1]) -> Series[_bool]: ...
1265-
def __gt__(self, other: S1 | _ListLike | Series[S1]) -> Series[_bool]: ...
1265+
def __ge__(
1266+
self, other: S1 | _ListLike | Series[S1] | datetime | timedelta
1267+
) -> Series[_bool]: ...
1268+
def __gt__(
1269+
self, other: S1 | _ListLike | Series[S1] | datetime | timedelta
1270+
) -> Series[_bool]: ...
12661271
# def __iadd__(self, other: S1) -> Series[S1]: ...
12671272
# def __iand__(self, other: S1) -> Series[_bool]: ...
12681273
# def __idiv__(self, other: S1) -> Series[S1]: ...
@@ -1275,8 +1280,12 @@ class Series(IndexOpsMixin, NDFrame, Generic[S1]):
12751280
# def __itruediv__(self, other: S1) -> Series[S1]: ...
12761281
# def __itruediv__(self, other) -> None: ...
12771282
# def __ixor__(self, other: S1) -> Series[_bool]: ...
1278-
def __le__(self, other: S1 | _ListLike | Series[S1]) -> Series[_bool]: ...
1279-
def __lt__(self, other: S1 | _ListLike | Series[S1]) -> Series[_bool]: ...
1283+
def __le__(
1284+
self, other: S1 | _ListLike | Series[S1] | datetime | timedelta
1285+
) -> Series[_bool]: ...
1286+
def __lt__(
1287+
self, other: S1 | _ListLike | Series[S1] | datetime | timedelta
1288+
) -> Series[_bool]: ...
12801289
@overload
12811290
def __mul__(
12821291
self, other: Timedelta | TimedeltaSeries | np.timedelta64
@@ -1777,6 +1786,31 @@ class TimestampSeries(Series[Timestamp]):
17771786
def __add__(self, other: TimedeltaSeries | np.timedelta64) -> TimestampSeries: ... # type: ignore[override]
17781787
def __mul__(self, other: TimestampSeries | np.timedelta64 | TimedeltaSeries) -> Never: ... # type: ignore[override]
17791788
def __truediv__(self, other: TimestampSeries | np.timedelta64 | TimedeltaSeries) -> Never: ... # type: ignore[override]
1789+
def mean( # type: ignore[override]
1790+
self,
1791+
axis: SeriesAxisType | None = ...,
1792+
skipna: _bool = ...,
1793+
level: None = ...,
1794+
numeric_only: _bool = ...,
1795+
**kwargs,
1796+
) -> Timestamp: ...
1797+
def median( # type: ignore[override]
1798+
self,
1799+
axis: SeriesAxisType | None = ...,
1800+
skipna: _bool = ...,
1801+
level: None = ...,
1802+
numeric_only: _bool = ...,
1803+
**kwargs,
1804+
) -> Timestamp: ...
1805+
def std( # type: ignore[override]
1806+
self,
1807+
axis: SeriesAxisType | None = ...,
1808+
skipna: _bool | None = ...,
1809+
level: None = ...,
1810+
ddof: int = ...,
1811+
numeric_only: _bool = ...,
1812+
**kwargs,
1813+
) -> Timedelta: ...
17801814

17811815
class TimedeltaSeries(Series[Timedelta]):
17821816
# ignores needed because of mypy
@@ -1801,6 +1835,31 @@ class TimedeltaSeries(Series[Timedelta]):
18011835
def __truediv__(self, other: Timedelta | TimedeltaSeries | np.timedelta64 | TimedeltaIndex) -> Series[float]: ... # type: ignore[override]
18021836
@property
18031837
def dt(self) -> TimedeltaProperties: ... # type: ignore[override]
1838+
def mean( # type: ignore[override]
1839+
self,
1840+
axis: SeriesAxisType | None = ...,
1841+
skipna: _bool = ...,
1842+
level: None = ...,
1843+
numeric_only: _bool = ...,
1844+
**kwargs,
1845+
) -> Timedelta: ...
1846+
def median( # type: ignore[override]
1847+
self,
1848+
axis: SeriesAxisType | None = ...,
1849+
skipna: _bool = ...,
1850+
level: None = ...,
1851+
numeric_only: _bool = ...,
1852+
**kwargs,
1853+
) -> Timedelta: ...
1854+
def std( # type: ignore[override]
1855+
self,
1856+
axis: SeriesAxisType | None = ...,
1857+
skipna: _bool | None = ...,
1858+
level: None = ...,
1859+
ddof: int = ...,
1860+
numeric_only: _bool = ...,
1861+
**kwargs,
1862+
) -> Timedelta: ...
18041863

18051864
class PeriodSeries(Series[Period]):
18061865
# ignore needed because of mypy

tests/test_timefuncs.py

+18
Original file line numberDiff line numberDiff line change
@@ -1067,3 +1067,21 @@ def test_timedeltaseries_add_timestampseries() -> None:
10671067
tss = pd.Series(pd.date_range(start="2012-01-01", periods=10, freq="W-MON"))
10681068
plus = tds + tss
10691069
check(assert_type(plus, "TimestampSeries"), pd.Series, pd.Timestamp)
1070+
1071+
1072+
def test_mean_median_std() -> None:
1073+
s = pd.Series([pd.Timedelta("1 ns"), pd.Timedelta("2 ns"), pd.Timedelta("3 ns")])
1074+
check(assert_type(s.mean(), pd.Timedelta), pd.Timedelta)
1075+
check(assert_type(s.median(), pd.Timedelta), pd.Timedelta)
1076+
check(assert_type(s.std(), pd.Timedelta), pd.Timedelta)
1077+
1078+
s2 = pd.Series(
1079+
[
1080+
pd.Timestamp("2021-01-01"),
1081+
pd.Timestamp("2021-01-02"),
1082+
pd.Timestamp("2021-01-03"),
1083+
]
1084+
)
1085+
check(assert_type(s2.mean(), pd.Timestamp), pd.Timestamp)
1086+
check(assert_type(s2.median(), pd.Timestamp), pd.Timestamp)
1087+
check(assert_type(s2.std(), pd.Timedelta), pd.Timedelta)

0 commit comments

Comments
 (0)