Skip to content

Commit 76f0f0e

Browse files
authored
type datetimeindex constructor (#1120)
* type datetimeindex constructor * leave out index.to_frame name for now * correct name annotation for MultiIndex * type names too * naming * looks like we do need __new__ * remove MultiIndex.__init__
1 parent e5ce0f9 commit 76f0f0e

File tree

8 files changed

+90
-52
lines changed

8 files changed

+90
-52
lines changed

pandas-stubs/core/indexes/base.pyi

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ class Index(IndexOpsMixin[S1]):
7373
*,
7474
dtype: Literal["int"] | type_t[int | np.integer] = ...,
7575
copy: bool = ...,
76-
name=...,
76+
name: Hashable = ...,
7777
tupleize_cols: bool = ...,
7878
**kwargs,
7979
) -> Index[int]: ...
@@ -84,7 +84,7 @@ class Index(IndexOpsMixin[S1]):
8484
*,
8585
dtype: Literal["int"] | type_t[int | np.integer],
8686
copy: bool = ...,
87-
name=...,
87+
name: Hashable = ...,
8888
tupleize_cols: bool = ...,
8989
**kwargs,
9090
) -> Index[int]: ...
@@ -95,7 +95,7 @@ class Index(IndexOpsMixin[S1]):
9595
*,
9696
dtype: Literal["float"] | type_t[float | np.floating] = ...,
9797
copy: bool = ...,
98-
name=...,
98+
name: Hashable = ...,
9999
tupleize_cols: bool = ...,
100100
**kwargs,
101101
) -> Index[float]: ...
@@ -106,7 +106,7 @@ class Index(IndexOpsMixin[S1]):
106106
*,
107107
dtype: Literal["float"] | type_t[float | np.floating],
108108
copy: bool = ...,
109-
name=...,
109+
name: Hashable = ...,
110110
tupleize_cols: bool = ...,
111111
**kwargs,
112112
) -> Index[float]: ...
@@ -121,7 +121,7 @@ class Index(IndexOpsMixin[S1]):
121121
*,
122122
dtype: Literal["complex"] | type_t[complex | np.complexfloating] = ...,
123123
copy: bool = ...,
124-
name=...,
124+
name: Hashable = ...,
125125
tupleize_cols: bool = ...,
126126
**kwargs,
127127
) -> Index[complex]: ...
@@ -132,7 +132,7 @@ class Index(IndexOpsMixin[S1]):
132132
*,
133133
dtype: Literal["complex"] | type_t[complex | np.complexfloating],
134134
copy: bool = ...,
135-
name=...,
135+
name: Hashable = ...,
136136
tupleize_cols: bool = ...,
137137
**kwargs,
138138
) -> Index[complex]: ...
@@ -144,7 +144,7 @@ class Index(IndexOpsMixin[S1]):
144144
*,
145145
dtype: TimestampDtypeArg = ...,
146146
copy: bool = ...,
147-
name=...,
147+
name: Hashable = ...,
148148
tupleize_cols: bool = ...,
149149
**kwargs,
150150
) -> DatetimeIndex: ...
@@ -155,7 +155,7 @@ class Index(IndexOpsMixin[S1]):
155155
*,
156156
dtype: TimestampDtypeArg,
157157
copy: bool = ...,
158-
name=...,
158+
name: Hashable = ...,
159159
tupleize_cols: bool = ...,
160160
**kwargs,
161161
) -> DatetimeIndex: ...
@@ -166,7 +166,7 @@ class Index(IndexOpsMixin[S1]):
166166
*,
167167
dtype: PeriodDtype = ...,
168168
copy: bool = ...,
169-
name=...,
169+
name: Hashable = ...,
170170
tupleize_cols: bool = ...,
171171
**kwargs,
172172
) -> PeriodIndex: ...
@@ -177,7 +177,7 @@ class Index(IndexOpsMixin[S1]):
177177
*,
178178
dtype: PeriodDtype,
179179
copy: bool = ...,
180-
name=...,
180+
name: Hashable = ...,
181181
tupleize_cols: bool = ...,
182182
**kwargs,
183183
) -> PeriodIndex: ...
@@ -188,7 +188,7 @@ class Index(IndexOpsMixin[S1]):
188188
*,
189189
dtype: TimedeltaDtypeArg = ...,
190190
copy: bool = ...,
191-
name=...,
191+
name: Hashable = ...,
192192
tupleize_cols: bool = ...,
193193
**kwargs,
194194
) -> TimedeltaIndex: ...
@@ -199,7 +199,7 @@ class Index(IndexOpsMixin[S1]):
199199
*,
200200
dtype: TimedeltaDtypeArg,
201201
copy: bool = ...,
202-
name=...,
202+
name: Hashable = ...,
203203
tupleize_cols: bool = ...,
204204
**kwargs,
205205
) -> TimedeltaIndex: ...
@@ -210,7 +210,7 @@ class Index(IndexOpsMixin[S1]):
210210
*,
211211
dtype: Literal["Interval"] = ...,
212212
copy: bool = ...,
213-
name=...,
213+
name: Hashable = ...,
214214
tupleize_cols: bool = ...,
215215
**kwargs,
216216
) -> IntervalIndex[Interval[_OrderableT]]: ...
@@ -221,7 +221,7 @@ class Index(IndexOpsMixin[S1]):
221221
*,
222222
dtype: Literal["Interval"],
223223
copy: bool = ...,
224-
name=...,
224+
name: Hashable = ...,
225225
tupleize_cols: bool = ...,
226226
**kwargs,
227227
) -> IntervalIndex[Interval[Any]]: ...
@@ -233,7 +233,7 @@ class Index(IndexOpsMixin[S1]):
233233
*,
234234
dtype: type[S1] = ...,
235235
copy: bool = ...,
236-
name=...,
236+
name: Hashable = ...,
237237
tupleize_cols: bool = ...,
238238
**kwargs,
239239
) -> Self: ...
@@ -244,7 +244,7 @@ class Index(IndexOpsMixin[S1]):
244244
*,
245245
dtype: type[S1],
246246
copy: bool = ...,
247-
name=...,
247+
name: Hashable = ...,
248248
tupleize_cols: bool = ...,
249249
**kwargs,
250250
) -> Self: ...
@@ -256,7 +256,7 @@ class Index(IndexOpsMixin[S1]):
256256
*,
257257
dtype=...,
258258
copy: bool = ...,
259-
name=...,
259+
name: Hashable = ...,
260260
tupleize_cols: bool = ...,
261261
**kwargs,
262262
) -> Self: ...
@@ -277,14 +277,14 @@ class Index(IndexOpsMixin[S1]):
277277
self, indices, axis: int = ..., allow_fill: bool = ..., fill_value=..., **kwargs
278278
): ...
279279
def repeat(self, repeats, axis=...): ...
280-
def copy(self, name=..., deep: bool = ...) -> Self: ...
280+
def copy(self, name: Hashable = ..., deep: bool = ...) -> Self: ...
281281
def __copy__(self, **kwargs): ...
282282
def __deepcopy__(self, memo=...): ...
283283
def format(
284284
self, name: bool = ..., formatter: Callable | None = ..., na_rep: _str = ...
285285
) -> list[_str]: ...
286286
def to_flat_index(self): ...
287-
def to_series(self, index=..., name=...) -> Series: ...
287+
def to_series(self, index=..., name: Hashable = ...) -> Series: ...
288288
def to_frame(self, index: bool = ..., name=...) -> DataFrame: ...
289289
@property
290290
def name(self): ...
@@ -341,7 +341,7 @@ class Index(IndexOpsMixin[S1]):
341341
def intersection(self, other: list[S1] | Self, sort: bool = ...) -> Self: ...
342342
def difference(self, other: list | Index, sort: bool | None = None) -> Self: ...
343343
def symmetric_difference(
344-
self, other: list[S1] | Self, result_name=..., sort=...
344+
self, other: list[S1] | Self, result_name: Hashable = ..., sort=...
345345
) -> Self: ...
346346
def get_loc(
347347
self,

pandas-stubs/core/indexes/category.pyi

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1-
from collections.abc import Iterable
1+
from collections.abc import (
2+
Hashable,
3+
Iterable,
4+
)
25
from typing import Literal
36

47
import numpy as np
@@ -22,7 +25,7 @@ class CategoricalIndex(ExtensionIndex[S1], accessor.PandasDelegate):
2225
ordered=...,
2326
dtype=...,
2427
copy: bool = ...,
25-
name=...,
28+
name: Hashable = ...,
2629
) -> Self: ...
2730
def equals(self, other): ...
2831
@property

