diff --git a/asv_bench/benchmarks/tslibs/timedelta.py b/asv_bench/benchmarks/tslibs/timedelta.py index 8a16ddc189483..6ed273281569b 100644 --- a/asv_bench/benchmarks/tslibs/timedelta.py +++ b/asv_bench/benchmarks/tslibs/timedelta.py @@ -10,6 +10,11 @@ class TimedeltaConstructor: + def setup(self): + self.nptimedelta64 = np.timedelta64(3600) + self.dttimedelta = datetime.timedelta(seconds=3600) + self.td = Timedelta(3600, unit="s") + def time_from_int(self): Timedelta(123456789) @@ -28,10 +33,10 @@ def time_from_components(self): ) def time_from_datetime_timedelta(self): - Timedelta(datetime.timedelta(days=1, seconds=1)) + Timedelta(self.dttimedelta) def time_from_np_timedelta(self): - Timedelta(np.timedelta64(1, "ms")) + Timedelta(self.nptimedelta64) def time_from_string(self): Timedelta("1 days") @@ -42,6 +47,9 @@ def time_from_iso_format(self): def time_from_missing(self): Timedelta("nat") + def time_from_pd_timedelta(self): + Timedelta(self.td) + class TimedeltaProperties: def setup_cache(self): diff --git a/doc/source/whatsnew/v1.1.0.rst b/doc/source/whatsnew/v1.1.0.rst index 59c90534beefd..c046825bf1ce9 100644 --- a/doc/source/whatsnew/v1.1.0.rst +++ b/doc/source/whatsnew/v1.1.0.rst @@ -72,7 +72,7 @@ Deprecations Performance improvements ~~~~~~~~~~~~~~~~~~~~~~~~ - +- Performance improvement in :class:`Timedelta` constructor (:issue:`30543`) - - diff --git a/pandas/_libs/tslibs/timedeltas.pyx b/pandas/_libs/tslibs/timedeltas.pyx index 0a773b8a215ed..c376300454260 100644 --- a/pandas/_libs/tslibs/timedeltas.pyx +++ b/pandas/_libs/tslibs/timedeltas.pyx @@ -1208,7 +1208,12 @@ class Timedelta(_Timedelta): "represent unambiguous timedelta values durations." ) - if isinstance(value, Timedelta): + # GH 30543 if pd.Timedelta already passed, return it + # check that only value is passed + if (isinstance(value, Timedelta) and unit is None and + len(kwargs) == 0): + return value + elif isinstance(value, Timedelta): value = value.value elif isinstance(value, str): if len(value) > 0 and value[0] == 'P': diff --git a/pandas/tests/indexes/datetimes/test_constructors.py b/pandas/tests/indexes/datetimes/test_constructors.py index 95d14ad4c86f7..b6013c3939793 100644 --- a/pandas/tests/indexes/datetimes/test_constructors.py +++ b/pandas/tests/indexes/datetimes/test_constructors.py @@ -950,3 +950,10 @@ def test_datetimeindex_constructor_misc(self): ) assert len(idx1) == len(idx2) assert idx1.freq == idx2.freq + + +def test_timedelta_constructor_identity(): + # Test for #30543 + expected = pd.Timedelta(np.timedelta64(1, "s")) + result = pd.Timedelta(expected) + assert result is expected