Skip to content

Commit 3418530

Browse files
committed
allow indexing with .loc using Timestamp
1 parent e3d0a16 commit 3418530

File tree

4 files changed

+32
-3
lines changed

4 files changed

+32
-3
lines changed

pandas-stubs/core/frame.pyi

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@ from pandas._typing import (
113113
ReplaceMethod,
114114
Scalar,
115115
ScalarT,
116+
SequenceNotStr,
116117
SeriesByT,
117118
SortKind,
118119
StataDateFormat,
@@ -194,7 +195,11 @@ class _LocIndexerFrame(_LocIndexer):
194195
def __getitem__( # type: ignore[overload-overlap] # pyright: ignore[reportOverlappingOverload]
195196
self,
196197
idx: tuple[
197-
int | StrLike | tuple[Scalar, ...] | Callable[[DataFrame], ScalarT],
198+
int
199+
| StrLike
200+
| Timestamp
201+
| tuple[Scalar, ...]
202+
| Callable[[DataFrame], ScalarT],
198203
int | StrLike | tuple[Scalar, ...],
199204
],
200205
) -> Scalar: ...
@@ -207,6 +212,7 @@ class _LocIndexerFrame(_LocIndexer):
207212
IndexType
208213
| MaskType
209214
| _IndexSliceTuple
215+
| SequenceNotStr[float | str | Timestamp]
210216
| Callable[
211217
[DataFrame], ScalarT | list[HashableT] | IndexType | MaskType
212218
],

pandas-stubs/core/series.pyi

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,7 @@ from pandas._typing import (
139139
ReplaceMethod,
140140
Scalar,
141141
ScalarT,
142+
SequenceNotStr,
142143
SeriesByT,
143144
SortKind,
144145
StrDtypeArg,
@@ -195,8 +196,7 @@ class _LocIndexerSeries(_LocIndexer, Generic[S1]):
195196
idx: (
196197
MaskType
197198
| Index
198-
| Sequence[float]
199-
| list[str]
199+
| SequenceNotStr[float | str | Timestamp]
200200
| slice
201201
| _IndexSliceTuple
202202
| Sequence[_IndexSliceTuple]

tests/test_frame.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3767,3 +3767,17 @@ def test_frame_single_slice() -> None:
37673767
check(assert_type(df.loc[:], pd.DataFrame), pd.DataFrame)
37683768

37693769
df.loc[:] = 1 + df
3770+
3771+
3772+
def test_frame_index_timestamp() -> None:
3773+
# GH 620
3774+
dt1 = pd.to_datetime("2023-05-01")
3775+
dt2 = pd.to_datetime("2023-05-02")
3776+
s = pd.Series([1, 2], index=[dt1, dt2])
3777+
df = pd.DataFrame(s)
3778+
# Next result is Series or DataFrame because the index could be a MultiIndex
3779+
check(assert_type(df.loc[dt1, :], pd.Series | pd.DataFrame), pd.Series)
3780+
check(assert_type(df.loc[[dt1], :], pd.DataFrame), pd.DataFrame)
3781+
df2 = pd.DataFrame({"x": s})
3782+
check(assert_type(df2.loc[dt1, "x"], Scalar), np.integer)
3783+
check(assert_type(df2.loc[[dt1], "x"], pd.Series), pd.Series, np.integer)

tests/test_series.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3496,3 +3496,12 @@ def test_series_empty_dtype() -> None:
34963496
check(assert_type(pd.Series([]), "pd.Series[Any]"), pd.Series)
34973497
# ensure that an empty string does not get matched to Sequence[Never]
34983498
check(assert_type(pd.Series(""), "pd.Series[str]"), pd.Series)
3499+
3500+
3501+
def test_series_index_timestamp() -> None:
3502+
# GH 620
3503+
dt1 = pd.to_datetime("2023-05-01")
3504+
dt2 = pd.to_datetime("2023-05-02")
3505+
s = pd.Series([1, 2], index=[dt1, dt2])
3506+
check(assert_type(s[dt1], int), np.integer)
3507+
check(assert_type(s.loc[[dt1]], "pd.Series[int]"), pd.Series, np.integer)

0 commit comments

Comments
 (0)