pandas-stubs/core/indexes/datetimes.pyi

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,10 @@ from datetime import (
99
)
1010
from typing import overload
1111

12-
from _typing import TimeZones
12+
from _typing import (
13+
Frequency,
14+
TimeZones,
15+
)
1316
import numpy as np
1417
from pandas import (
1518
DataFrame,
@@ -29,6 +32,7 @@ from pandas._typing import (
2932
AnyArrayLike,
3033
ArrayLike,
3134
DateAndDatetimeLike,
35+
Dtype,
3236
IntervalClosedType,
3337
TimeUnit,
3438
)
@@ -41,14 +45,14 @@ class DatetimeIndex(DatetimeTimedeltaMixin[Timestamp], DatetimeIndexProperties):
4145
def __init__(
4246
self,
4347
data: ArrayLike | AnyArrayLike | list | tuple,
44-
freq=...,
45-
tz=...,
48+
freq: Frequency = ...,
49+
tz: TimeZones = ...,
4650
ambiguous: str = ...,
4751
dayfirst: bool = ...,
4852
yearfirst: bool = ...,
49-
dtype=...,
53+
dtype: Dtype = ...,
5054
copy: bool = ...,
51-
name=...,
55+
name: Hashable = ...,
5256
) -> None: ...
5357
def __array__(self, dtype=...) -> np.ndarray: ...
5458
def __reduce__(self): ...
@@ -70,7 +74,7 @@ class DatetimeIndex(DatetimeTimedeltaMixin[Timestamp], DatetimeIndexProperties):
7074
def __sub__(
7175
self, other: datetime | Timestamp | DatetimeIndex
7276
) -> TimedeltaIndex: ...
73-
def to_series(self, index=..., name=...) -> TimestampSeries: ...
77+
def to_series(self, index=..., name: Hashable = ...) -> TimestampSeries: ...
7478
def snap(self, freq: str = ...): ...
7579
def slice_indexer(self, start=..., end=..., step=...): ...
7680
def searchsorted(self, value, side: str = ..., sorter=...): ...

pandas-stubs/core/indexes/multi.pyi

Lines changed: 15 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ from typing import (
99
overload,
1010
)
1111

12+
from _typing import SequenceNotStr
1213
import numpy as np
1314
import pandas as pd
1415
from pandas.core.indexes.base import Index
@@ -29,33 +30,29 @@ class MultiIndex(Index[Any]):
2930
levels=...,
3031
codes=...,
3132
sortorder=...,
32-
names=...,
33+
names: SequenceNotStr[Hashable] = ...,
3334
dtype=...,
3435
copy=...,
35-
name=...,
36+
name: SequenceNotStr[Hashable] = ...,
3637
verify_integrity: bool = ...,
3738
_set_identity: bool = ...,
3839
) -> Self: ...
39-
def __init__(
40-
self,
41-
levels=...,
42-
codes=...,
43-
sortorder=...,
44-
names=...,
45-
dtype=...,
46-
copy=...,
47-
name=...,
48-
verify_integrity: bool = ...,
49-
_set_identity: bool = ...,
50-
) -> None: ...
5140
@classmethod
52-
def from_arrays(cls, arrays, sortorder=..., names=...) -> Self: ...
41+
def from_arrays(
42+
cls, arrays, sortorder=..., names: SequenceNotStr[Hashable] = ...
43+
) -> Self: ...
5344
@classmethod
54-
def from_tuples(cls, tuples, sortorder=..., names=...) -> Self: ...
45+
def from_tuples(
46+
cls, tuples, sortorder=..., names: SequenceNotStr[Hashable] = ...
47+
) -> Self: ...
5548
@classmethod
56-
def from_product(cls, iterables, sortorder=..., names=...) -> Self: ...
49+
def from_product(
50+
cls, iterables, sortorder=..., names: SequenceNotStr[Hashable] = ...
51+
) -> Self: ...
5752
@classmethod
58-
def from_frame(cls, df, sortorder=..., names=...) -> Self: ...
53+
def from_frame(
54+
cls, df, sortorder=..., names: SequenceNotStr[Hashable] = ...
55+
) -> Self: ...
5956
@property
6057
def shape(self): ...
6158
@property # Should be read-only

