test_ticks.py 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320
  1. # -*- coding: utf-8 -*-
  2. """
  3. Tests for offsets.Tick and subclasses
  4. """
  5. from __future__ import division
  6. from datetime import datetime, timedelta
  7. from hypothesis import assume, example, given, settings, strategies as st
  8. import numpy as np
  9. import pytest
  10. from pandas import Timedelta, Timestamp
  11. from pandas.tseries import offsets
  12. from pandas.tseries.offsets import Hour, Micro, Milli, Minute, Nano, Second
  13. from .common import assert_offset_equal
  14. # ---------------------------------------------------------------------
  15. # Test Helpers
  16. tick_classes = [Hour, Minute, Second, Milli, Micro, Nano]
  17. # ---------------------------------------------------------------------
  18. def test_apply_ticks():
  19. result = offsets.Hour(3).apply(offsets.Hour(4))
  20. exp = offsets.Hour(7)
  21. assert (result == exp)
  22. def test_delta_to_tick():
  23. delta = timedelta(3)
  24. tick = offsets._delta_to_tick(delta)
  25. assert (tick == offsets.Day(3))
  26. td = Timedelta(nanoseconds=5)
  27. tick = offsets._delta_to_tick(td)
  28. assert tick == Nano(5)
  29. @pytest.mark.parametrize('cls', tick_classes)
  30. @settings(deadline=None) # GH 24641
  31. @example(n=2, m=3)
  32. @example(n=800, m=300)
  33. @example(n=1000, m=5)
  34. @given(n=st.integers(-999, 999), m=st.integers(-999, 999))
  35. def test_tick_add_sub(cls, n, m):
  36. # For all Tick subclasses and all integers n, m, we should have
  37. # tick(n) + tick(m) == tick(n+m)
  38. # tick(n) - tick(m) == tick(n-m)
  39. left = cls(n)
  40. right = cls(m)
  41. expected = cls(n + m)
  42. assert left + right == expected
  43. assert left.apply(right) == expected
  44. expected = cls(n - m)
  45. assert left - right == expected
  46. @pytest.mark.parametrize('cls', tick_classes)
  47. @settings(deadline=None)
  48. @example(n=2, m=3)
  49. @given(n=st.integers(-999, 999), m=st.integers(-999, 999))
  50. def test_tick_equality(cls, n, m):
  51. assume(m != n)
  52. # tick == tock iff tick.n == tock.n
  53. left = cls(n)
  54. right = cls(m)
  55. assert left != right
  56. assert not (left == right)
  57. right = cls(n)
  58. assert left == right
  59. assert not (left != right)
  60. if n != 0:
  61. assert cls(n) != cls(-n)
  62. # ---------------------------------------------------------------------
  63. def test_Hour():
  64. assert_offset_equal(Hour(),
  65. datetime(2010, 1, 1), datetime(2010, 1, 1, 1))
  66. assert_offset_equal(Hour(-1),
  67. datetime(2010, 1, 1, 1), datetime(2010, 1, 1))
  68. assert_offset_equal(2 * Hour(),
  69. datetime(2010, 1, 1), datetime(2010, 1, 1, 2))
  70. assert_offset_equal(-1 * Hour(),
  71. datetime(2010, 1, 1, 1), datetime(2010, 1, 1))
  72. assert Hour(3) + Hour(2) == Hour(5)
  73. assert Hour(3) - Hour(2) == Hour()
  74. assert Hour(4) != Hour(1)
  75. def test_Minute():
  76. assert_offset_equal(Minute(),
  77. datetime(2010, 1, 1), datetime(2010, 1, 1, 0, 1))
  78. assert_offset_equal(Minute(-1),
  79. datetime(2010, 1, 1, 0, 1), datetime(2010, 1, 1))
  80. assert_offset_equal(2 * Minute(),
  81. datetime(2010, 1, 1), datetime(2010, 1, 1, 0, 2))
  82. assert_offset_equal(-1 * Minute(),
  83. datetime(2010, 1, 1, 0, 1), datetime(2010, 1, 1))
  84. assert Minute(3) + Minute(2) == Minute(5)
  85. assert Minute(3) - Minute(2) == Minute()
  86. assert Minute(5) != Minute()
  87. def test_Second():
  88. assert_offset_equal(Second(),
  89. datetime(2010, 1, 1),
  90. datetime(2010, 1, 1, 0, 0, 1))
  91. assert_offset_equal(Second(-1),
  92. datetime(2010, 1, 1, 0, 0, 1),
  93. datetime(2010, 1, 1))
  94. assert_offset_equal(2 * Second(),
  95. datetime(2010, 1, 1),
  96. datetime(2010, 1, 1, 0, 0, 2))
  97. assert_offset_equal(-1 * Second(),
  98. datetime(2010, 1, 1, 0, 0, 1),
  99. datetime(2010, 1, 1))
  100. assert Second(3) + Second(2) == Second(5)
  101. assert Second(3) - Second(2) == Second()
  102. def test_Millisecond():
  103. assert_offset_equal(Milli(),
  104. datetime(2010, 1, 1),
  105. datetime(2010, 1, 1, 0, 0, 0, 1000))
  106. assert_offset_equal(Milli(-1),
  107. datetime(2010, 1, 1, 0, 0, 0, 1000),
  108. datetime(2010, 1, 1))
  109. assert_offset_equal(Milli(2),
  110. datetime(2010, 1, 1),
  111. datetime(2010, 1, 1, 0, 0, 0, 2000))
  112. assert_offset_equal(2 * Milli(),
  113. datetime(2010, 1, 1),
  114. datetime(2010, 1, 1, 0, 0, 0, 2000))
  115. assert_offset_equal(-1 * Milli(),
  116. datetime(2010, 1, 1, 0, 0, 0, 1000),
  117. datetime(2010, 1, 1))
  118. assert Milli(3) + Milli(2) == Milli(5)
  119. assert Milli(3) - Milli(2) == Milli()
  120. def test_MillisecondTimestampArithmetic():
  121. assert_offset_equal(Milli(),
  122. Timestamp('2010-01-01'),
  123. Timestamp('2010-01-01 00:00:00.001'))
  124. assert_offset_equal(Milli(-1),
  125. Timestamp('2010-01-01 00:00:00.001'),
  126. Timestamp('2010-01-01'))
  127. def test_Microsecond():
  128. assert_offset_equal(Micro(),
  129. datetime(2010, 1, 1),
  130. datetime(2010, 1, 1, 0, 0, 0, 1))
  131. assert_offset_equal(Micro(-1),
  132. datetime(2010, 1, 1, 0, 0, 0, 1),
  133. datetime(2010, 1, 1))
  134. assert_offset_equal(2 * Micro(),
  135. datetime(2010, 1, 1),
  136. datetime(2010, 1, 1, 0, 0, 0, 2))
  137. assert_offset_equal(-1 * Micro(),
  138. datetime(2010, 1, 1, 0, 0, 0, 1),
  139. datetime(2010, 1, 1))
  140. assert Micro(3) + Micro(2) == Micro(5)
  141. assert Micro(3) - Micro(2) == Micro()
  142. def test_NanosecondGeneric():
  143. timestamp = Timestamp(datetime(2010, 1, 1))
  144. assert timestamp.nanosecond == 0
  145. result = timestamp + Nano(10)
  146. assert result.nanosecond == 10
  147. reverse_result = Nano(10) + timestamp
  148. assert reverse_result.nanosecond == 10
  149. def test_Nanosecond():
  150. timestamp = Timestamp(datetime(2010, 1, 1))
  151. assert_offset_equal(Nano(),
  152. timestamp,
  153. timestamp + np.timedelta64(1, 'ns'))
  154. assert_offset_equal(Nano(-1),
  155. timestamp + np.timedelta64(1, 'ns'),
  156. timestamp)
  157. assert_offset_equal(2 * Nano(),
  158. timestamp,
  159. timestamp + np.timedelta64(2, 'ns'))
  160. assert_offset_equal(-1 * Nano(),
  161. timestamp + np.timedelta64(1, 'ns'),
  162. timestamp)
  163. assert Nano(3) + Nano(2) == Nano(5)
  164. assert Nano(3) - Nano(2) == Nano()
  165. # GH9284
  166. assert Nano(1) + Nano(10) == Nano(11)
  167. assert Nano(5) + Micro(1) == Nano(1005)
  168. assert Micro(5) + Nano(1) == Nano(5001)
  169. @pytest.mark.parametrize('kls, expected',
  170. [(Hour, Timedelta(hours=5)),
  171. (Minute, Timedelta(hours=2, minutes=3)),
  172. (Second, Timedelta(hours=2, seconds=3)),
  173. (Milli, Timedelta(hours=2, milliseconds=3)),
  174. (Micro, Timedelta(hours=2, microseconds=3)),
  175. (Nano, Timedelta(hours=2, nanoseconds=3))])
  176. def test_tick_addition(kls, expected):
  177. offset = kls(3)
  178. result = offset + Timedelta(hours=2)
  179. assert isinstance(result, Timedelta)
  180. assert result == expected
  181. @pytest.mark.parametrize('cls', tick_classes)
  182. def test_tick_division(cls):
  183. off = cls(10)
  184. assert off / cls(5) == 2
  185. assert off / 2 == cls(5)
  186. assert off / 2.0 == cls(5)
  187. assert off / off.delta == 1
  188. assert off / off.delta.to_timedelta64() == 1
  189. assert off / Nano(1) == off.delta / Nano(1).delta
  190. if cls is not Nano:
  191. # A case where we end up with a smaller class
  192. result = off / 1000
  193. assert isinstance(result, offsets.Tick)
  194. assert not isinstance(result, cls)
  195. assert result.delta == off.delta / 1000
  196. if cls._inc < Timedelta(seconds=1):
  197. # Case where we end up with a bigger class
  198. result = off / .001
  199. assert isinstance(result, offsets.Tick)
  200. assert not isinstance(result, cls)
  201. assert result.delta == off.delta / .001
  202. @pytest.mark.parametrize('cls1', tick_classes)
  203. @pytest.mark.parametrize('cls2', tick_classes)
  204. def test_tick_zero(cls1, cls2):
  205. assert cls1(0) == cls2(0)
  206. assert cls1(0) + cls2(0) == cls1(0)
  207. if cls1 is not Nano:
  208. assert cls1(2) + cls2(0) == cls1(2)
  209. if cls1 is Nano:
  210. assert cls1(2) + Nano(0) == cls1(2)
  211. @pytest.mark.parametrize('cls', tick_classes)
  212. def test_tick_equalities(cls):
  213. assert cls() == cls(1)
  214. @pytest.mark.parametrize('cls', tick_classes)
  215. def test_tick_offset(cls):
  216. assert not cls().isAnchored()
  217. @pytest.mark.parametrize('cls', tick_classes)
  218. def test_compare_ticks(cls):
  219. three = cls(3)
  220. four = cls(4)
  221. assert three < cls(4)
  222. assert cls(3) < four
  223. assert four > cls(3)
  224. assert cls(4) > three
  225. assert cls(3) == cls(3)
  226. assert cls(3) != cls(4)
  227. @pytest.mark.parametrize('cls', tick_classes)
  228. def test_compare_ticks_to_strs(cls):
  229. # GH#23524
  230. off = cls(19)
  231. # These tests should work with any strings, but we particularly are
  232. # interested in "infer" as that comparison is convenient to make in
  233. # Datetime/Timedelta Array/Index constructors
  234. assert not off == "infer"
  235. assert not "foo" == off
  236. for left, right in [("infer", off), (off, "infer")]:
  237. with pytest.raises(TypeError):
  238. left < right
  239. with pytest.raises(TypeError):
  240. left <= right
  241. with pytest.raises(TypeError):
  242. left > right
  243. with pytest.raises(TypeError):
  244. left >= right