Skip to content

Commit b2ce495

Browse files
committed
Merge pull request #9289 from tvyomkesh/vyom/pd_issue_9273
GH 9273: Timedelta constructor should accept nanoseconds keyword.
2 parents fda5012 + f32cdde commit b2ce495

File tree

3 files changed

+28
-2
lines changed

3 files changed

+28
-2
lines changed

doc/source/whatsnew/v0.16.0.txt

+1
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@ Enhancements
101101
- Added ``Timestamp.to_datetime64()`` to complement ``Timedelta.to_timedelta64()`` (:issue:`9255`)
102102
- ``tseries.frequencies.to_offset()`` now accepts ``Timedelta`` as input (:issue:`9064`)
103103

104+
- ``Timedelta`` will now accept nanoseconds keyword in constructor (:issue:`9273`)
104105

105106
Performance
106107
~~~~~~~~~~~

pandas/tseries/tests/test_timedeltas.py

+24
Original file line numberDiff line numberDiff line change
@@ -683,6 +683,30 @@ def test_to_timedelta_on_missing_values(self):
683683
actual = pd.to_timedelta(pd.NaT)
684684
self.assertEqual(actual.value, timedelta_NaT.astype('int64'))
685685

686+
def test_to_timedelta_on_nanoseconds(self):
687+
# GH 9273
688+
result = Timedelta(nanoseconds=100)
689+
expected = Timedelta('100ns')
690+
self.assertEqual(result, expected)
691+
692+
result = Timedelta(days=1,hours=1,minutes=1,weeks=1,seconds=1,milliseconds=1,microseconds=1,nanoseconds=1)
693+
expected = Timedelta(694861001001001)
694+
self.assertEqual(result, expected)
695+
696+
result = Timedelta(microseconds=1) + Timedelta(nanoseconds=1)
697+
expected = Timedelta('1us1ns')
698+
self.assertEqual(result, expected)
699+
700+
result = Timedelta(microseconds=1) - Timedelta(nanoseconds=1)
701+
expected = Timedelta('999ns')
702+
self.assertEqual(result, expected)
703+
704+
result = Timedelta(microseconds=1) + 5*Timedelta(nanoseconds=-2)
705+
expected = Timedelta('990ns')
706+
self.assertEqual(result, expected)
707+
708+
self.assertRaises(TypeError, lambda: Timedelta(nanoseconds='abc'))
709+
686710
def test_timedelta_ops_with_missing_values(self):
687711
# setup
688712
s1 = pd.to_timedelta(Series(['00:00:01']))

pandas/tslib.pyx

+3-2
Original file line numberDiff line numberDiff line change
@@ -1722,10 +1722,11 @@ class Timedelta(_Timedelta):
17221722
kwargs = dict([ (k, _to_py_int_float(v)) for k, v in iteritems(kwargs) ])
17231723

17241724
try:
1725-
value = timedelta(**kwargs)
1725+
nano = kwargs.pop('nanoseconds',0)
1726+
value = convert_to_timedelta64(timedelta(**kwargs),'ns',False) + nano
17261727
except TypeError as e:
17271728
raise ValueError("cannot construct a TimeDelta from the passed arguments, allowed keywords are "
1728-
"[days, seconds, microseconds, milliseconds, minutes, hours, weeks]")
1729+
"[weeks, days, hours, minutes, seconds, milliseconds, microseconds, nanoseconds]")
17291730

17301731
if isinstance(value, Timedelta):
17311732
value = value.value

0 commit comments

Comments
 (0)