pandas-stubs/core/indexes/period.pyi

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ class PeriodIndex(DatetimeIndexOpsMixin[pd.Period], PeriodIndexFieldOps):
2626
tz=...,
2727
dtype=...,
2828
copy: bool = ...,
29-
name=...,
29+
name: Hashable = ...,
3030
**fields,
3131
): ...
3232
@property

pandas-stubs/core/indexes/range.pyi

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1-
from collections.abc import Sequence
1+
from collections.abc import (
2+
Hashable,
3+
Sequence,
4+
)
25
from typing import overload
36

47
import numpy as np
@@ -19,10 +22,10 @@ class RangeIndex(Index[int]):
1922
step: int = ...,
2023
dtype=...,
2124
copy: bool = ...,
22-
name=...,
25+
name: Hashable = ...,
2326
): ...
2427
@classmethod
25-
def from_range(cls, data, name=..., dtype=...): ...
28+
def from_range(cls, data, name: Hashable = ..., dtype=...): ...
2629
def __reduce__(self): ...
2730
@property
2831
def start(self) -> int: ...
@@ -46,7 +49,7 @@ class RangeIndex(Index[int]):
4649
def __contains__(self, key: int | np.integer) -> bool: ...
4750
def get_indexer(self, target, method=..., limit=..., tolerance=...): ...
4851
def tolist(self): ...
49-
def copy(self, name=..., deep: bool = ..., dtype=..., **kwargs): ...
52+
def copy(self, name: Hashable = ..., deep: bool = ..., dtype=..., **kwargs): ...
5053
def min(self, axis=..., skipna: bool = ..., *args, **kwargs): ...
5154
def max(self, axis=..., skipna: bool = ..., *args, **kwargs): ...
5255
def argsort(self, *args, **kwargs): ...

