test_business_month.py 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. """
  2. Tests for the following offsets:
  3. - BMonthBegin
  4. - BMonthEnd
  5. """
  6. from __future__ import annotations
  7. from datetime import datetime
  8. import pytest
  9. import pandas as pd
  10. from pandas.tests.tseries.offsets.common import (
  11. assert_is_on_offset,
  12. assert_offset_equal,
  13. )
  14. from pandas.tseries.offsets import (
  15. BMonthBegin,
  16. BMonthEnd,
  17. )
  18. @pytest.mark.parametrize("n", [-2, 1])
  19. @pytest.mark.parametrize(
  20. "cls",
  21. [
  22. BMonthBegin,
  23. BMonthEnd,
  24. ],
  25. )
  26. def test_apply_index(cls, n):
  27. offset = cls(n=n)
  28. rng = pd.date_range(start="1/1/2000", periods=100000, freq="T")
  29. ser = pd.Series(rng)
  30. res = rng + offset
  31. assert res.freq is None # not retained
  32. assert res[0] == rng[0] + offset
  33. assert res[-1] == rng[-1] + offset
  34. res2 = ser + offset
  35. # apply_index is only for indexes, not series, so no res2_v2
  36. assert res2.iloc[0] == ser.iloc[0] + offset
  37. assert res2.iloc[-1] == ser.iloc[-1] + offset
  38. class TestBMonthBegin:
  39. def test_offsets_compare_equal(self):
  40. # root cause of #456
  41. offset1 = BMonthBegin()
  42. offset2 = BMonthBegin()
  43. assert not offset1 != offset2
  44. offset_cases = []
  45. offset_cases.append(
  46. (
  47. BMonthBegin(),
  48. {
  49. datetime(2008, 1, 1): datetime(2008, 2, 1),
  50. datetime(2008, 1, 31): datetime(2008, 2, 1),
  51. datetime(2006, 12, 29): datetime(2007, 1, 1),
  52. datetime(2006, 12, 31): datetime(2007, 1, 1),
  53. datetime(2006, 9, 1): datetime(2006, 10, 2),
  54. datetime(2007, 1, 1): datetime(2007, 2, 1),
  55. datetime(2006, 12, 1): datetime(2007, 1, 1),
  56. },
  57. )
  58. )
  59. offset_cases.append(
  60. (
  61. BMonthBegin(0),
  62. {
  63. datetime(2008, 1, 1): datetime(2008, 1, 1),
  64. datetime(2006, 10, 2): datetime(2006, 10, 2),
  65. datetime(2008, 1, 31): datetime(2008, 2, 1),
  66. datetime(2006, 12, 29): datetime(2007, 1, 1),
  67. datetime(2006, 12, 31): datetime(2007, 1, 1),
  68. datetime(2006, 9, 15): datetime(2006, 10, 2),
  69. },
  70. )
  71. )
  72. offset_cases.append(
  73. (
  74. BMonthBegin(2),
  75. {
  76. datetime(2008, 1, 1): datetime(2008, 3, 3),
  77. datetime(2008, 1, 15): datetime(2008, 3, 3),
  78. datetime(2006, 12, 29): datetime(2007, 2, 1),
  79. datetime(2006, 12, 31): datetime(2007, 2, 1),
  80. datetime(2007, 1, 1): datetime(2007, 3, 1),
  81. datetime(2006, 11, 1): datetime(2007, 1, 1),
  82. },
  83. )
  84. )
  85. offset_cases.append(
  86. (
  87. BMonthBegin(-1),
  88. {
  89. datetime(2007, 1, 1): datetime(2006, 12, 1),
  90. datetime(2008, 6, 30): datetime(2008, 6, 2),
  91. datetime(2008, 6, 1): datetime(2008, 5, 1),
  92. datetime(2008, 3, 10): datetime(2008, 3, 3),
  93. datetime(2008, 12, 31): datetime(2008, 12, 1),
  94. datetime(2006, 12, 29): datetime(2006, 12, 1),
  95. datetime(2006, 12, 30): datetime(2006, 12, 1),
  96. datetime(2007, 1, 1): datetime(2006, 12, 1),
  97. },
  98. )
  99. )
  100. @pytest.mark.parametrize("case", offset_cases)
  101. def test_offset(self, case):
  102. offset, cases = case
  103. for base, expected in cases.items():
  104. assert_offset_equal(offset, base, expected)
  105. on_offset_cases = [
  106. (BMonthBegin(), datetime(2007, 12, 31), False),
  107. (BMonthBegin(), datetime(2008, 1, 1), True),
  108. (BMonthBegin(), datetime(2001, 4, 2), True),
  109. (BMonthBegin(), datetime(2008, 3, 3), True),
  110. ]
  111. @pytest.mark.parametrize("case", on_offset_cases)
  112. def test_is_on_offset(self, case):
  113. offset, dt, expected = case
  114. assert_is_on_offset(offset, dt, expected)
  115. class TestBMonthEnd:
  116. def test_normalize(self):
  117. dt = datetime(2007, 1, 1, 3)
  118. result = dt + BMonthEnd(normalize=True)
  119. expected = dt.replace(hour=0) + BMonthEnd()
  120. assert result == expected
  121. def test_offsets_compare_equal(self):
  122. # root cause of #456
  123. offset1 = BMonthEnd()
  124. offset2 = BMonthEnd()
  125. assert not offset1 != offset2
  126. offset_cases = []
  127. offset_cases.append(
  128. (
  129. BMonthEnd(),
  130. {
  131. datetime(2008, 1, 1): datetime(2008, 1, 31),
  132. datetime(2008, 1, 31): datetime(2008, 2, 29),
  133. datetime(2006, 12, 29): datetime(2007, 1, 31),
  134. datetime(2006, 12, 31): datetime(2007, 1, 31),
  135. datetime(2007, 1, 1): datetime(2007, 1, 31),
  136. datetime(2006, 12, 1): datetime(2006, 12, 29),
  137. },
  138. )
  139. )
  140. offset_cases.append(
  141. (
  142. BMonthEnd(0),
  143. {
  144. datetime(2008, 1, 1): datetime(2008, 1, 31),
  145. datetime(2008, 1, 31): datetime(2008, 1, 31),
  146. datetime(2006, 12, 29): datetime(2006, 12, 29),
  147. datetime(2006, 12, 31): datetime(2007, 1, 31),
  148. datetime(2007, 1, 1): datetime(2007, 1, 31),
  149. },
  150. )
  151. )
  152. offset_cases.append(
  153. (
  154. BMonthEnd(2),
  155. {
  156. datetime(2008, 1, 1): datetime(2008, 2, 29),
  157. datetime(2008, 1, 31): datetime(2008, 3, 31),
  158. datetime(2006, 12, 29): datetime(2007, 2, 28),
  159. datetime(2006, 12, 31): datetime(2007, 2, 28),
  160. datetime(2007, 1, 1): datetime(2007, 2, 28),
  161. datetime(2006, 11, 1): datetime(2006, 12, 29),
  162. },
  163. )
  164. )
  165. offset_cases.append(
  166. (
  167. BMonthEnd(-1),
  168. {
  169. datetime(2007, 1, 1): datetime(2006, 12, 29),
  170. datetime(2008, 6, 30): datetime(2008, 5, 30),
  171. datetime(2008, 12, 31): datetime(2008, 11, 28),
  172. datetime(2006, 12, 29): datetime(2006, 11, 30),
  173. datetime(2006, 12, 30): datetime(2006, 12, 29),
  174. datetime(2007, 1, 1): datetime(2006, 12, 29),
  175. },
  176. )
  177. )
  178. @pytest.mark.parametrize("case", offset_cases)
  179. def test_offset(self, case):
  180. offset, cases = case
  181. for base, expected in cases.items():
  182. assert_offset_equal(offset, base, expected)
  183. on_offset_cases = [
  184. (BMonthEnd(), datetime(2007, 12, 31), True),
  185. (BMonthEnd(), datetime(2008, 1, 1), False),
  186. ]
  187. @pytest.mark.parametrize("case", on_offset_cases)
  188. def test_is_on_offset(self, case):
  189. offset, dt, expected = case
  190. assert_is_on_offset(offset, dt, expected)