Skip to content

Commit a07d685

Browse files
jbrockmendeljreback
authored andcommitted
use Timedelta instead of convert_to_timedelta64 (#24821)
1 parent ccde0a8 commit a07d685

File tree

4 files changed

+68
-71
lines changed

4 files changed

+68
-71
lines changed

pandas/_libs/tslibs/timedeltas.pxd

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,4 @@ from numpy cimport int64_t
55
# Exposed for tslib, not intended for outside use.
66
cdef int64_t cast_from_unit(object ts, object unit) except? -1
77
cpdef int64_t delta_to_nanoseconds(delta) except? -1
8-
cpdef convert_to_timedelta64(object ts, object unit)
8+
cdef convert_to_timedelta64(object ts, object unit)

pandas/_libs/tslibs/timedeltas.pyx

+1-5
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ cpdef int64_t delta_to_nanoseconds(delta) except? -1:
149149
raise TypeError(type(delta))
150150

151151

152-
cpdef convert_to_timedelta64(object ts, object unit):
152+
cdef convert_to_timedelta64(object ts, object unit):
153153
"""
154154
Convert an incoming object to a timedelta64 if possible.
155155
Before calling, unit must be standardized to avoid repeated unit conversion
@@ -178,16 +178,12 @@ cpdef convert_to_timedelta64(object ts, object unit):
178178
if ts == NPY_NAT:
179179
return np.timedelta64(NPY_NAT)
180180
else:
181-
if util.is_array(ts):
182-
ts = ts.astype('int64').item()
183181
if unit in ['Y', 'M', 'W']:
184182
ts = np.timedelta64(ts, unit)
185183
else:
186184
ts = cast_from_unit(ts, unit)
187185
ts = np.timedelta64(ts)
188186
elif is_float_object(ts):
189-
if util.is_array(ts):
190-
ts = ts.astype('int64').item()
191187
if unit in ['Y', 'M', 'W']:
192188
ts = np.timedelta64(int(ts), unit)
193189
else:

pandas/core/tools/timedeltas.py

+4-6
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,7 @@
44

55
import numpy as np
66

7-
from pandas._libs import tslibs
8-
from pandas._libs.tslibs.timedeltas import (
9-
convert_to_timedelta64, parse_timedelta_unit)
7+
from pandas._libs.tslibs.timedeltas import Timedelta, parse_timedelta_unit
108

119
from pandas.core.dtypes.common import is_list_like
1210
from pandas.core.dtypes.generic import ABCIndexClass, ABCSeries
@@ -120,7 +118,9 @@ def _coerce_scalar_to_timedelta_type(r, unit='ns', box=True, errors='raise'):
120118
"""Convert string 'r' to a timedelta object."""
121119

122120
try:
123-
result = convert_to_timedelta64(r, unit)
121+
result = Timedelta(r, unit)
122+
if not box:
123+
result = result.asm8
124124
except ValueError:
125125
if errors == 'raise':
126126
raise
@@ -130,8 +130,6 @@ def _coerce_scalar_to_timedelta_type(r, unit='ns', box=True, errors='raise'):
130130
# coerce
131131
result = pd.NaT
132132

133-
if box:
134-
result = tslibs.Timedelta(result)
135133
return result
136134

137135

pandas/tests/scalar/timedelta/test_timedelta.py

+62-59
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
import pandas as pd
1111
from pandas import (
1212
Series, Timedelta, TimedeltaIndex, timedelta_range, to_timedelta)
13-
from pandas.core.tools.timedeltas import _coerce_scalar_to_timedelta_type as ct
1413
import pandas.util.testing as tm
1514

1615

@@ -373,21 +372,21 @@ def test_unit_parser(self, units, np_unit, wrapper):
373372
assert result == expected
374373

375374
def test_numeric_conversions(self):
376-
assert ct(0) == np.timedelta64(0, 'ns')
377-
assert ct(10) == np.timedelta64(10, 'ns')
378-
assert ct(10, unit='ns') == np.timedelta64(10, 'ns').astype('m8[ns]')
375+
assert Timedelta(0) == np.timedelta64(0, 'ns')
376+
assert Timedelta(10) == np.timedelta64(10, 'ns')
377+
assert Timedelta(10, unit='ns') == np.timedelta64(10, 'ns')
379378

380-
assert ct(10, unit='us') == np.timedelta64(10, 'us').astype('m8[ns]')
381-
assert ct(10, unit='ms') == np.timedelta64(10, 'ms').astype('m8[ns]')
382-
assert ct(10, unit='s') == np.timedelta64(10, 's').astype('m8[ns]')
383-
assert ct(10, unit='d') == np.timedelta64(10, 'D').astype('m8[ns]')
379+
assert Timedelta(10, unit='us') == np.timedelta64(10, 'us')
380+
assert Timedelta(10, unit='ms') == np.timedelta64(10, 'ms')
381+
assert Timedelta(10, unit='s') == np.timedelta64(10, 's')
382+
assert Timedelta(10, unit='d') == np.timedelta64(10, 'D')
384383

385384
def test_timedelta_conversions(self):
386-
assert (ct(timedelta(seconds=1)) ==
385+
assert (Timedelta(timedelta(seconds=1)) ==
387386
np.timedelta64(1, 's').astype('m8[ns]'))
388-
assert (ct(timedelta(microseconds=1)) ==
387+
assert (Timedelta(timedelta(microseconds=1)) ==
389388
np.timedelta64(1, 'us').astype('m8[ns]'))
390-
assert (ct(timedelta(days=1)) ==
389+
assert (Timedelta(timedelta(days=1)) ==
391390
np.timedelta64(1, 'D').astype('m8[ns]'))
392391

393392
def test_round(self):
@@ -493,73 +492,77 @@ def test_short_format_converters(self):
493492
def conv(v):
494493
return v.astype('m8[ns]')
495494

496-
assert ct('10') == np.timedelta64(10, 'ns')
497-
assert ct('10ns') == np.timedelta64(10, 'ns')
498-
assert ct('100') == np.timedelta64(100, 'ns')
499-
assert ct('100ns') == np.timedelta64(100, 'ns')
500-
501-
assert ct('1000') == np.timedelta64(1000, 'ns')
502-
assert ct('1000ns') == np.timedelta64(1000, 'ns')
503-
assert ct('1000NS') == np.timedelta64(1000, 'ns')
504-
505-
assert ct('10us') == np.timedelta64(10000, 'ns')
506-
assert ct('100us') == np.timedelta64(100000, 'ns')
507-
assert ct('1000us') == np.timedelta64(1000000, 'ns')
508-
assert ct('1000Us') == np.timedelta64(1000000, 'ns')
509-
assert ct('1000uS') == np.timedelta64(1000000, 'ns')
510-
511-
assert ct('1ms') == np.timedelta64(1000000, 'ns')
512-
assert ct('10ms') == np.timedelta64(10000000, 'ns')
513-
assert ct('100ms') == np.timedelta64(100000000, 'ns')
514-
assert ct('1000ms') == np.timedelta64(1000000000, 'ns')
515-
516-
assert ct('-1s') == -np.timedelta64(1000000000, 'ns')
517-
assert ct('1s') == np.timedelta64(1000000000, 'ns')
518-
assert ct('10s') == np.timedelta64(10000000000, 'ns')
519-
assert ct('100s') == np.timedelta64(100000000000, 'ns')
520-
assert ct('1000s') == np.timedelta64(1000000000000, 'ns')
521-
522-
assert ct('1d') == conv(np.timedelta64(1, 'D'))
523-
assert ct('-1d') == -conv(np.timedelta64(1, 'D'))
524-
assert ct('1D') == conv(np.timedelta64(1, 'D'))
525-
assert ct('10D') == conv(np.timedelta64(10, 'D'))
526-
assert ct('100D') == conv(np.timedelta64(100, 'D'))
527-
assert ct('1000D') == conv(np.timedelta64(1000, 'D'))
528-
assert ct('10000D') == conv(np.timedelta64(10000, 'D'))
495+
assert Timedelta('10') == np.timedelta64(10, 'ns')
496+
assert Timedelta('10ns') == np.timedelta64(10, 'ns')
497+
assert Timedelta('100') == np.timedelta64(100, 'ns')
498+
assert Timedelta('100ns') == np.timedelta64(100, 'ns')
499+
500+
assert Timedelta('1000') == np.timedelta64(1000, 'ns')
501+
assert Timedelta('1000ns') == np.timedelta64(1000, 'ns')
502+
assert Timedelta('1000NS') == np.timedelta64(1000, 'ns')
503+
504+
assert Timedelta('10us') == np.timedelta64(10000, 'ns')
505+
assert Timedelta('100us') == np.timedelta64(100000, 'ns')
506+
assert Timedelta('1000us') == np.timedelta64(1000000, 'ns')
507+
assert Timedelta('1000Us') == np.timedelta64(1000000, 'ns')
508+
assert Timedelta('1000uS') == np.timedelta64(1000000, 'ns')
509+
510+
assert Timedelta('1ms') == np.timedelta64(1000000, 'ns')
511+
assert Timedelta('10ms') == np.timedelta64(10000000, 'ns')
512+
assert Timedelta('100ms') == np.timedelta64(100000000, 'ns')
513+
assert Timedelta('1000ms') == np.timedelta64(1000000000, 'ns')
514+
515+
assert Timedelta('-1s') == -np.timedelta64(1000000000, 'ns')
516+
assert Timedelta('1s') == np.timedelta64(1000000000, 'ns')
517+
assert Timedelta('10s') == np.timedelta64(10000000000, 'ns')
518+
assert Timedelta('100s') == np.timedelta64(100000000000, 'ns')
519+
assert Timedelta('1000s') == np.timedelta64(1000000000000, 'ns')
520+
521+
assert Timedelta('1d') == conv(np.timedelta64(1, 'D'))
522+
assert Timedelta('-1d') == -conv(np.timedelta64(1, 'D'))
523+
assert Timedelta('1D') == conv(np.timedelta64(1, 'D'))
524+
assert Timedelta('10D') == conv(np.timedelta64(10, 'D'))
525+
assert Timedelta('100D') == conv(np.timedelta64(100, 'D'))
526+
assert Timedelta('1000D') == conv(np.timedelta64(1000, 'D'))
527+
assert Timedelta('10000D') == conv(np.timedelta64(10000, 'D'))
529528

530529
# space
531-
assert ct(' 10000D ') == conv(np.timedelta64(10000, 'D'))
532-
assert ct(' - 10000D ') == -conv(np.timedelta64(10000, 'D'))
530+
assert Timedelta(' 10000D ') == conv(np.timedelta64(10000, 'D'))
531+
assert Timedelta(' - 10000D ') == -conv(np.timedelta64(10000, 'D'))
533532

534533
# invalid
535-
pytest.raises(ValueError, ct, '1foo')
536-
pytest.raises(ValueError, ct, 'foo')
534+
with pytest.raises(ValueError):
535+
Timedelta('1foo')
536+
with pytest.raises(ValueError):
537+
Timedelta('foo')
537538

538539
def test_full_format_converters(self):
539540
def conv(v):
540541
return v.astype('m8[ns]')
541542

542543
d1 = np.timedelta64(1, 'D')
543544

544-
assert ct('1days') == conv(d1)
545-
assert ct('1days,') == conv(d1)
546-
assert ct('- 1days,') == -conv(d1)
545+
assert Timedelta('1days') == conv(d1)
546+
assert Timedelta('1days,') == conv(d1)
547+
assert Timedelta('- 1days,') == -conv(d1)
547548

548-
assert ct('00:00:01') == conv(np.timedelta64(1, 's'))
549-
assert ct('06:00:01') == conv(np.timedelta64(6 * 3600 + 1, 's'))
550-
assert ct('06:00:01.0') == conv(np.timedelta64(6 * 3600 + 1, 's'))
551-
assert ct('06:00:01.01') == conv(np.timedelta64(
549+
assert Timedelta('00:00:01') == conv(np.timedelta64(1, 's'))
550+
assert Timedelta('06:00:01') == conv(np.timedelta64(6 * 3600 + 1, 's'))
551+
assert Timedelta('06:00:01.0') == conv(
552+
np.timedelta64(6 * 3600 + 1, 's'))
553+
assert Timedelta('06:00:01.01') == conv(np.timedelta64(
552554
1000 * (6 * 3600 + 1) + 10, 'ms'))
553555

554-
assert (ct('- 1days, 00:00:01') ==
556+
assert (Timedelta('- 1days, 00:00:01') ==
555557
conv(-d1 + np.timedelta64(1, 's')))
556-
assert (ct('1days, 06:00:01') ==
558+
assert (Timedelta('1days, 06:00:01') ==
557559
conv(d1 + np.timedelta64(6 * 3600 + 1, 's')))
558-
assert (ct('1days, 06:00:01.01') ==
560+
assert (Timedelta('1days, 06:00:01.01') ==
559561
conv(d1 + np.timedelta64(1000 * (6 * 3600 + 1) + 10, 'ms')))
560562

561563
# invalid
562-
pytest.raises(ValueError, ct, '- 1days, 00')
564+
with pytest.raises(ValueError):
565+
Timedelta('- 1days, 00')
563566

564567
def test_overflow(self):
565568
# GH 9442

0 commit comments

Comments
 (0)