Skip to content

Commit 11efca1

Browse files
AlexKirkojreback
authored andcommitted
PERF: add shortcut to Timedelta constructor (#31070)
1 parent 0b0cd08 commit 11efca1

File tree

4 files changed

+24
-4
lines changed

4 files changed

+24
-4
lines changed

asv_bench/benchmarks/tslibs/timedelta.py

+10-2
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,11 @@
1010

1111

1212
class TimedeltaConstructor:
13+
def setup(self):
14+
self.nptimedelta64 = np.timedelta64(3600)
15+
self.dttimedelta = datetime.timedelta(seconds=3600)
16+
self.td = Timedelta(3600, unit="s")
17+
1318
def time_from_int(self):
1419
Timedelta(123456789)
1520

@@ -28,10 +33,10 @@ def time_from_components(self):
2833
)
2934

3035
def time_from_datetime_timedelta(self):
31-
Timedelta(datetime.timedelta(days=1, seconds=1))
36+
Timedelta(self.dttimedelta)
3237

3338
def time_from_np_timedelta(self):
34-
Timedelta(np.timedelta64(1, "ms"))
39+
Timedelta(self.nptimedelta64)
3540

3641
def time_from_string(self):
3742
Timedelta("1 days")
@@ -42,6 +47,9 @@ def time_from_iso_format(self):
4247
def time_from_missing(self):
4348
Timedelta("nat")
4449

50+
def time_from_pd_timedelta(self):
51+
Timedelta(self.td)
52+
4553

4654
class TimedeltaProperties:
4755
def setup_cache(self):

doc/source/whatsnew/v1.1.0.rst

+1-1
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ Deprecations
7474

7575
Performance improvements
7676
~~~~~~~~~~~~~~~~~~~~~~~~
77-
77+
- Performance improvement in :class:`Timedelta` constructor (:issue:`30543`)
7878
-
7979
-
8080

pandas/_libs/tslibs/timedeltas.pyx

+6-1
Original file line numberDiff line numberDiff line change
@@ -1208,7 +1208,12 @@ class Timedelta(_Timedelta):
12081208
"represent unambiguous timedelta values durations."
12091209
)
12101210

1211-
if isinstance(value, Timedelta):
1211+
# GH 30543 if pd.Timedelta already passed, return it
1212+
# check that only value is passed
1213+
if (isinstance(value, Timedelta) and unit is None and
1214+
len(kwargs) == 0):
1215+
return value
1216+
elif isinstance(value, Timedelta):
12121217
value = value.value
12131218
elif isinstance(value, str):
12141219
if len(value) > 0 and value[0] == 'P':

pandas/tests/indexes/datetimes/test_constructors.py

+7
Original file line numberDiff line numberDiff line change
@@ -950,3 +950,10 @@ def test_datetimeindex_constructor_misc(self):
950950
)
951951
assert len(idx1) == len(idx2)
952952
assert idx1.freq == idx2.freq
953+
954+
955+
def test_timedelta_constructor_identity():
956+
# Test for #30543
957+
expected = pd.Timedelta(np.timedelta64(1, "s"))
958+
result = pd.Timedelta(expected)
959+
assert result is expected

0 commit comments

Comments
 (0)