test_business_quarter.py 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308
  1. """
  2. Tests for the following offsets:
  3. - BQuarterBegin
  4. - BQuarterEnd
  5. """
  6. from __future__ import annotations
  7. from datetime import datetime
  8. import pytest
  9. from pandas.tests.tseries.offsets.common import (
  10. assert_is_on_offset,
  11. assert_offset_equal,
  12. )
  13. from pandas.tseries.offsets import (
  14. BQuarterBegin,
  15. BQuarterEnd,
  16. )
  17. def test_quarterly_dont_normalize():
  18. date = datetime(2012, 3, 31, 5, 30)
  19. offsets = (BQuarterEnd, BQuarterBegin)
  20. for klass in offsets:
  21. result = date + klass()
  22. assert result.time() == date.time()
  23. @pytest.mark.parametrize("offset", [BQuarterBegin(), BQuarterEnd()])
  24. def test_on_offset(offset):
  25. dates = [
  26. datetime(2016, m, d)
  27. for m in [10, 11, 12]
  28. for d in [1, 2, 3, 28, 29, 30, 31]
  29. if not (m == 11 and d == 31)
  30. ]
  31. for date in dates:
  32. res = offset.is_on_offset(date)
  33. slow_version = date == (date + offset) - offset
  34. assert res == slow_version
  35. class TestBQuarterBegin:
  36. def test_repr(self):
  37. expected = "<BusinessQuarterBegin: startingMonth=3>"
  38. assert repr(BQuarterBegin()) == expected
  39. expected = "<BusinessQuarterBegin: startingMonth=3>"
  40. assert repr(BQuarterBegin(startingMonth=3)) == expected
  41. expected = "<BusinessQuarterBegin: startingMonth=1>"
  42. assert repr(BQuarterBegin(startingMonth=1)) == expected
  43. def test_is_anchored(self):
  44. assert BQuarterBegin(startingMonth=1).is_anchored()
  45. assert BQuarterBegin().is_anchored()
  46. assert not BQuarterBegin(2, startingMonth=1).is_anchored()
  47. def test_offset_corner_case(self):
  48. # corner
  49. offset = BQuarterBegin(n=-1, startingMonth=1)
  50. assert datetime(2007, 4, 3) + offset == datetime(2007, 4, 2)
  51. offset_cases = []
  52. offset_cases.append(
  53. (
  54. BQuarterBegin(startingMonth=1),
  55. {
  56. datetime(2008, 1, 1): datetime(2008, 4, 1),
  57. datetime(2008, 1, 31): datetime(2008, 4, 1),
  58. datetime(2008, 2, 15): datetime(2008, 4, 1),
  59. datetime(2008, 2, 29): datetime(2008, 4, 1),
  60. datetime(2008, 3, 15): datetime(2008, 4, 1),
  61. datetime(2008, 3, 31): datetime(2008, 4, 1),
  62. datetime(2008, 4, 15): datetime(2008, 7, 1),
  63. datetime(2007, 3, 15): datetime(2007, 4, 2),
  64. datetime(2007, 2, 28): datetime(2007, 4, 2),
  65. datetime(2007, 1, 1): datetime(2007, 4, 2),
  66. datetime(2007, 4, 15): datetime(2007, 7, 2),
  67. datetime(2007, 7, 1): datetime(2007, 7, 2),
  68. datetime(2007, 4, 1): datetime(2007, 4, 2),
  69. datetime(2007, 4, 2): datetime(2007, 7, 2),
  70. datetime(2008, 4, 30): datetime(2008, 7, 1),
  71. },
  72. )
  73. )
  74. offset_cases.append(
  75. (
  76. BQuarterBegin(startingMonth=2),
  77. {
  78. datetime(2008, 1, 1): datetime(2008, 2, 1),
  79. datetime(2008, 1, 31): datetime(2008, 2, 1),
  80. datetime(2008, 1, 15): datetime(2008, 2, 1),
  81. datetime(2008, 2, 29): datetime(2008, 5, 1),
  82. datetime(2008, 3, 15): datetime(2008, 5, 1),
  83. datetime(2008, 3, 31): datetime(2008, 5, 1),
  84. datetime(2008, 4, 15): datetime(2008, 5, 1),
  85. datetime(2008, 8, 15): datetime(2008, 11, 3),
  86. datetime(2008, 9, 15): datetime(2008, 11, 3),
  87. datetime(2008, 11, 1): datetime(2008, 11, 3),
  88. datetime(2008, 4, 30): datetime(2008, 5, 1),
  89. },
  90. )
  91. )
  92. offset_cases.append(
  93. (
  94. BQuarterBegin(startingMonth=1, n=0),
  95. {
  96. datetime(2008, 1, 1): datetime(2008, 1, 1),
  97. datetime(2007, 12, 31): datetime(2008, 1, 1),
  98. datetime(2008, 2, 15): datetime(2008, 4, 1),
  99. datetime(2008, 2, 29): datetime(2008, 4, 1),
  100. datetime(2008, 1, 15): datetime(2008, 4, 1),
  101. datetime(2008, 2, 27): datetime(2008, 4, 1),
  102. datetime(2008, 3, 15): datetime(2008, 4, 1),
  103. datetime(2007, 4, 1): datetime(2007, 4, 2),
  104. datetime(2007, 4, 2): datetime(2007, 4, 2),
  105. datetime(2007, 7, 1): datetime(2007, 7, 2),
  106. datetime(2007, 4, 15): datetime(2007, 7, 2),
  107. datetime(2007, 7, 2): datetime(2007, 7, 2),
  108. },
  109. )
  110. )
  111. offset_cases.append(
  112. (
  113. BQuarterBegin(startingMonth=1, n=-1),
  114. {
  115. datetime(2008, 1, 1): datetime(2007, 10, 1),
  116. datetime(2008, 1, 31): datetime(2008, 1, 1),
  117. datetime(2008, 2, 15): datetime(2008, 1, 1),
  118. datetime(2008, 2, 29): datetime(2008, 1, 1),
  119. datetime(2008, 3, 15): datetime(2008, 1, 1),
  120. datetime(2008, 3, 31): datetime(2008, 1, 1),
  121. datetime(2008, 4, 15): datetime(2008, 4, 1),
  122. datetime(2007, 7, 3): datetime(2007, 7, 2),
  123. datetime(2007, 4, 3): datetime(2007, 4, 2),
  124. datetime(2007, 7, 2): datetime(2007, 4, 2),
  125. datetime(2008, 4, 1): datetime(2008, 1, 1),
  126. },
  127. )
  128. )
  129. offset_cases.append(
  130. (
  131. BQuarterBegin(startingMonth=1, n=2),
  132. {
  133. datetime(2008, 1, 1): datetime(2008, 7, 1),
  134. datetime(2008, 1, 15): datetime(2008, 7, 1),
  135. datetime(2008, 2, 29): datetime(2008, 7, 1),
  136. datetime(2008, 3, 15): datetime(2008, 7, 1),
  137. datetime(2007, 3, 31): datetime(2007, 7, 2),
  138. datetime(2007, 4, 15): datetime(2007, 10, 1),
  139. datetime(2008, 4, 30): datetime(2008, 10, 1),
  140. },
  141. )
  142. )
  143. @pytest.mark.parametrize("case", offset_cases)
  144. def test_offset(self, case):
  145. offset, cases = case
  146. for base, expected in cases.items():
  147. assert_offset_equal(offset, base, expected)
  148. class TestBQuarterEnd:
  149. def test_repr(self):
  150. expected = "<BusinessQuarterEnd: startingMonth=3>"
  151. assert repr(BQuarterEnd()) == expected
  152. expected = "<BusinessQuarterEnd: startingMonth=3>"
  153. assert repr(BQuarterEnd(startingMonth=3)) == expected
  154. expected = "<BusinessQuarterEnd: startingMonth=1>"
  155. assert repr(BQuarterEnd(startingMonth=1)) == expected
  156. def test_is_anchored(self):
  157. assert BQuarterEnd(startingMonth=1).is_anchored()
  158. assert BQuarterEnd().is_anchored()
  159. assert not BQuarterEnd(2, startingMonth=1).is_anchored()
  160. def test_offset_corner_case(self):
  161. # corner
  162. offset = BQuarterEnd(n=-1, startingMonth=1)
  163. assert datetime(2010, 1, 31) + offset == datetime(2010, 1, 29)
  164. offset_cases = []
  165. offset_cases.append(
  166. (
  167. BQuarterEnd(startingMonth=1),
  168. {
  169. datetime(2008, 1, 1): datetime(2008, 1, 31),
  170. datetime(2008, 1, 31): datetime(2008, 4, 30),
  171. datetime(2008, 2, 15): datetime(2008, 4, 30),
  172. datetime(2008, 2, 29): datetime(2008, 4, 30),
  173. datetime(2008, 3, 15): datetime(2008, 4, 30),
  174. datetime(2008, 3, 31): datetime(2008, 4, 30),
  175. datetime(2008, 4, 15): datetime(2008, 4, 30),
  176. datetime(2008, 4, 30): datetime(2008, 7, 31),
  177. },
  178. )
  179. )
  180. offset_cases.append(
  181. (
  182. BQuarterEnd(startingMonth=2),
  183. {
  184. datetime(2008, 1, 1): datetime(2008, 2, 29),
  185. datetime(2008, 1, 31): datetime(2008, 2, 29),
  186. datetime(2008, 2, 15): datetime(2008, 2, 29),
  187. datetime(2008, 2, 29): datetime(2008, 5, 30),
  188. datetime(2008, 3, 15): datetime(2008, 5, 30),
  189. datetime(2008, 3, 31): datetime(2008, 5, 30),
  190. datetime(2008, 4, 15): datetime(2008, 5, 30),
  191. datetime(2008, 4, 30): datetime(2008, 5, 30),
  192. },
  193. )
  194. )
  195. offset_cases.append(
  196. (
  197. BQuarterEnd(startingMonth=1, n=0),
  198. {
  199. datetime(2008, 1, 1): datetime(2008, 1, 31),
  200. datetime(2008, 1, 31): datetime(2008, 1, 31),
  201. datetime(2008, 2, 15): datetime(2008, 4, 30),
  202. datetime(2008, 2, 29): datetime(2008, 4, 30),
  203. datetime(2008, 3, 15): datetime(2008, 4, 30),
  204. datetime(2008, 3, 31): datetime(2008, 4, 30),
  205. datetime(2008, 4, 15): datetime(2008, 4, 30),
  206. datetime(2008, 4, 30): datetime(2008, 4, 30),
  207. },
  208. )
  209. )
  210. offset_cases.append(
  211. (
  212. BQuarterEnd(startingMonth=1, n=-1),
  213. {
  214. datetime(2008, 1, 1): datetime(2007, 10, 31),
  215. datetime(2008, 1, 31): datetime(2007, 10, 31),
  216. datetime(2008, 2, 15): datetime(2008, 1, 31),
  217. datetime(2008, 2, 29): datetime(2008, 1, 31),
  218. datetime(2008, 3, 15): datetime(2008, 1, 31),
  219. datetime(2008, 3, 31): datetime(2008, 1, 31),
  220. datetime(2008, 4, 15): datetime(2008, 1, 31),
  221. datetime(2008, 4, 30): datetime(2008, 1, 31),
  222. },
  223. )
  224. )
  225. offset_cases.append(
  226. (
  227. BQuarterEnd(startingMonth=1, n=2),
  228. {
  229. datetime(2008, 1, 31): datetime(2008, 7, 31),
  230. datetime(2008, 2, 15): datetime(2008, 7, 31),
  231. datetime(2008, 2, 29): datetime(2008, 7, 31),
  232. datetime(2008, 3, 15): datetime(2008, 7, 31),
  233. datetime(2008, 3, 31): datetime(2008, 7, 31),
  234. datetime(2008, 4, 15): datetime(2008, 7, 31),
  235. datetime(2008, 4, 30): datetime(2008, 10, 31),
  236. },
  237. )
  238. )
  239. @pytest.mark.parametrize("case", offset_cases)
  240. def test_offset(self, case):
  241. offset, cases = case
  242. for base, expected in cases.items():
  243. assert_offset_equal(offset, base, expected)
  244. on_offset_cases = [
  245. (BQuarterEnd(1, startingMonth=1), datetime(2008, 1, 31), True),
  246. (BQuarterEnd(1, startingMonth=1), datetime(2007, 12, 31), False),
  247. (BQuarterEnd(1, startingMonth=1), datetime(2008, 2, 29), False),
  248. (BQuarterEnd(1, startingMonth=1), datetime(2007, 3, 30), False),
  249. (BQuarterEnd(1, startingMonth=1), datetime(2007, 3, 31), False),
  250. (BQuarterEnd(1, startingMonth=1), datetime(2008, 4, 30), True),
  251. (BQuarterEnd(1, startingMonth=1), datetime(2008, 5, 30), False),
  252. (BQuarterEnd(1, startingMonth=1), datetime(2007, 6, 29), False),
  253. (BQuarterEnd(1, startingMonth=1), datetime(2007, 6, 30), False),
  254. (BQuarterEnd(1, startingMonth=2), datetime(2008, 1, 31), False),
  255. (BQuarterEnd(1, startingMonth=2), datetime(2007, 12, 31), False),
  256. (BQuarterEnd(1, startingMonth=2), datetime(2008, 2, 29), True),
  257. (BQuarterEnd(1, startingMonth=2), datetime(2007, 3, 30), False),
  258. (BQuarterEnd(1, startingMonth=2), datetime(2007, 3, 31), False),
  259. (BQuarterEnd(1, startingMonth=2), datetime(2008, 4, 30), False),
  260. (BQuarterEnd(1, startingMonth=2), datetime(2008, 5, 30), True),
  261. (BQuarterEnd(1, startingMonth=2), datetime(2007, 6, 29), False),
  262. (BQuarterEnd(1, startingMonth=2), datetime(2007, 6, 30), False),
  263. (BQuarterEnd(1, startingMonth=3), datetime(2008, 1, 31), False),
  264. (BQuarterEnd(1, startingMonth=3), datetime(2007, 12, 31), True),
  265. (BQuarterEnd(1, startingMonth=3), datetime(2008, 2, 29), False),
  266. (BQuarterEnd(1, startingMonth=3), datetime(2007, 3, 30), True),
  267. (BQuarterEnd(1, startingMonth=3), datetime(2007, 3, 31), False),
  268. (BQuarterEnd(1, startingMonth=3), datetime(2008, 4, 30), False),
  269. (BQuarterEnd(1, startingMonth=3), datetime(2008, 5, 30), False),
  270. (BQuarterEnd(1, startingMonth=3), datetime(2007, 6, 29), True),
  271. (BQuarterEnd(1, startingMonth=3), datetime(2007, 6, 30), False),
  272. ]
  273. @pytest.mark.parametrize("case", on_offset_cases)
  274. def test_is_on_offset(self, case):
  275. offset, dt, expected = case
  276. assert_is_on_offset(offset, dt, expected)