test_business_year.py 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. """
  2. Tests for the following offsets:
  3. - BYearBegin
  4. - BYearEnd
  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. BYearBegin,
  15. BYearEnd,
  16. )
  17. class TestBYearBegin:
  18. def test_misspecified(self):
  19. msg = "Month must go from 1 to 12"
  20. with pytest.raises(ValueError, match=msg):
  21. BYearBegin(month=13)
  22. with pytest.raises(ValueError, match=msg):
  23. BYearEnd(month=13)
  24. offset_cases = []
  25. offset_cases.append(
  26. (
  27. BYearBegin(),
  28. {
  29. datetime(2008, 1, 1): datetime(2009, 1, 1),
  30. datetime(2008, 6, 30): datetime(2009, 1, 1),
  31. datetime(2008, 12, 31): datetime(2009, 1, 1),
  32. datetime(2011, 1, 1): datetime(2011, 1, 3),
  33. datetime(2011, 1, 3): datetime(2012, 1, 2),
  34. datetime(2005, 12, 30): datetime(2006, 1, 2),
  35. datetime(2005, 12, 31): datetime(2006, 1, 2),
  36. },
  37. )
  38. )
  39. offset_cases.append(
  40. (
  41. BYearBegin(0),
  42. {
  43. datetime(2008, 1, 1): datetime(2008, 1, 1),
  44. datetime(2008, 6, 30): datetime(2009, 1, 1),
  45. datetime(2008, 12, 31): datetime(2009, 1, 1),
  46. datetime(2005, 12, 30): datetime(2006, 1, 2),
  47. datetime(2005, 12, 31): datetime(2006, 1, 2),
  48. },
  49. )
  50. )
  51. offset_cases.append(
  52. (
  53. BYearBegin(-1),
  54. {
  55. datetime(2007, 1, 1): datetime(2006, 1, 2),
  56. datetime(2009, 1, 4): datetime(2009, 1, 1),
  57. datetime(2009, 1, 1): datetime(2008, 1, 1),
  58. datetime(2008, 6, 30): datetime(2008, 1, 1),
  59. datetime(2008, 12, 31): datetime(2008, 1, 1),
  60. datetime(2006, 12, 29): datetime(2006, 1, 2),
  61. datetime(2006, 12, 30): datetime(2006, 1, 2),
  62. datetime(2006, 1, 1): datetime(2005, 1, 3),
  63. },
  64. )
  65. )
  66. offset_cases.append(
  67. (
  68. BYearBegin(-2),
  69. {
  70. datetime(2007, 1, 1): datetime(2005, 1, 3),
  71. datetime(2007, 6, 30): datetime(2006, 1, 2),
  72. datetime(2008, 12, 31): datetime(2007, 1, 1),
  73. },
  74. )
  75. )
  76. @pytest.mark.parametrize("case", offset_cases)
  77. def test_offset(self, case):
  78. offset, cases = case
  79. for base, expected in cases.items():
  80. assert_offset_equal(offset, base, expected)
  81. class TestBYearEnd:
  82. offset_cases = []
  83. offset_cases.append(
  84. (
  85. BYearEnd(),
  86. {
  87. datetime(2008, 1, 1): datetime(2008, 12, 31),
  88. datetime(2008, 6, 30): datetime(2008, 12, 31),
  89. datetime(2008, 12, 31): datetime(2009, 12, 31),
  90. datetime(2005, 12, 30): datetime(2006, 12, 29),
  91. datetime(2005, 12, 31): datetime(2006, 12, 29),
  92. },
  93. )
  94. )
  95. offset_cases.append(
  96. (
  97. BYearEnd(0),
  98. {
  99. datetime(2008, 1, 1): datetime(2008, 12, 31),
  100. datetime(2008, 6, 30): datetime(2008, 12, 31),
  101. datetime(2008, 12, 31): datetime(2008, 12, 31),
  102. datetime(2005, 12, 31): datetime(2006, 12, 29),
  103. },
  104. )
  105. )
  106. offset_cases.append(
  107. (
  108. BYearEnd(-1),
  109. {
  110. datetime(2007, 1, 1): datetime(2006, 12, 29),
  111. datetime(2008, 6, 30): datetime(2007, 12, 31),
  112. datetime(2008, 12, 31): datetime(2007, 12, 31),
  113. datetime(2006, 12, 29): datetime(2005, 12, 30),
  114. datetime(2006, 12, 30): datetime(2006, 12, 29),
  115. datetime(2007, 1, 1): datetime(2006, 12, 29),
  116. },
  117. )
  118. )
  119. offset_cases.append(
  120. (
  121. BYearEnd(-2),
  122. {
  123. datetime(2007, 1, 1): datetime(2005, 12, 30),
  124. datetime(2008, 6, 30): datetime(2006, 12, 29),
  125. datetime(2008, 12, 31): datetime(2006, 12, 29),
  126. },
  127. )
  128. )
  129. @pytest.mark.parametrize("case", offset_cases)
  130. def test_offset(self, case):
  131. offset, cases = case
  132. for base, expected in cases.items():
  133. assert_offset_equal(offset, base, expected)
  134. on_offset_cases = [
  135. (BYearEnd(), datetime(2007, 12, 31), True),
  136. (BYearEnd(), datetime(2008, 1, 1), False),
  137. (BYearEnd(), datetime(2006, 12, 31), False),
  138. (BYearEnd(), datetime(2006, 12, 29), True),
  139. ]
  140. @pytest.mark.parametrize("case", on_offset_cases)
  141. def test_is_on_offset(self, case):
  142. offset, dt, expected = case
  143. assert_is_on_offset(offset, dt, expected)
  144. class TestBYearEndLagged:
  145. def test_bad_month_fail(self):
  146. msg = "Month must go from 1 to 12"
  147. with pytest.raises(ValueError, match=msg):
  148. BYearEnd(month=13)
  149. with pytest.raises(ValueError, match=msg):
  150. BYearEnd(month=0)
  151. offset_cases = []
  152. offset_cases.append(
  153. (
  154. BYearEnd(month=6),
  155. {
  156. datetime(2008, 1, 1): datetime(2008, 6, 30),
  157. datetime(2007, 6, 30): datetime(2008, 6, 30),
  158. },
  159. )
  160. )
  161. offset_cases.append(
  162. (
  163. BYearEnd(n=-1, month=6),
  164. {
  165. datetime(2008, 1, 1): datetime(2007, 6, 29),
  166. datetime(2007, 6, 30): datetime(2007, 6, 29),
  167. },
  168. )
  169. )
  170. @pytest.mark.parametrize("case", offset_cases)
  171. def test_offset(self, case):
  172. offset, cases = case
  173. for base, expected in cases.items():
  174. assert_offset_equal(offset, base, expected)
  175. def test_roll(self):
  176. offset = BYearEnd(month=6)
  177. date = datetime(2009, 11, 30)
  178. assert offset.rollforward(date) == datetime(2010, 6, 30)
  179. assert offset.rollback(date) == datetime(2009, 6, 30)
  180. on_offset_cases = [
  181. (BYearEnd(month=2), datetime(2007, 2, 28), True),
  182. (BYearEnd(month=6), datetime(2007, 6, 30), False),
  183. ]
  184. @pytest.mark.parametrize("case", on_offset_cases)
  185. def test_is_on_offset(self, case):
  186. offset, dt, expected = case
  187. assert_is_on_offset(offset, dt, expected)