From c6398b3b82fa8890514b16087f7fcdd5961f0939 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Diridollou?= Date: Thu, 28 Aug 2025 17:20:57 -0400 Subject: [PATCH 1/3] GH1352 Add passing a dict with integer for pd.to_datetime --- pandas-stubs/core/tools/datetimes.pyi | 2 +- tests/test_timefuncs.py | 17 +++++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/pandas-stubs/core/tools/datetimes.pyi b/pandas-stubs/core/tools/datetimes.pyi index 6d45eef4d..c236e3358 100644 --- a/pandas-stubs/core/tools/datetimes.pyi +++ b/pandas-stubs/core/tools/datetimes.pyi @@ -38,7 +38,7 @@ DatetimeScalar: TypeAlias = Scalar | datetime | np.datetime64 | date DatetimeScalarOrArrayConvertible: TypeAlias = DatetimeScalar | ArrayConvertible -DatetimeDictArg: TypeAlias = list[Scalar] | tuple[Scalar, ...] | AnyArrayLike +DatetimeDictArg: TypeAlias = list[Scalar] | tuple[Scalar, ...] | AnyArrayLike | int class YearMonthDayDict(TypedDict, total=True): year: DatetimeDictArg diff --git a/tests/test_timefuncs.py b/tests/test_timefuncs.py index cf7c0bf5c..b9bc499c6 100644 --- a/tests/test_timefuncs.py +++ b/tests/test_timefuncs.py @@ -1334,6 +1334,23 @@ def test_to_datetime_series() -> None: check(assert_type(pd.to_datetime(d), "TimestampSeries"), pd.Series) check(assert_type(pd.to_datetime(d_ex), "TimestampSeries"), pd.Series) + # GH1352 + ts = pd.date_range("2023-10-01", "2024-05-01", freq="1h") + check( + assert_type( + pd.to_datetime( + { + "year": ts.year, + "month": ts.month, + "day": 1, + } + ), + "TimestampSeries", + ), + pd.Series, + pd.Timestamp, + ) + def test_to_datetime_array() -> None: check(assert_type(pd.to_datetime([1, 2, 3]), pd.DatetimeIndex), pd.DatetimeIndex) From fba129ce808f689411411f51b82fa5854ddf1020 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Diridollou?= Date: Thu, 28 Aug 2025 17:27:56 -0400 Subject: [PATCH 2/3] GH1352 Fix nightly --- tests/test_scalars.py | 20 +++++++++++++++----- tests/test_timefuncs.py | 6 +++--- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/tests/test_scalars.py b/tests/test_scalars.py index 92b29f4bc..62fa060c9 100644 --- a/tests/test_scalars.py +++ b/tests/test_scalars.py @@ -24,6 +24,7 @@ from pandas._typing import TimeUnit from tests import ( + PD_LTE_23, TYPE_CHECKING_INVALID_USAGE, check, np_1darray, @@ -44,13 +45,17 @@ TimedeltaSeries, TimestampSeries, ) - else: TimedeltaSeries: TypeAlias = pd.Series TimestampSeries: TypeAlias = pd.Series PeriodSeries: TypeAlias = pd.Series OffsetSeries: TypeAlias = pd.Series +if not PD_LTE_23: + from pandas.errors import Pandas4Warning # type: ignore[attr-defined] # pyright: ignore # isort: skip +else: + Pandas4Warning: TypeAlias = FutureWarning # type: ignore[no-redef] + def test_interval() -> None: interval_i = pd.Interval(0, 1, closed="left") @@ -369,10 +374,15 @@ def test_interval_cmp(): def test_timedelta_construction() -> None: check(assert_type(pd.Timedelta(1, "W"), pd.Timedelta), pd.Timedelta) - with pytest_warns_bounded(FutureWarning, "'w' is deprecated", lower="2.3.99"): + with pytest_warns_bounded( + Pandas4Warning, # should be Pandas4Warning but only exposed starting pandas 3.0.0 + "'w' is deprecated and will", + lower="2.3.99", + upper="3.0.99", + ): check(assert_type(pd.Timedelta(1, "w"), pd.Timedelta), pd.Timedelta) check(assert_type(pd.Timedelta(1, "D"), pd.Timedelta), pd.Timedelta) - with pytest_warns_bounded(FutureWarning, "'d' is deprecated", lower="2.3.99"): + with pytest_warns_bounded(Pandas4Warning, "'d' is deprecated", lower="2.3.99"): check(assert_type(pd.Timedelta(1, "d"), pd.Timedelta), pd.Timedelta) check(assert_type(pd.Timedelta(1, "days"), pd.Timedelta), pd.Timedelta) check(assert_type(pd.Timedelta(1, "day"), pd.Timedelta), pd.Timedelta) @@ -406,10 +416,10 @@ def test_timedelta_construction() -> None: check(assert_type(pd.Timedelta(1, "nanosecond"), pd.Timedelta), pd.Timedelta) check(assert_type(pd.Timedelta("1 W"), pd.Timedelta), pd.Timedelta) - with pytest_warns_bounded(FutureWarning, "'w' is deprecated", lower="2.3.99"): + with pytest_warns_bounded(Pandas4Warning, "'w' is deprecated", lower="2.3.99"): check(assert_type(pd.Timedelta("1 w"), pd.Timedelta), pd.Timedelta) check(assert_type(pd.Timedelta("1 D"), pd.Timedelta), pd.Timedelta) - with pytest_warns_bounded(FutureWarning, "'d' is deprecated", lower="2.3.99"): + with pytest_warns_bounded(Pandas4Warning, "'d' is deprecated", lower="2.3.99"): check(assert_type(pd.Timedelta("1 d"), pd.Timedelta), pd.Timedelta) check(assert_type(pd.Timedelta("1 days"), pd.Timedelta), pd.Timedelta) check(assert_type(pd.Timedelta("1 day"), pd.Timedelta), pd.Timedelta) diff --git a/tests/test_timefuncs.py b/tests/test_timefuncs.py index b9bc499c6..56823e9de 100644 --- a/tests/test_timefuncs.py +++ b/tests/test_timefuncs.py @@ -1108,10 +1108,10 @@ def test_index_types_to_numpy() -> None: def test_to_timedelta_units() -> None: check(assert_type(pd.to_timedelta(1, "W"), pd.Timedelta), pd.Timedelta) - with pytest_warns_bounded(FutureWarning, "'w' is deprecated", lower="2.3.99"): + with pytest_warns_bounded(Pandas4Warning, "'w' is deprecated", lower="2.3.99"): check(assert_type(pd.to_timedelta(1, "w"), pd.Timedelta), pd.Timedelta) check(assert_type(pd.to_timedelta(1, "D"), pd.Timedelta), pd.Timedelta) - with pytest_warns_bounded(FutureWarning, "'d' is deprecated", lower="2.3.99"): + with pytest_warns_bounded(Pandas4Warning, "'d' is deprecated", lower="2.3.99"): check(assert_type(pd.to_timedelta(1, "d"), pd.Timedelta), pd.Timedelta) check(assert_type(pd.to_timedelta(1, "days"), pd.Timedelta), pd.Timedelta) check(assert_type(pd.to_timedelta(1, "day"), pd.Timedelta), pd.Timedelta) @@ -1871,7 +1871,7 @@ def test_timestamp_to_list_add() -> None: tslist = list(pd.to_datetime(["2022-01-01", "2022-01-02"])) check(assert_type(tslist, list[pd.Timestamp]), list, pd.Timestamp) sseries = pd.Series(tslist) - with pytest_warns_bounded(FutureWarning, "'d' is deprecated", lower="2.3.99"): + with pytest_warns_bounded(Pandas4Warning, "'d' is deprecated", lower="2.3.99"): sseries + pd.Timedelta(1, "d") check( From 3be28c9952a2e2f71b9136df2025ae9994f1598a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Diridollou?= Date: Thu, 28 Aug 2025 20:02:32 -0400 Subject: [PATCH 3/3] GH1352 PR Feedback --- pandas-stubs/core/tools/datetimes.pyi | 4 +++- tests/test_timefuncs.py | 14 ++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/pandas-stubs/core/tools/datetimes.pyi b/pandas-stubs/core/tools/datetimes.pyi index c236e3358..0c6b1fb0d 100644 --- a/pandas-stubs/core/tools/datetimes.pyi +++ b/pandas-stubs/core/tools/datetimes.pyi @@ -38,7 +38,9 @@ DatetimeScalar: TypeAlias = Scalar | datetime | np.datetime64 | date DatetimeScalarOrArrayConvertible: TypeAlias = DatetimeScalar | ArrayConvertible -DatetimeDictArg: TypeAlias = list[Scalar] | tuple[Scalar, ...] | AnyArrayLike | int +DatetimeDictArg: TypeAlias = ( + list[int | str] | tuple[int | str, ...] | AnyArrayLike | int | str +) class YearMonthDayDict(TypedDict, total=True): year: DatetimeDictArg diff --git a/tests/test_timefuncs.py b/tests/test_timefuncs.py index 56823e9de..559f98e20 100644 --- a/tests/test_timefuncs.py +++ b/tests/test_timefuncs.py @@ -1342,6 +1342,20 @@ def test_to_datetime_series() -> None: { "year": ts.year, "month": ts.month, + "day": "1", + } + ), + "TimestampSeries", + ), + pd.Series, + pd.Timestamp, + ) + check( + assert_type( + pd.to_datetime( + { + "year": [2024, "2023"], + "month": 4, "day": 1, } ),