pandas-stubs/core/indexes/timedeltas.pyi

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ class TimedeltaIndex(DatetimeTimedeltaMixin[Timedelta], TimedeltaIndexProperties
7676
@property
7777
def inferred_type(self) -> str: ...
7878
def insert(self, loc, item): ...
79-
def to_series(self, index=..., name=...) -> TimedeltaSeries: ...
79+
def to_series(self, index=..., name: Hashable = ...) -> TimedeltaSeries: ...
8080

8181
def timedelta_range(
8282
start: TimedeltaConvertibleTypes = ...,

tests/test_indexes.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,21 @@ def test_multiindex_get_level_values() -> None:
6464
check(assert_type(i1, pd.Index), pd.Index)
6565

6666

67+
def test_multiindex_constructor() -> None:
68+
check(
69+
assert_type(
70+
pd.MultiIndex([[1], [4]], codes=[[0], [0]], name=["a", "b"]), pd.MultiIndex
71+
),
72+
pd.MultiIndex,
73+
)
74+
check(
75+
assert_type(
76+
pd.MultiIndex([[1], [4]], codes=[[0], [0]], names=["a", "b"]), pd.MultiIndex
77+
),
78+
pd.MultiIndex,
79+
)
80+
81+
6782
def test_index_tolist() -> None:
6883
i1 = pd.Index([1, 2, 3])
6984
check(assert_type(i1.tolist(), list[int]), list, int)
@@ -1053,6 +1068,22 @@ def test_index_constructors():
10531068
pd.Index(flist, dtype=np.float16)
10541069

10551070

1071+
def test_datetime_index_constructor() -> None:
1072+
check(assert_type(pd.DatetimeIndex(["2020"]), pd.DatetimeIndex), pd.DatetimeIndex)
1073+
check(
1074+
assert_type(pd.DatetimeIndex(["2020"], name="ts"), pd.DatetimeIndex),
1075+
pd.DatetimeIndex,
1076+
)
1077+
check(
1078+
assert_type(pd.DatetimeIndex(["2020"], freq="D"), pd.DatetimeIndex),
1079+
pd.DatetimeIndex,
1080+
)
1081+
check(
1082+
assert_type(pd.DatetimeIndex(["2020"], tz="Asia/Kathmandu"), pd.DatetimeIndex),
1083+
pd.DatetimeIndex,
1084+
)
1085+
1086+
10561087
def test_iter() -> None:
10571088
# GH 723
10581089
with pytest_warns_bounded(

0 commit comments

Comments
 (0)