test_arithmetic.py 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691
  1. # -*- coding: utf-8 -*-
  2. """
  3. Tests for scalar Timedelta arithmetic ops
  4. """
  5. from datetime import datetime, timedelta
  6. import operator
  7. import numpy as np
  8. import pytest
  9. import pandas as pd
  10. from pandas import NaT, Timedelta, Timestamp
  11. from pandas.core import ops
  12. import pandas.util.testing as tm
  13. class TestTimedeltaAdditionSubtraction(object):
  14. """
  15. Tests for Timedelta methods:
  16. __add__, __radd__,
  17. __sub__, __rsub__
  18. """
  19. @pytest.mark.parametrize('ten_seconds', [
  20. Timedelta(10, unit='s'),
  21. timedelta(seconds=10),
  22. np.timedelta64(10, 's'),
  23. np.timedelta64(10000000000, 'ns'),
  24. pd.offsets.Second(10)])
  25. def test_td_add_sub_ten_seconds(self, ten_seconds):
  26. # GH#6808
  27. base = Timestamp('20130101 09:01:12.123456')
  28. expected_add = Timestamp('20130101 09:01:22.123456')
  29. expected_sub = Timestamp('20130101 09:01:02.123456')
  30. result = base + ten_seconds
  31. assert result == expected_add
  32. result = base - ten_seconds
  33. assert result == expected_sub
  34. @pytest.mark.parametrize('one_day_ten_secs', [
  35. Timedelta('1 day, 00:00:10'),
  36. Timedelta('1 days, 00:00:10'),
  37. timedelta(days=1, seconds=10),
  38. np.timedelta64(1, 'D') + np.timedelta64(10, 's'),
  39. pd.offsets.Day() + pd.offsets.Second(10)])
  40. def test_td_add_sub_one_day_ten_seconds(self, one_day_ten_secs):
  41. # GH#6808
  42. base = Timestamp('20130102 09:01:12.123456')
  43. expected_add = Timestamp('20130103 09:01:22.123456')
  44. expected_sub = Timestamp('20130101 09:01:02.123456')
  45. result = base + one_day_ten_secs
  46. assert result == expected_add
  47. result = base - one_day_ten_secs
  48. assert result == expected_sub
  49. @pytest.mark.parametrize('op', [operator.add, ops.radd])
  50. def test_td_add_datetimelike_scalar(self, op):
  51. # GH#19738
  52. td = Timedelta(10, unit='d')
  53. result = op(td, datetime(2016, 1, 1))
  54. if op is operator.add:
  55. # datetime + Timedelta does _not_ call Timedelta.__radd__,
  56. # so we get a datetime back instead of a Timestamp
  57. assert isinstance(result, Timestamp)
  58. assert result == Timestamp(2016, 1, 11)
  59. result = op(td, Timestamp('2018-01-12 18:09'))
  60. assert isinstance(result, Timestamp)
  61. assert result == Timestamp('2018-01-22 18:09')
  62. result = op(td, np.datetime64('2018-01-12'))
  63. assert isinstance(result, Timestamp)
  64. assert result == Timestamp('2018-01-22')
  65. result = op(td, NaT)
  66. assert result is NaT
  67. @pytest.mark.parametrize('op', [operator.add, ops.radd])
  68. def test_td_add_td(self, op):
  69. td = Timedelta(10, unit='d')
  70. result = op(td, Timedelta(days=10))
  71. assert isinstance(result, Timedelta)
  72. assert result == Timedelta(days=20)
  73. @pytest.mark.parametrize('op', [operator.add, ops.radd])
  74. def test_td_add_pytimedelta(self, op):
  75. td = Timedelta(10, unit='d')
  76. result = op(td, timedelta(days=9))
  77. assert isinstance(result, Timedelta)
  78. assert result == Timedelta(days=19)
  79. @pytest.mark.parametrize('op', [operator.add, ops.radd])
  80. def test_td_add_timedelta64(self, op):
  81. td = Timedelta(10, unit='d')
  82. result = op(td, np.timedelta64(-4, 'D'))
  83. assert isinstance(result, Timedelta)
  84. assert result == Timedelta(days=6)
  85. @pytest.mark.parametrize('op', [operator.add, ops.radd])
  86. def test_td_add_offset(self, op):
  87. td = Timedelta(10, unit='d')
  88. result = op(td, pd.offsets.Hour(6))
  89. assert isinstance(result, Timedelta)
  90. assert result == Timedelta(days=10, hours=6)
  91. def test_td_sub_td(self):
  92. td = Timedelta(10, unit='d')
  93. expected = Timedelta(0, unit='ns')
  94. result = td - td
  95. assert isinstance(result, Timedelta)
  96. assert result == expected
  97. def test_td_sub_pytimedelta(self):
  98. td = Timedelta(10, unit='d')
  99. expected = Timedelta(0, unit='ns')
  100. result = td - td.to_pytimedelta()
  101. assert isinstance(result, Timedelta)
  102. assert result == expected
  103. result = td.to_pytimedelta() - td
  104. assert isinstance(result, Timedelta)
  105. assert result == expected
  106. def test_td_sub_timedelta64(self):
  107. td = Timedelta(10, unit='d')
  108. expected = Timedelta(0, unit='ns')
  109. result = td - td.to_timedelta64()
  110. assert isinstance(result, Timedelta)
  111. assert result == expected
  112. result = td.to_timedelta64() - td
  113. assert isinstance(result, Timedelta)
  114. assert result == expected
  115. def test_td_sub_nat(self):
  116. # In this context pd.NaT is treated as timedelta-like
  117. td = Timedelta(10, unit='d')
  118. result = td - NaT
  119. assert result is NaT
  120. def test_td_sub_td64_nat(self):
  121. td = Timedelta(10, unit='d')
  122. td_nat = np.timedelta64('NaT')
  123. result = td - td_nat
  124. assert result is NaT
  125. result = td_nat - td
  126. assert result is NaT
  127. def test_td_sub_offset(self):
  128. td = Timedelta(10, unit='d')
  129. result = td - pd.offsets.Hour(1)
  130. assert isinstance(result, Timedelta)
  131. assert result == Timedelta(239, unit='h')
  132. def test_td_add_sub_numeric_raises(self):
  133. td = Timedelta(10, unit='d')
  134. for other in [2, 2.0, np.int64(2), np.float64(2)]:
  135. with pytest.raises(TypeError):
  136. td + other
  137. with pytest.raises(TypeError):
  138. other + td
  139. with pytest.raises(TypeError):
  140. td - other
  141. with pytest.raises(TypeError):
  142. other - td
  143. def test_td_rsub_nat(self):
  144. td = Timedelta(10, unit='d')
  145. result = NaT - td
  146. assert result is NaT
  147. result = np.datetime64('NaT') - td
  148. assert result is NaT
  149. def test_td_rsub_offset(self):
  150. result = pd.offsets.Hour(1) - Timedelta(10, unit='d')
  151. assert isinstance(result, Timedelta)
  152. assert result == Timedelta(-239, unit='h')
  153. def test_td_sub_timedeltalike_object_dtype_array(self):
  154. # GH#21980
  155. arr = np.array([Timestamp('20130101 9:01'),
  156. Timestamp('20121230 9:02')])
  157. exp = np.array([Timestamp('20121231 9:01'),
  158. Timestamp('20121229 9:02')])
  159. res = arr - Timedelta('1D')
  160. tm.assert_numpy_array_equal(res, exp)
  161. def test_td_sub_mixed_most_timedeltalike_object_dtype_array(self):
  162. # GH#21980
  163. now = Timestamp.now()
  164. arr = np.array([now,
  165. Timedelta('1D'),
  166. np.timedelta64(2, 'h')])
  167. exp = np.array([now - Timedelta('1D'),
  168. Timedelta('0D'),
  169. np.timedelta64(2, 'h') - Timedelta('1D')])
  170. res = arr - Timedelta('1D')
  171. tm.assert_numpy_array_equal(res, exp)
  172. def test_td_rsub_mixed_most_timedeltalike_object_dtype_array(self):
  173. # GH#21980
  174. now = Timestamp.now()
  175. arr = np.array([now,
  176. Timedelta('1D'),
  177. np.timedelta64(2, 'h')])
  178. with pytest.raises(TypeError):
  179. Timedelta('1D') - arr
  180. @pytest.mark.parametrize('op', [operator.add, ops.radd])
  181. def test_td_add_timedeltalike_object_dtype_array(self, op):
  182. # GH#21980
  183. arr = np.array([Timestamp('20130101 9:01'),
  184. Timestamp('20121230 9:02')])
  185. exp = np.array([Timestamp('20130102 9:01'),
  186. Timestamp('20121231 9:02')])
  187. res = op(arr, Timedelta('1D'))
  188. tm.assert_numpy_array_equal(res, exp)
  189. @pytest.mark.parametrize('op', [operator.add, ops.radd])
  190. def test_td_add_mixed_timedeltalike_object_dtype_array(self, op):
  191. # GH#21980
  192. now = Timestamp.now()
  193. arr = np.array([now,
  194. Timedelta('1D')])
  195. exp = np.array([now + Timedelta('1D'),
  196. Timedelta('2D')])
  197. res = op(arr, Timedelta('1D'))
  198. tm.assert_numpy_array_equal(res, exp)
  199. class TestTimedeltaMultiplicationDivision(object):
  200. """
  201. Tests for Timedelta methods:
  202. __mul__, __rmul__,
  203. __div__, __rdiv__,
  204. __truediv__, __rtruediv__,
  205. __floordiv__, __rfloordiv__,
  206. __mod__, __rmod__,
  207. __divmod__, __rdivmod__
  208. """
  209. # ---------------------------------------------------------------
  210. # Timedelta.__mul__, __rmul__
  211. @pytest.mark.parametrize('td_nat', [NaT,
  212. np.timedelta64('NaT', 'ns'),
  213. np.timedelta64('NaT')])
  214. @pytest.mark.parametrize('op', [operator.mul, ops.rmul])
  215. def test_td_mul_nat(self, op, td_nat):
  216. # GH#19819
  217. td = Timedelta(10, unit='d')
  218. with pytest.raises(TypeError):
  219. op(td, td_nat)
  220. @pytest.mark.parametrize('nan', [np.nan, np.float64('NaN'), float('nan')])
  221. @pytest.mark.parametrize('op', [operator.mul, ops.rmul])
  222. def test_td_mul_nan(self, op, nan):
  223. # np.float64('NaN') has a 'dtype' attr, avoid treating as array
  224. td = Timedelta(10, unit='d')
  225. result = op(td, nan)
  226. assert result is NaT
  227. @pytest.mark.parametrize('op', [operator.mul, ops.rmul])
  228. def test_td_mul_scalar(self, op):
  229. # GH#19738
  230. td = Timedelta(minutes=3)
  231. result = op(td, 2)
  232. assert result == Timedelta(minutes=6)
  233. result = op(td, 1.5)
  234. assert result == Timedelta(minutes=4, seconds=30)
  235. assert op(td, np.nan) is NaT
  236. assert op(-1, td).value == -1 * td.value
  237. assert op(-1.0, td).value == -1.0 * td.value
  238. with pytest.raises(TypeError):
  239. # timedelta * datetime is gibberish
  240. op(td, Timestamp(2016, 1, 2))
  241. with pytest.raises(TypeError):
  242. # invalid multiply with another timedelta
  243. op(td, td)
  244. # ---------------------------------------------------------------
  245. # Timedelta.__div__, __truediv__
  246. def test_td_div_timedeltalike_scalar(self):
  247. # GH#19738
  248. td = Timedelta(10, unit='d')
  249. result = td / pd.offsets.Hour(1)
  250. assert result == 240
  251. assert td / td == 1
  252. assert td / np.timedelta64(60, 'h') == 4
  253. assert np.isnan(td / NaT)
  254. def test_td_div_numeric_scalar(self):
  255. # GH#19738
  256. td = Timedelta(10, unit='d')
  257. result = td / 2
  258. assert isinstance(result, Timedelta)
  259. assert result == Timedelta(days=5)
  260. result = td / 5.0
  261. assert isinstance(result, Timedelta)
  262. assert result == Timedelta(days=2)
  263. @pytest.mark.parametrize('nan', [np.nan, np.float64('NaN'), float('nan')])
  264. def test_td_div_nan(self, nan):
  265. # np.float64('NaN') has a 'dtype' attr, avoid treating as array
  266. td = Timedelta(10, unit='d')
  267. result = td / nan
  268. assert result is NaT
  269. result = td // nan
  270. assert result is NaT
  271. # ---------------------------------------------------------------
  272. # Timedelta.__rdiv__
  273. def test_td_rdiv_timedeltalike_scalar(self):
  274. # GH#19738
  275. td = Timedelta(10, unit='d')
  276. result = pd.offsets.Hour(1) / td
  277. assert result == 1 / 240.0
  278. assert np.timedelta64(60, 'h') / td == 0.25
  279. # ---------------------------------------------------------------
  280. # Timedelta.__floordiv__
  281. def test_td_floordiv_timedeltalike_scalar(self):
  282. # GH#18846
  283. td = Timedelta(hours=3, minutes=4)
  284. scalar = Timedelta(hours=3, minutes=3)
  285. assert td // scalar == 1
  286. assert -td // scalar.to_pytimedelta() == -2
  287. assert (2 * td) // scalar.to_timedelta64() == 2
  288. def test_td_floordiv_null_scalar(self):
  289. # GH#18846
  290. td = Timedelta(hours=3, minutes=4)
  291. assert td // np.nan is NaT
  292. assert np.isnan(td // NaT)
  293. assert np.isnan(td // np.timedelta64('NaT'))
  294. def test_td_floordiv_offsets(self):
  295. # GH#19738
  296. td = Timedelta(hours=3, minutes=4)
  297. assert td // pd.offsets.Hour(1) == 3
  298. assert td // pd.offsets.Minute(2) == 92
  299. def test_td_floordiv_invalid_scalar(self):
  300. # GH#18846
  301. td = Timedelta(hours=3, minutes=4)
  302. with pytest.raises(TypeError):
  303. td // np.datetime64('2016-01-01', dtype='datetime64[us]')
  304. def test_td_floordiv_numeric_scalar(self):
  305. # GH#18846
  306. td = Timedelta(hours=3, minutes=4)
  307. expected = Timedelta(hours=1, minutes=32)
  308. assert td // 2 == expected
  309. assert td // 2.0 == expected
  310. assert td // np.float64(2.0) == expected
  311. assert td // np.int32(2.0) == expected
  312. assert td // np.uint8(2.0) == expected
  313. def test_td_floordiv_timedeltalike_array(self):
  314. # GH#18846
  315. td = Timedelta(hours=3, minutes=4)
  316. scalar = Timedelta(hours=3, minutes=3)
  317. # Array-like others
  318. assert td // np.array(scalar.to_timedelta64()) == 1
  319. res = (3 * td) // np.array([scalar.to_timedelta64()])
  320. expected = np.array([3], dtype=np.int64)
  321. tm.assert_numpy_array_equal(res, expected)
  322. res = (10 * td) // np.array([scalar.to_timedelta64(),
  323. np.timedelta64('NaT')])
  324. expected = np.array([10, np.nan])
  325. tm.assert_numpy_array_equal(res, expected)
  326. def test_td_floordiv_numeric_series(self):
  327. # GH#18846
  328. td = Timedelta(hours=3, minutes=4)
  329. ser = pd.Series([1], dtype=np.int64)
  330. res = td // ser
  331. assert res.dtype.kind == 'm'
  332. # ---------------------------------------------------------------
  333. # Timedelta.__rfloordiv__
  334. def test_td_rfloordiv_timedeltalike_scalar(self):
  335. # GH#18846
  336. td = Timedelta(hours=3, minutes=3)
  337. scalar = Timedelta(hours=3, minutes=4)
  338. # scalar others
  339. # x // Timedelta is defined only for timedelta-like x. int-like,
  340. # float-like, and date-like, in particular, should all either
  341. # a) raise TypeError directly or
  342. # b) return NotImplemented, following which the reversed
  343. # operation will raise TypeError.
  344. assert td.__rfloordiv__(scalar) == 1
  345. assert (-td).__rfloordiv__(scalar.to_pytimedelta()) == -2
  346. assert (2 * td).__rfloordiv__(scalar.to_timedelta64()) == 0
  347. def test_td_rfloordiv_null_scalar(self):
  348. # GH#18846
  349. td = Timedelta(hours=3, minutes=3)
  350. assert np.isnan(td.__rfloordiv__(NaT))
  351. assert np.isnan(td.__rfloordiv__(np.timedelta64('NaT')))
  352. def test_td_rfloordiv_offsets(self):
  353. # GH#19738
  354. assert pd.offsets.Hour(1) // Timedelta(minutes=25) == 2
  355. def test_td_rfloordiv_invalid_scalar(self):
  356. # GH#18846
  357. td = Timedelta(hours=3, minutes=3)
  358. dt64 = np.datetime64('2016-01-01', dtype='datetime64[us]')
  359. with pytest.raises(TypeError):
  360. td.__rfloordiv__(dt64)
  361. def test_td_rfloordiv_numeric_scalar(self):
  362. # GH#18846
  363. td = Timedelta(hours=3, minutes=3)
  364. assert td.__rfloordiv__(np.nan) is NotImplemented
  365. assert td.__rfloordiv__(3.5) is NotImplemented
  366. assert td.__rfloordiv__(2) is NotImplemented
  367. with pytest.raises(TypeError):
  368. td.__rfloordiv__(np.float64(2.0))
  369. with pytest.raises(TypeError):
  370. td.__rfloordiv__(np.uint8(9))
  371. with tm.assert_produces_warning(FutureWarning):
  372. # GH-19761: Change to TypeError.
  373. td.__rfloordiv__(np.int32(2.0))
  374. def test_td_rfloordiv_timedeltalike_array(self):
  375. # GH#18846
  376. td = Timedelta(hours=3, minutes=3)
  377. scalar = Timedelta(hours=3, minutes=4)
  378. # Array-like others
  379. assert td.__rfloordiv__(np.array(scalar.to_timedelta64())) == 1
  380. res = td.__rfloordiv__(np.array([(3 * scalar).to_timedelta64()]))
  381. expected = np.array([3], dtype=np.int64)
  382. tm.assert_numpy_array_equal(res, expected)
  383. arr = np.array([(10 * scalar).to_timedelta64(),
  384. np.timedelta64('NaT')])
  385. res = td.__rfloordiv__(arr)
  386. expected = np.array([10, np.nan])
  387. tm.assert_numpy_array_equal(res, expected)
  388. def test_td_rfloordiv_numeric_series(self):
  389. # GH#18846
  390. td = Timedelta(hours=3, minutes=3)
  391. ser = pd.Series([1], dtype=np.int64)
  392. res = td.__rfloordiv__(ser)
  393. assert res is NotImplemented
  394. with tm.assert_produces_warning(FutureWarning, check_stacklevel=False):
  395. # TODO: GH-19761. Change to TypeError.
  396. ser // td
  397. # ----------------------------------------------------------------
  398. # Timedelta.__mod__, __rmod__
  399. def test_mod_timedeltalike(self):
  400. # GH#19365
  401. td = Timedelta(hours=37)
  402. # Timedelta-like others
  403. result = td % Timedelta(hours=6)
  404. assert isinstance(result, Timedelta)
  405. assert result == Timedelta(hours=1)
  406. result = td % timedelta(minutes=60)
  407. assert isinstance(result, Timedelta)
  408. assert result == Timedelta(0)
  409. result = td % NaT
  410. assert result is NaT
  411. def test_mod_timedelta64_nat(self):
  412. # GH#19365
  413. td = Timedelta(hours=37)
  414. result = td % np.timedelta64('NaT', 'ns')
  415. assert result is NaT
  416. def test_mod_timedelta64(self):
  417. # GH#19365
  418. td = Timedelta(hours=37)
  419. result = td % np.timedelta64(2, 'h')
  420. assert isinstance(result, Timedelta)
  421. assert result == Timedelta(hours=1)
  422. def test_mod_offset(self):
  423. # GH#19365
  424. td = Timedelta(hours=37)
  425. result = td % pd.offsets.Hour(5)
  426. assert isinstance(result, Timedelta)
  427. assert result == Timedelta(hours=2)
  428. def test_mod_numeric(self):
  429. # GH#19365
  430. td = Timedelta(hours=37)
  431. # Numeric Others
  432. result = td % 2
  433. assert isinstance(result, Timedelta)
  434. assert result == Timedelta(0)
  435. result = td % 1e12
  436. assert isinstance(result, Timedelta)
  437. assert result == Timedelta(minutes=3, seconds=20)
  438. result = td % int(1e12)
  439. assert isinstance(result, Timedelta)
  440. assert result == Timedelta(minutes=3, seconds=20)
  441. def test_mod_invalid(self):
  442. # GH#19365
  443. td = Timedelta(hours=37)
  444. with pytest.raises(TypeError):
  445. td % Timestamp('2018-01-22')
  446. with pytest.raises(TypeError):
  447. td % []
  448. def test_rmod_pytimedelta(self):
  449. # GH#19365
  450. td = Timedelta(minutes=3)
  451. result = timedelta(minutes=4) % td
  452. assert isinstance(result, Timedelta)
  453. assert result == Timedelta(minutes=1)
  454. def test_rmod_timedelta64(self):
  455. # GH#19365
  456. td = Timedelta(minutes=3)
  457. result = np.timedelta64(5, 'm') % td
  458. assert isinstance(result, Timedelta)
  459. assert result == Timedelta(minutes=2)
  460. def test_rmod_invalid(self):
  461. # GH#19365
  462. td = Timedelta(minutes=3)
  463. with pytest.raises(TypeError):
  464. Timestamp('2018-01-22') % td
  465. with pytest.raises(TypeError):
  466. 15 % td
  467. with pytest.raises(TypeError):
  468. 16.0 % td
  469. with pytest.raises(TypeError):
  470. np.array([22, 24]) % td
  471. # ----------------------------------------------------------------
  472. # Timedelta.__divmod__, __rdivmod__
  473. def test_divmod_numeric(self):
  474. # GH#19365
  475. td = Timedelta(days=2, hours=6)
  476. result = divmod(td, 53 * 3600 * 1e9)
  477. assert result[0] == Timedelta(1, unit='ns')
  478. assert isinstance(result[1], Timedelta)
  479. assert result[1] == Timedelta(hours=1)
  480. assert result
  481. result = divmod(td, np.nan)
  482. assert result[0] is NaT
  483. assert result[1] is NaT
  484. def test_divmod(self):
  485. # GH#19365
  486. td = Timedelta(days=2, hours=6)
  487. result = divmod(td, timedelta(days=1))
  488. assert result[0] == 2
  489. assert isinstance(result[1], Timedelta)
  490. assert result[1] == Timedelta(hours=6)
  491. result = divmod(td, 54)
  492. assert result[0] == Timedelta(hours=1)
  493. assert isinstance(result[1], Timedelta)
  494. assert result[1] == Timedelta(0)
  495. result = divmod(td, NaT)
  496. assert np.isnan(result[0])
  497. assert result[1] is NaT
  498. def test_divmod_offset(self):
  499. # GH#19365
  500. td = Timedelta(days=2, hours=6)
  501. result = divmod(td, pd.offsets.Hour(-4))
  502. assert result[0] == -14
  503. assert isinstance(result[1], Timedelta)
  504. assert result[1] == Timedelta(hours=-2)
  505. def test_divmod_invalid(self):
  506. # GH#19365
  507. td = Timedelta(days=2, hours=6)
  508. with pytest.raises(TypeError):
  509. divmod(td, Timestamp('2018-01-22'))
  510. def test_rdivmod_pytimedelta(self):
  511. # GH#19365
  512. result = divmod(timedelta(days=2, hours=6), Timedelta(days=1))
  513. assert result[0] == 2
  514. assert isinstance(result[1], Timedelta)
  515. assert result[1] == Timedelta(hours=6)
  516. def test_rdivmod_offset(self):
  517. result = divmod(pd.offsets.Hour(54), Timedelta(hours=-4))
  518. assert result[0] == -14
  519. assert isinstance(result[1], Timedelta)
  520. assert result[1] == Timedelta(hours=-2)
  521. def test_rdivmod_invalid(self):
  522. # GH#19365
  523. td = Timedelta(minutes=3)
  524. with pytest.raises(TypeError):
  525. divmod(Timestamp('2018-01-22'), td)
  526. with pytest.raises(TypeError):
  527. divmod(15, td)
  528. with pytest.raises(TypeError):
  529. divmod(16.0, td)
  530. with pytest.raises(TypeError):
  531. divmod(np.array([22, 24]), td)
  532. # ----------------------------------------------------------------
  533. @pytest.mark.parametrize('op', [
  534. operator.mul,
  535. ops.rmul,
  536. operator.truediv,
  537. ops.rdiv,
  538. ops.rsub])
  539. @pytest.mark.parametrize('arr', [
  540. np.array([Timestamp('20130101 9:01'), Timestamp('20121230 9:02')]),
  541. np.array([Timestamp.now(), Timedelta('1D')])
  542. ])
  543. def test_td_op_timedelta_timedeltalike_array(self, op, arr):
  544. with pytest.raises(TypeError):
  545. op(arr, Timedelta('1D'))