test_yqm_offsets.py 43 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027
  1. # -*- coding: utf-8 -*-
  2. """
  3. Tests for Year, Quarter, and Month-based DateOffset subclasses
  4. """
  5. from datetime import datetime
  6. import pytest
  7. import pandas as pd
  8. from pandas import Timestamp, compat
  9. from pandas.tseries.offsets import (
  10. BMonthBegin, BMonthEnd, BQuarterBegin, BQuarterEnd, BYearBegin, BYearEnd,
  11. MonthBegin, MonthEnd, QuarterBegin, QuarterEnd, YearBegin, YearEnd)
  12. from .common import assert_offset_equal, assert_onOffset
  13. from .test_offsets import Base
  14. # --------------------------------------------------------------------
  15. # Misc
  16. def test_quarterly_dont_normalize():
  17. date = datetime(2012, 3, 31, 5, 30)
  18. offsets = (QuarterBegin, QuarterEnd, BQuarterEnd, BQuarterBegin)
  19. for klass in offsets:
  20. result = date + klass()
  21. assert (result.time() == date.time())
  22. @pytest.mark.parametrize('n', [-2, 1])
  23. @pytest.mark.parametrize('cls', [MonthBegin, MonthEnd,
  24. BMonthBegin, BMonthEnd,
  25. QuarterBegin, QuarterEnd,
  26. BQuarterBegin, BQuarterEnd,
  27. YearBegin, YearEnd,
  28. BYearBegin, BYearEnd])
  29. def test_apply_index(cls, n):
  30. offset = cls(n=n)
  31. rng = pd.date_range(start='1/1/2000', periods=100000, freq='T')
  32. ser = pd.Series(rng)
  33. res = rng + offset
  34. res_v2 = offset.apply_index(rng)
  35. assert (res == res_v2).all()
  36. assert res[0] == rng[0] + offset
  37. assert res[-1] == rng[-1] + offset
  38. res2 = ser + offset
  39. # apply_index is only for indexes, not series, so no res2_v2
  40. assert res2.iloc[0] == ser.iloc[0] + offset
  41. assert res2.iloc[-1] == ser.iloc[-1] + offset
  42. @pytest.mark.parametrize('offset', [QuarterBegin(), QuarterEnd(),
  43. BQuarterBegin(), BQuarterEnd()])
  44. def test_on_offset(offset):
  45. dates = [datetime(2016, m, d)
  46. for m in [10, 11, 12]
  47. for d in [1, 2, 3, 28, 29, 30, 31] if not (m == 11 and d == 31)]
  48. for date in dates:
  49. res = offset.onOffset(date)
  50. slow_version = date == (date + offset) - offset
  51. assert res == slow_version
  52. # --------------------------------------------------------------------
  53. # Months
  54. class TestMonthBegin(Base):
  55. _offset = MonthBegin
  56. offset_cases = []
  57. # NOTE: I'm not entirely happy with the logic here for Begin -ss
  58. # see thread 'offset conventions' on the ML
  59. offset_cases.append((MonthBegin(), {
  60. datetime(2008, 1, 31): datetime(2008, 2, 1),
  61. datetime(2008, 2, 1): datetime(2008, 3, 1),
  62. datetime(2006, 12, 31): datetime(2007, 1, 1),
  63. datetime(2006, 12, 1): datetime(2007, 1, 1),
  64. datetime(2007, 1, 31): datetime(2007, 2, 1)}))
  65. offset_cases.append((MonthBegin(0), {
  66. datetime(2008, 1, 31): datetime(2008, 2, 1),
  67. datetime(2008, 1, 1): datetime(2008, 1, 1),
  68. datetime(2006, 12, 3): datetime(2007, 1, 1),
  69. datetime(2007, 1, 31): datetime(2007, 2, 1)}))
  70. offset_cases.append((MonthBegin(2), {
  71. datetime(2008, 2, 29): datetime(2008, 4, 1),
  72. datetime(2008, 1, 31): datetime(2008, 3, 1),
  73. datetime(2006, 12, 31): datetime(2007, 2, 1),
  74. datetime(2007, 12, 28): datetime(2008, 2, 1),
  75. datetime(2007, 1, 1): datetime(2007, 3, 1),
  76. datetime(2006, 11, 1): datetime(2007, 1, 1)}))
  77. offset_cases.append((MonthBegin(-1), {
  78. datetime(2007, 1, 1): datetime(2006, 12, 1),
  79. datetime(2008, 5, 31): datetime(2008, 5, 1),
  80. datetime(2008, 12, 31): datetime(2008, 12, 1),
  81. datetime(2006, 12, 29): datetime(2006, 12, 1),
  82. datetime(2006, 1, 2): datetime(2006, 1, 1)}))
  83. @pytest.mark.parametrize('case', offset_cases)
  84. def test_offset(self, case):
  85. offset, cases = case
  86. for base, expected in compat.iteritems(cases):
  87. assert_offset_equal(offset, base, expected)
  88. class TestMonthEnd(Base):
  89. _offset = MonthEnd
  90. def test_day_of_month(self):
  91. dt = datetime(2007, 1, 1)
  92. offset = MonthEnd()
  93. result = dt + offset
  94. assert result == Timestamp(2007, 1, 31)
  95. result = result + offset
  96. assert result == Timestamp(2007, 2, 28)
  97. def test_normalize(self):
  98. dt = datetime(2007, 1, 1, 3)
  99. result = dt + MonthEnd(normalize=True)
  100. expected = dt.replace(hour=0) + MonthEnd()
  101. assert result == expected
  102. offset_cases = []
  103. offset_cases.append((MonthEnd(), {
  104. datetime(2008, 1, 1): datetime(2008, 1, 31),
  105. datetime(2008, 1, 31): datetime(2008, 2, 29),
  106. datetime(2006, 12, 29): datetime(2006, 12, 31),
  107. datetime(2006, 12, 31): datetime(2007, 1, 31),
  108. datetime(2007, 1, 1): datetime(2007, 1, 31),
  109. datetime(2006, 12, 1): datetime(2006, 12, 31)}))
  110. offset_cases.append((MonthEnd(0), {
  111. datetime(2008, 1, 1): datetime(2008, 1, 31),
  112. datetime(2008, 1, 31): datetime(2008, 1, 31),
  113. datetime(2006, 12, 29): datetime(2006, 12, 31),
  114. datetime(2006, 12, 31): datetime(2006, 12, 31),
  115. datetime(2007, 1, 1): datetime(2007, 1, 31)}))
  116. offset_cases.append((MonthEnd(2), {
  117. datetime(2008, 1, 1): datetime(2008, 2, 29),
  118. datetime(2008, 1, 31): datetime(2008, 3, 31),
  119. datetime(2006, 12, 29): datetime(2007, 1, 31),
  120. datetime(2006, 12, 31): datetime(2007, 2, 28),
  121. datetime(2007, 1, 1): datetime(2007, 2, 28),
  122. datetime(2006, 11, 1): datetime(2006, 12, 31)}))
  123. offset_cases.append((MonthEnd(-1), {
  124. datetime(2007, 1, 1): datetime(2006, 12, 31),
  125. datetime(2008, 6, 30): datetime(2008, 5, 31),
  126. datetime(2008, 12, 31): datetime(2008, 11, 30),
  127. datetime(2006, 12, 29): datetime(2006, 11, 30),
  128. datetime(2006, 12, 30): datetime(2006, 11, 30),
  129. datetime(2007, 1, 1): datetime(2006, 12, 31)}))
  130. @pytest.mark.parametrize('case', offset_cases)
  131. def test_offset(self, case):
  132. offset, cases = case
  133. for base, expected in compat.iteritems(cases):
  134. assert_offset_equal(offset, base, expected)
  135. on_offset_cases = [(MonthEnd(), datetime(2007, 12, 31), True),
  136. (MonthEnd(), datetime(2008, 1, 1), False)]
  137. @pytest.mark.parametrize('case', on_offset_cases)
  138. def test_onOffset(self, case):
  139. offset, dt, expected = case
  140. assert_onOffset(offset, dt, expected)
  141. class TestBMonthBegin(Base):
  142. _offset = BMonthBegin
  143. def test_offsets_compare_equal(self):
  144. # root cause of #456
  145. offset1 = BMonthBegin()
  146. offset2 = BMonthBegin()
  147. assert not offset1 != offset2
  148. offset_cases = []
  149. offset_cases.append((BMonthBegin(), {
  150. datetime(2008, 1, 1): datetime(2008, 2, 1),
  151. datetime(2008, 1, 31): datetime(2008, 2, 1),
  152. datetime(2006, 12, 29): datetime(2007, 1, 1),
  153. datetime(2006, 12, 31): datetime(2007, 1, 1),
  154. datetime(2006, 9, 1): datetime(2006, 10, 2),
  155. datetime(2007, 1, 1): datetime(2007, 2, 1),
  156. datetime(2006, 12, 1): datetime(2007, 1, 1)}))
  157. offset_cases.append((BMonthBegin(0), {
  158. datetime(2008, 1, 1): datetime(2008, 1, 1),
  159. datetime(2006, 10, 2): datetime(2006, 10, 2),
  160. datetime(2008, 1, 31): datetime(2008, 2, 1),
  161. datetime(2006, 12, 29): datetime(2007, 1, 1),
  162. datetime(2006, 12, 31): datetime(2007, 1, 1),
  163. datetime(2006, 9, 15): datetime(2006, 10, 2)}))
  164. offset_cases.append((BMonthBegin(2), {
  165. datetime(2008, 1, 1): datetime(2008, 3, 3),
  166. datetime(2008, 1, 15): datetime(2008, 3, 3),
  167. datetime(2006, 12, 29): datetime(2007, 2, 1),
  168. datetime(2006, 12, 31): datetime(2007, 2, 1),
  169. datetime(2007, 1, 1): datetime(2007, 3, 1),
  170. datetime(2006, 11, 1): datetime(2007, 1, 1)}))
  171. offset_cases.append((BMonthBegin(-1), {
  172. datetime(2007, 1, 1): datetime(2006, 12, 1),
  173. datetime(2008, 6, 30): datetime(2008, 6, 2),
  174. datetime(2008, 6, 1): datetime(2008, 5, 1),
  175. datetime(2008, 3, 10): datetime(2008, 3, 3),
  176. datetime(2008, 12, 31): datetime(2008, 12, 1),
  177. datetime(2006, 12, 29): datetime(2006, 12, 1),
  178. datetime(2006, 12, 30): datetime(2006, 12, 1),
  179. datetime(2007, 1, 1): datetime(2006, 12, 1)}))
  180. @pytest.mark.parametrize('case', offset_cases)
  181. def test_offset(self, case):
  182. offset, cases = case
  183. for base, expected in compat.iteritems(cases):
  184. assert_offset_equal(offset, base, expected)
  185. on_offset_cases = [(BMonthBegin(), datetime(2007, 12, 31), False),
  186. (BMonthBegin(), datetime(2008, 1, 1), True),
  187. (BMonthBegin(), datetime(2001, 4, 2), True),
  188. (BMonthBegin(), datetime(2008, 3, 3), True)]
  189. @pytest.mark.parametrize('case', on_offset_cases)
  190. def test_onOffset(self, case):
  191. offset, dt, expected = case
  192. assert_onOffset(offset, dt, expected)
  193. class TestBMonthEnd(Base):
  194. _offset = BMonthEnd
  195. def test_normalize(self):
  196. dt = datetime(2007, 1, 1, 3)
  197. result = dt + BMonthEnd(normalize=True)
  198. expected = dt.replace(hour=0) + BMonthEnd()
  199. assert result == expected
  200. def test_offsets_compare_equal(self):
  201. # root cause of #456
  202. offset1 = BMonthEnd()
  203. offset2 = BMonthEnd()
  204. assert not offset1 != offset2
  205. offset_cases = []
  206. offset_cases.append((BMonthEnd(), {
  207. datetime(2008, 1, 1): datetime(2008, 1, 31),
  208. datetime(2008, 1, 31): datetime(2008, 2, 29),
  209. datetime(2006, 12, 29): datetime(2007, 1, 31),
  210. datetime(2006, 12, 31): datetime(2007, 1, 31),
  211. datetime(2007, 1, 1): datetime(2007, 1, 31),
  212. datetime(2006, 12, 1): datetime(2006, 12, 29)}))
  213. offset_cases.append((BMonthEnd(0), {
  214. datetime(2008, 1, 1): datetime(2008, 1, 31),
  215. datetime(2008, 1, 31): datetime(2008, 1, 31),
  216. datetime(2006, 12, 29): datetime(2006, 12, 29),
  217. datetime(2006, 12, 31): datetime(2007, 1, 31),
  218. datetime(2007, 1, 1): datetime(2007, 1, 31)}))
  219. offset_cases.append((BMonthEnd(2), {
  220. datetime(2008, 1, 1): datetime(2008, 2, 29),
  221. datetime(2008, 1, 31): datetime(2008, 3, 31),
  222. datetime(2006, 12, 29): datetime(2007, 2, 28),
  223. datetime(2006, 12, 31): datetime(2007, 2, 28),
  224. datetime(2007, 1, 1): datetime(2007, 2, 28),
  225. datetime(2006, 11, 1): datetime(2006, 12, 29)}))
  226. offset_cases.append((BMonthEnd(-1), {
  227. datetime(2007, 1, 1): datetime(2006, 12, 29),
  228. datetime(2008, 6, 30): datetime(2008, 5, 30),
  229. datetime(2008, 12, 31): datetime(2008, 11, 28),
  230. datetime(2006, 12, 29): datetime(2006, 11, 30),
  231. datetime(2006, 12, 30): datetime(2006, 12, 29),
  232. datetime(2007, 1, 1): datetime(2006, 12, 29)}))
  233. @pytest.mark.parametrize('case', offset_cases)
  234. def test_offset(self, case):
  235. offset, cases = case
  236. for base, expected in compat.iteritems(cases):
  237. assert_offset_equal(offset, base, expected)
  238. on_offset_cases = [(BMonthEnd(), datetime(2007, 12, 31), True),
  239. (BMonthEnd(), datetime(2008, 1, 1), False)]
  240. @pytest.mark.parametrize('case', on_offset_cases)
  241. def test_onOffset(self, case):
  242. offset, dt, expected = case
  243. assert_onOffset(offset, dt, expected)
  244. # --------------------------------------------------------------------
  245. # Quarters
  246. class TestQuarterBegin(Base):
  247. def test_repr(self):
  248. expected = "<QuarterBegin: startingMonth=3>"
  249. assert repr(QuarterBegin()) == expected
  250. expected = "<QuarterBegin: startingMonth=3>"
  251. assert repr(QuarterBegin(startingMonth=3)) == expected
  252. expected = "<QuarterBegin: startingMonth=1>"
  253. assert repr(QuarterBegin(startingMonth=1)) == expected
  254. def test_isAnchored(self):
  255. assert QuarterBegin(startingMonth=1).isAnchored()
  256. assert QuarterBegin().isAnchored()
  257. assert not QuarterBegin(2, startingMonth=1).isAnchored()
  258. def test_offset_corner_case(self):
  259. # corner
  260. offset = QuarterBegin(n=-1, startingMonth=1)
  261. assert datetime(2010, 2, 1) + offset == datetime(2010, 1, 1)
  262. offset_cases = []
  263. offset_cases.append((QuarterBegin(startingMonth=1), {
  264. datetime(2007, 12, 1): datetime(2008, 1, 1),
  265. datetime(2008, 1, 1): datetime(2008, 4, 1),
  266. datetime(2008, 2, 15): datetime(2008, 4, 1),
  267. datetime(2008, 2, 29): datetime(2008, 4, 1),
  268. datetime(2008, 3, 15): datetime(2008, 4, 1),
  269. datetime(2008, 3, 31): datetime(2008, 4, 1),
  270. datetime(2008, 4, 15): datetime(2008, 7, 1),
  271. datetime(2008, 4, 1): datetime(2008, 7, 1)}))
  272. offset_cases.append((QuarterBegin(startingMonth=2), {
  273. datetime(2008, 1, 1): datetime(2008, 2, 1),
  274. datetime(2008, 1, 31): datetime(2008, 2, 1),
  275. datetime(2008, 1, 15): datetime(2008, 2, 1),
  276. datetime(2008, 2, 29): datetime(2008, 5, 1),
  277. datetime(2008, 3, 15): datetime(2008, 5, 1),
  278. datetime(2008, 3, 31): datetime(2008, 5, 1),
  279. datetime(2008, 4, 15): datetime(2008, 5, 1),
  280. datetime(2008, 4, 30): datetime(2008, 5, 1)}))
  281. offset_cases.append((QuarterBegin(startingMonth=1, n=0), {
  282. datetime(2008, 1, 1): datetime(2008, 1, 1),
  283. datetime(2008, 12, 1): datetime(2009, 1, 1),
  284. datetime(2008, 1, 1): datetime(2008, 1, 1),
  285. datetime(2008, 2, 15): datetime(2008, 4, 1),
  286. datetime(2008, 2, 29): datetime(2008, 4, 1),
  287. datetime(2008, 3, 15): datetime(2008, 4, 1),
  288. datetime(2008, 3, 31): datetime(2008, 4, 1),
  289. datetime(2008, 4, 15): datetime(2008, 7, 1),
  290. datetime(2008, 4, 30): datetime(2008, 7, 1)}))
  291. offset_cases.append((QuarterBegin(startingMonth=1, n=-1), {
  292. datetime(2008, 1, 1): datetime(2007, 10, 1),
  293. datetime(2008, 1, 31): datetime(2008, 1, 1),
  294. datetime(2008, 2, 15): datetime(2008, 1, 1),
  295. datetime(2008, 2, 29): datetime(2008, 1, 1),
  296. datetime(2008, 3, 15): datetime(2008, 1, 1),
  297. datetime(2008, 3, 31): datetime(2008, 1, 1),
  298. datetime(2008, 4, 15): datetime(2008, 4, 1),
  299. datetime(2008, 4, 30): datetime(2008, 4, 1),
  300. datetime(2008, 7, 1): datetime(2008, 4, 1)}))
  301. offset_cases.append((QuarterBegin(startingMonth=1, n=2), {
  302. datetime(2008, 1, 1): datetime(2008, 7, 1),
  303. datetime(2008, 2, 15): datetime(2008, 7, 1),
  304. datetime(2008, 2, 29): datetime(2008, 7, 1),
  305. datetime(2008, 3, 15): datetime(2008, 7, 1),
  306. datetime(2008, 3, 31): datetime(2008, 7, 1),
  307. datetime(2008, 4, 15): datetime(2008, 10, 1),
  308. datetime(2008, 4, 1): datetime(2008, 10, 1)}))
  309. @pytest.mark.parametrize('case', offset_cases)
  310. def test_offset(self, case):
  311. offset, cases = case
  312. for base, expected in compat.iteritems(cases):
  313. assert_offset_equal(offset, base, expected)
  314. class TestQuarterEnd(Base):
  315. _offset = QuarterEnd
  316. def test_repr(self):
  317. expected = "<QuarterEnd: startingMonth=3>"
  318. assert repr(QuarterEnd()) == expected
  319. expected = "<QuarterEnd: startingMonth=3>"
  320. assert repr(QuarterEnd(startingMonth=3)) == expected
  321. expected = "<QuarterEnd: startingMonth=1>"
  322. assert repr(QuarterEnd(startingMonth=1)) == expected
  323. def test_isAnchored(self):
  324. assert QuarterEnd(startingMonth=1).isAnchored()
  325. assert QuarterEnd().isAnchored()
  326. assert not QuarterEnd(2, startingMonth=1).isAnchored()
  327. def test_offset_corner_case(self):
  328. # corner
  329. offset = QuarterEnd(n=-1, startingMonth=1)
  330. assert datetime(2010, 2, 1) + offset == datetime(2010, 1, 31)
  331. offset_cases = []
  332. offset_cases.append((QuarterEnd(startingMonth=1), {
  333. datetime(2008, 1, 1): datetime(2008, 1, 31),
  334. datetime(2008, 1, 31): datetime(2008, 4, 30),
  335. datetime(2008, 2, 15): datetime(2008, 4, 30),
  336. datetime(2008, 2, 29): datetime(2008, 4, 30),
  337. datetime(2008, 3, 15): datetime(2008, 4, 30),
  338. datetime(2008, 3, 31): datetime(2008, 4, 30),
  339. datetime(2008, 4, 15): datetime(2008, 4, 30),
  340. datetime(2008, 4, 30): datetime(2008, 7, 31)}))
  341. offset_cases.append((QuarterEnd(startingMonth=2), {
  342. datetime(2008, 1, 1): datetime(2008, 2, 29),
  343. datetime(2008, 1, 31): datetime(2008, 2, 29),
  344. datetime(2008, 2, 15): datetime(2008, 2, 29),
  345. datetime(2008, 2, 29): datetime(2008, 5, 31),
  346. datetime(2008, 3, 15): datetime(2008, 5, 31),
  347. datetime(2008, 3, 31): datetime(2008, 5, 31),
  348. datetime(2008, 4, 15): datetime(2008, 5, 31),
  349. datetime(2008, 4, 30): datetime(2008, 5, 31)}))
  350. offset_cases.append((QuarterEnd(startingMonth=1, n=0), {
  351. datetime(2008, 1, 1): datetime(2008, 1, 31),
  352. datetime(2008, 1, 31): datetime(2008, 1, 31),
  353. datetime(2008, 2, 15): datetime(2008, 4, 30),
  354. datetime(2008, 2, 29): datetime(2008, 4, 30),
  355. datetime(2008, 3, 15): datetime(2008, 4, 30),
  356. datetime(2008, 3, 31): datetime(2008, 4, 30),
  357. datetime(2008, 4, 15): datetime(2008, 4, 30),
  358. datetime(2008, 4, 30): datetime(2008, 4, 30)}))
  359. offset_cases.append((QuarterEnd(startingMonth=1, n=-1), {
  360. datetime(2008, 1, 1): datetime(2007, 10, 31),
  361. datetime(2008, 1, 31): datetime(2007, 10, 31),
  362. datetime(2008, 2, 15): datetime(2008, 1, 31),
  363. datetime(2008, 2, 29): datetime(2008, 1, 31),
  364. datetime(2008, 3, 15): datetime(2008, 1, 31),
  365. datetime(2008, 3, 31): datetime(2008, 1, 31),
  366. datetime(2008, 4, 15): datetime(2008, 1, 31),
  367. datetime(2008, 4, 30): datetime(2008, 1, 31),
  368. datetime(2008, 7, 1): datetime(2008, 4, 30)}))
  369. offset_cases.append((QuarterEnd(startingMonth=1, n=2), {
  370. datetime(2008, 1, 31): datetime(2008, 7, 31),
  371. datetime(2008, 2, 15): datetime(2008, 7, 31),
  372. datetime(2008, 2, 29): datetime(2008, 7, 31),
  373. datetime(2008, 3, 15): datetime(2008, 7, 31),
  374. datetime(2008, 3, 31): datetime(2008, 7, 31),
  375. datetime(2008, 4, 15): datetime(2008, 7, 31),
  376. datetime(2008, 4, 30): datetime(2008, 10, 31)}))
  377. @pytest.mark.parametrize('case', offset_cases)
  378. def test_offset(self, case):
  379. offset, cases = case
  380. for base, expected in compat.iteritems(cases):
  381. assert_offset_equal(offset, base, expected)
  382. on_offset_cases = [
  383. (QuarterEnd(1, startingMonth=1), datetime(2008, 1, 31), True),
  384. (QuarterEnd(1, startingMonth=1), datetime(2007, 12, 31), False),
  385. (QuarterEnd(1, startingMonth=1), datetime(2008, 2, 29), False),
  386. (QuarterEnd(1, startingMonth=1), datetime(2007, 3, 30), False),
  387. (QuarterEnd(1, startingMonth=1), datetime(2007, 3, 31), False),
  388. (QuarterEnd(1, startingMonth=1), datetime(2008, 4, 30), True),
  389. (QuarterEnd(1, startingMonth=1), datetime(2008, 5, 30), False),
  390. (QuarterEnd(1, startingMonth=1), datetime(2008, 5, 31), False),
  391. (QuarterEnd(1, startingMonth=1), datetime(2007, 6, 29), False),
  392. (QuarterEnd(1, startingMonth=1), datetime(2007, 6, 30), False),
  393. (QuarterEnd(1, startingMonth=2), datetime(2008, 1, 31), False),
  394. (QuarterEnd(1, startingMonth=2), datetime(2007, 12, 31), False),
  395. (QuarterEnd(1, startingMonth=2), datetime(2008, 2, 29), True),
  396. (QuarterEnd(1, startingMonth=2), datetime(2007, 3, 30), False),
  397. (QuarterEnd(1, startingMonth=2), datetime(2007, 3, 31), False),
  398. (QuarterEnd(1, startingMonth=2), datetime(2008, 4, 30), False),
  399. (QuarterEnd(1, startingMonth=2), datetime(2008, 5, 30), False),
  400. (QuarterEnd(1, startingMonth=2), datetime(2008, 5, 31), True),
  401. (QuarterEnd(1, startingMonth=2), datetime(2007, 6, 29), False),
  402. (QuarterEnd(1, startingMonth=2), datetime(2007, 6, 30), False),
  403. (QuarterEnd(1, startingMonth=3), datetime(2008, 1, 31), False),
  404. (QuarterEnd(1, startingMonth=3), datetime(2007, 12, 31), True),
  405. (QuarterEnd(1, startingMonth=3), datetime(2008, 2, 29), False),
  406. (QuarterEnd(1, startingMonth=3), datetime(2007, 3, 30), False),
  407. (QuarterEnd(1, startingMonth=3), datetime(2007, 3, 31), True),
  408. (QuarterEnd(1, startingMonth=3), datetime(2008, 4, 30), False),
  409. (QuarterEnd(1, startingMonth=3), datetime(2008, 5, 30), False),
  410. (QuarterEnd(1, startingMonth=3), datetime(2008, 5, 31), False),
  411. (QuarterEnd(1, startingMonth=3), datetime(2007, 6, 29), False),
  412. (QuarterEnd(1, startingMonth=3), datetime(2007, 6, 30), True)]
  413. @pytest.mark.parametrize('case', on_offset_cases)
  414. def test_onOffset(self, case):
  415. offset, dt, expected = case
  416. assert_onOffset(offset, dt, expected)
  417. class TestBQuarterBegin(Base):
  418. _offset = BQuarterBegin
  419. def test_repr(self):
  420. expected = "<BusinessQuarterBegin: startingMonth=3>"
  421. assert repr(BQuarterBegin()) == expected
  422. expected = "<BusinessQuarterBegin: startingMonth=3>"
  423. assert repr(BQuarterBegin(startingMonth=3)) == expected
  424. expected = "<BusinessQuarterBegin: startingMonth=1>"
  425. assert repr(BQuarterBegin(startingMonth=1)) == expected
  426. def test_isAnchored(self):
  427. assert BQuarterBegin(startingMonth=1).isAnchored()
  428. assert BQuarterBegin().isAnchored()
  429. assert not BQuarterBegin(2, startingMonth=1).isAnchored()
  430. def test_offset_corner_case(self):
  431. # corner
  432. offset = BQuarterBegin(n=-1, startingMonth=1)
  433. assert datetime(2007, 4, 3) + offset == datetime(2007, 4, 2)
  434. offset_cases = []
  435. offset_cases.append((BQuarterBegin(startingMonth=1), {
  436. datetime(2008, 1, 1): datetime(2008, 4, 1),
  437. datetime(2008, 1, 31): datetime(2008, 4, 1),
  438. datetime(2008, 2, 15): datetime(2008, 4, 1),
  439. datetime(2008, 2, 29): datetime(2008, 4, 1),
  440. datetime(2008, 3, 15): datetime(2008, 4, 1),
  441. datetime(2008, 3, 31): datetime(2008, 4, 1),
  442. datetime(2008, 4, 15): datetime(2008, 7, 1),
  443. datetime(2007, 3, 15): datetime(2007, 4, 2),
  444. datetime(2007, 2, 28): datetime(2007, 4, 2),
  445. datetime(2007, 1, 1): datetime(2007, 4, 2),
  446. datetime(2007, 4, 15): datetime(2007, 7, 2),
  447. datetime(2007, 7, 1): datetime(2007, 7, 2),
  448. datetime(2007, 4, 1): datetime(2007, 4, 2),
  449. datetime(2007, 4, 2): datetime(2007, 7, 2),
  450. datetime(2008, 4, 30): datetime(2008, 7, 1)}))
  451. offset_cases.append((BQuarterBegin(startingMonth=2), {
  452. datetime(2008, 1, 1): datetime(2008, 2, 1),
  453. datetime(2008, 1, 31): datetime(2008, 2, 1),
  454. datetime(2008, 1, 15): datetime(2008, 2, 1),
  455. datetime(2008, 2, 29): datetime(2008, 5, 1),
  456. datetime(2008, 3, 15): datetime(2008, 5, 1),
  457. datetime(2008, 3, 31): datetime(2008, 5, 1),
  458. datetime(2008, 4, 15): datetime(2008, 5, 1),
  459. datetime(2008, 8, 15): datetime(2008, 11, 3),
  460. datetime(2008, 9, 15): datetime(2008, 11, 3),
  461. datetime(2008, 11, 1): datetime(2008, 11, 3),
  462. datetime(2008, 4, 30): datetime(2008, 5, 1)}))
  463. offset_cases.append((BQuarterBegin(startingMonth=1, n=0), {
  464. datetime(2008, 1, 1): datetime(2008, 1, 1),
  465. datetime(2007, 12, 31): datetime(2008, 1, 1),
  466. datetime(2008, 2, 15): datetime(2008, 4, 1),
  467. datetime(2008, 2, 29): datetime(2008, 4, 1),
  468. datetime(2008, 1, 15): datetime(2008, 4, 1),
  469. datetime(2008, 2, 27): datetime(2008, 4, 1),
  470. datetime(2008, 3, 15): datetime(2008, 4, 1),
  471. datetime(2007, 4, 1): datetime(2007, 4, 2),
  472. datetime(2007, 4, 2): datetime(2007, 4, 2),
  473. datetime(2007, 7, 1): datetime(2007, 7, 2),
  474. datetime(2007, 4, 15): datetime(2007, 7, 2),
  475. datetime(2007, 7, 2): datetime(2007, 7, 2)}))
  476. offset_cases.append((BQuarterBegin(startingMonth=1, n=-1), {
  477. datetime(2008, 1, 1): datetime(2007, 10, 1),
  478. datetime(2008, 1, 31): datetime(2008, 1, 1),
  479. datetime(2008, 2, 15): datetime(2008, 1, 1),
  480. datetime(2008, 2, 29): datetime(2008, 1, 1),
  481. datetime(2008, 3, 15): datetime(2008, 1, 1),
  482. datetime(2008, 3, 31): datetime(2008, 1, 1),
  483. datetime(2008, 4, 15): datetime(2008, 4, 1),
  484. datetime(2007, 7, 3): datetime(2007, 7, 2),
  485. datetime(2007, 4, 3): datetime(2007, 4, 2),
  486. datetime(2007, 7, 2): datetime(2007, 4, 2),
  487. datetime(2008, 4, 1): datetime(2008, 1, 1)}))
  488. offset_cases.append((BQuarterBegin(startingMonth=1, n=2), {
  489. datetime(2008, 1, 1): datetime(2008, 7, 1),
  490. datetime(2008, 1, 15): datetime(2008, 7, 1),
  491. datetime(2008, 2, 29): datetime(2008, 7, 1),
  492. datetime(2008, 3, 15): datetime(2008, 7, 1),
  493. datetime(2007, 3, 31): datetime(2007, 7, 2),
  494. datetime(2007, 4, 15): datetime(2007, 10, 1),
  495. datetime(2008, 4, 30): datetime(2008, 10, 1)}))
  496. @pytest.mark.parametrize('case', offset_cases)
  497. def test_offset(self, case):
  498. offset, cases = case
  499. for base, expected in compat.iteritems(cases):
  500. assert_offset_equal(offset, base, expected)
  501. class TestBQuarterEnd(Base):
  502. _offset = BQuarterEnd
  503. def test_repr(self):
  504. expected = "<BusinessQuarterEnd: startingMonth=3>"
  505. assert repr(BQuarterEnd()) == expected
  506. expected = "<BusinessQuarterEnd: startingMonth=3>"
  507. assert repr(BQuarterEnd(startingMonth=3)) == expected
  508. expected = "<BusinessQuarterEnd: startingMonth=1>"
  509. assert repr(BQuarterEnd(startingMonth=1)) == expected
  510. def test_isAnchored(self):
  511. assert BQuarterEnd(startingMonth=1).isAnchored()
  512. assert BQuarterEnd().isAnchored()
  513. assert not BQuarterEnd(2, startingMonth=1).isAnchored()
  514. def test_offset_corner_case(self):
  515. # corner
  516. offset = BQuarterEnd(n=-1, startingMonth=1)
  517. assert datetime(2010, 1, 31) + offset == datetime(2010, 1, 29)
  518. offset_cases = []
  519. offset_cases.append((BQuarterEnd(startingMonth=1), {
  520. datetime(2008, 1, 1): datetime(2008, 1, 31),
  521. datetime(2008, 1, 31): datetime(2008, 4, 30),
  522. datetime(2008, 2, 15): datetime(2008, 4, 30),
  523. datetime(2008, 2, 29): datetime(2008, 4, 30),
  524. datetime(2008, 3, 15): datetime(2008, 4, 30),
  525. datetime(2008, 3, 31): datetime(2008, 4, 30),
  526. datetime(2008, 4, 15): datetime(2008, 4, 30),
  527. datetime(2008, 4, 30): datetime(2008, 7, 31)}))
  528. offset_cases.append((BQuarterEnd(startingMonth=2), {
  529. datetime(2008, 1, 1): datetime(2008, 2, 29),
  530. datetime(2008, 1, 31): datetime(2008, 2, 29),
  531. datetime(2008, 2, 15): datetime(2008, 2, 29),
  532. datetime(2008, 2, 29): datetime(2008, 5, 30),
  533. datetime(2008, 3, 15): datetime(2008, 5, 30),
  534. datetime(2008, 3, 31): datetime(2008, 5, 30),
  535. datetime(2008, 4, 15): datetime(2008, 5, 30),
  536. datetime(2008, 4, 30): datetime(2008, 5, 30)}))
  537. offset_cases.append((BQuarterEnd(startingMonth=1, n=0), {
  538. datetime(2008, 1, 1): datetime(2008, 1, 31),
  539. datetime(2008, 1, 31): datetime(2008, 1, 31),
  540. datetime(2008, 2, 15): datetime(2008, 4, 30),
  541. datetime(2008, 2, 29): datetime(2008, 4, 30),
  542. datetime(2008, 3, 15): datetime(2008, 4, 30),
  543. datetime(2008, 3, 31): datetime(2008, 4, 30),
  544. datetime(2008, 4, 15): datetime(2008, 4, 30),
  545. datetime(2008, 4, 30): datetime(2008, 4, 30)}))
  546. offset_cases.append((BQuarterEnd(startingMonth=1, n=-1), {
  547. datetime(2008, 1, 1): datetime(2007, 10, 31),
  548. datetime(2008, 1, 31): datetime(2007, 10, 31),
  549. datetime(2008, 2, 15): datetime(2008, 1, 31),
  550. datetime(2008, 2, 29): datetime(2008, 1, 31),
  551. datetime(2008, 3, 15): datetime(2008, 1, 31),
  552. datetime(2008, 3, 31): datetime(2008, 1, 31),
  553. datetime(2008, 4, 15): datetime(2008, 1, 31),
  554. datetime(2008, 4, 30): datetime(2008, 1, 31)}))
  555. offset_cases.append((BQuarterEnd(startingMonth=1, n=2), {
  556. datetime(2008, 1, 31): datetime(2008, 7, 31),
  557. datetime(2008, 2, 15): datetime(2008, 7, 31),
  558. datetime(2008, 2, 29): datetime(2008, 7, 31),
  559. datetime(2008, 3, 15): datetime(2008, 7, 31),
  560. datetime(2008, 3, 31): datetime(2008, 7, 31),
  561. datetime(2008, 4, 15): datetime(2008, 7, 31),
  562. datetime(2008, 4, 30): datetime(2008, 10, 31)}))
  563. @pytest.mark.parametrize('case', offset_cases)
  564. def test_offset(self, case):
  565. offset, cases = case
  566. for base, expected in compat.iteritems(cases):
  567. assert_offset_equal(offset, base, expected)
  568. on_offset_cases = [
  569. (BQuarterEnd(1, startingMonth=1), datetime(2008, 1, 31), True),
  570. (BQuarterEnd(1, startingMonth=1), datetime(2007, 12, 31), False),
  571. (BQuarterEnd(1, startingMonth=1), datetime(2008, 2, 29), False),
  572. (BQuarterEnd(1, startingMonth=1), datetime(2007, 3, 30), False),
  573. (BQuarterEnd(1, startingMonth=1), datetime(2007, 3, 31), False),
  574. (BQuarterEnd(1, startingMonth=1), datetime(2008, 4, 30), True),
  575. (BQuarterEnd(1, startingMonth=1), datetime(2008, 5, 30), False),
  576. (BQuarterEnd(1, startingMonth=1), datetime(2007, 6, 29), False),
  577. (BQuarterEnd(1, startingMonth=1), datetime(2007, 6, 30), False),
  578. (BQuarterEnd(1, startingMonth=2), datetime(2008, 1, 31), False),
  579. (BQuarterEnd(1, startingMonth=2), datetime(2007, 12, 31), False),
  580. (BQuarterEnd(1, startingMonth=2), datetime(2008, 2, 29), True),
  581. (BQuarterEnd(1, startingMonth=2), datetime(2007, 3, 30), False),
  582. (BQuarterEnd(1, startingMonth=2), datetime(2007, 3, 31), False),
  583. (BQuarterEnd(1, startingMonth=2), datetime(2008, 4, 30), False),
  584. (BQuarterEnd(1, startingMonth=2), datetime(2008, 5, 30), True),
  585. (BQuarterEnd(1, startingMonth=2), datetime(2007, 6, 29), False),
  586. (BQuarterEnd(1, startingMonth=2), datetime(2007, 6, 30), False),
  587. (BQuarterEnd(1, startingMonth=3), datetime(2008, 1, 31), False),
  588. (BQuarterEnd(1, startingMonth=3), datetime(2007, 12, 31), True),
  589. (BQuarterEnd(1, startingMonth=3), datetime(2008, 2, 29), False),
  590. (BQuarterEnd(1, startingMonth=3), datetime(2007, 3, 30), True),
  591. (BQuarterEnd(1, startingMonth=3), datetime(2007, 3, 31), False),
  592. (BQuarterEnd(1, startingMonth=3), datetime(2008, 4, 30), False),
  593. (BQuarterEnd(1, startingMonth=3), datetime(2008, 5, 30), False),
  594. (BQuarterEnd(1, startingMonth=3), datetime(2007, 6, 29), True),
  595. (BQuarterEnd(1, startingMonth=3), datetime(2007, 6, 30), False)]
  596. @pytest.mark.parametrize('case', on_offset_cases)
  597. def test_onOffset(self, case):
  598. offset, dt, expected = case
  599. assert_onOffset(offset, dt, expected)
  600. # --------------------------------------------------------------------
  601. # Years
  602. class TestYearBegin(Base):
  603. _offset = YearBegin
  604. def test_misspecified(self):
  605. pytest.raises(ValueError, YearBegin, month=13)
  606. offset_cases = []
  607. offset_cases.append((YearBegin(), {
  608. datetime(2008, 1, 1): datetime(2009, 1, 1),
  609. datetime(2008, 6, 30): datetime(2009, 1, 1),
  610. datetime(2008, 12, 31): datetime(2009, 1, 1),
  611. datetime(2005, 12, 30): datetime(2006, 1, 1),
  612. datetime(2005, 12, 31): datetime(2006, 1, 1)}))
  613. offset_cases.append((YearBegin(0), {
  614. datetime(2008, 1, 1): datetime(2008, 1, 1),
  615. datetime(2008, 6, 30): datetime(2009, 1, 1),
  616. datetime(2008, 12, 31): datetime(2009, 1, 1),
  617. datetime(2005, 12, 30): datetime(2006, 1, 1),
  618. datetime(2005, 12, 31): datetime(2006, 1, 1)}))
  619. offset_cases.append((YearBegin(3), {
  620. datetime(2008, 1, 1): datetime(2011, 1, 1),
  621. datetime(2008, 6, 30): datetime(2011, 1, 1),
  622. datetime(2008, 12, 31): datetime(2011, 1, 1),
  623. datetime(2005, 12, 30): datetime(2008, 1, 1),
  624. datetime(2005, 12, 31): datetime(2008, 1, 1)}))
  625. offset_cases.append((YearBegin(-1), {
  626. datetime(2007, 1, 1): datetime(2006, 1, 1),
  627. datetime(2007, 1, 15): datetime(2007, 1, 1),
  628. datetime(2008, 6, 30): datetime(2008, 1, 1),
  629. datetime(2008, 12, 31): datetime(2008, 1, 1),
  630. datetime(2006, 12, 29): datetime(2006, 1, 1),
  631. datetime(2006, 12, 30): datetime(2006, 1, 1),
  632. datetime(2007, 1, 1): datetime(2006, 1, 1)}))
  633. offset_cases.append((YearBegin(-2), {
  634. datetime(2007, 1, 1): datetime(2005, 1, 1),
  635. datetime(2008, 6, 30): datetime(2007, 1, 1),
  636. datetime(2008, 12, 31): datetime(2007, 1, 1)}))
  637. offset_cases.append((YearBegin(month=4), {
  638. datetime(2007, 4, 1): datetime(2008, 4, 1),
  639. datetime(2007, 4, 15): datetime(2008, 4, 1),
  640. datetime(2007, 3, 1): datetime(2007, 4, 1),
  641. datetime(2007, 12, 15): datetime(2008, 4, 1),
  642. datetime(2012, 1, 31): datetime(2012, 4, 1)}))
  643. offset_cases.append((YearBegin(0, month=4), {
  644. datetime(2007, 4, 1): datetime(2007, 4, 1),
  645. datetime(2007, 3, 1): datetime(2007, 4, 1),
  646. datetime(2007, 12, 15): datetime(2008, 4, 1),
  647. datetime(2012, 1, 31): datetime(2012, 4, 1)}))
  648. offset_cases.append((YearBegin(4, month=4), {
  649. datetime(2007, 4, 1): datetime(2011, 4, 1),
  650. datetime(2007, 4, 15): datetime(2011, 4, 1),
  651. datetime(2007, 3, 1): datetime(2010, 4, 1),
  652. datetime(2007, 12, 15): datetime(2011, 4, 1),
  653. datetime(2012, 1, 31): datetime(2015, 4, 1)}))
  654. offset_cases.append((YearBegin(-1, month=4), {
  655. datetime(2007, 4, 1): datetime(2006, 4, 1),
  656. datetime(2007, 3, 1): datetime(2006, 4, 1),
  657. datetime(2007, 12, 15): datetime(2007, 4, 1),
  658. datetime(2012, 1, 31): datetime(2011, 4, 1)}))
  659. offset_cases.append((YearBegin(-3, month=4), {
  660. datetime(2007, 4, 1): datetime(2004, 4, 1),
  661. datetime(2007, 3, 1): datetime(2004, 4, 1),
  662. datetime(2007, 12, 15): datetime(2005, 4, 1),
  663. datetime(2012, 1, 31): datetime(2009, 4, 1)}))
  664. @pytest.mark.parametrize('case', offset_cases)
  665. def test_offset(self, case):
  666. offset, cases = case
  667. for base, expected in compat.iteritems(cases):
  668. assert_offset_equal(offset, base, expected)
  669. on_offset_cases = [(YearBegin(), datetime(2007, 1, 3), False),
  670. (YearBegin(), datetime(2008, 1, 1), True),
  671. (YearBegin(), datetime(2006, 12, 31), False),
  672. (YearBegin(), datetime(2006, 1, 2), False)]
  673. @pytest.mark.parametrize('case', on_offset_cases)
  674. def test_onOffset(self, case):
  675. offset, dt, expected = case
  676. assert_onOffset(offset, dt, expected)
  677. class TestYearEnd(Base):
  678. _offset = YearEnd
  679. def test_misspecified(self):
  680. pytest.raises(ValueError, YearEnd, month=13)
  681. offset_cases = []
  682. offset_cases.append((YearEnd(), {
  683. datetime(2008, 1, 1): datetime(2008, 12, 31),
  684. datetime(2008, 6, 30): datetime(2008, 12, 31),
  685. datetime(2008, 12, 31): datetime(2009, 12, 31),
  686. datetime(2005, 12, 30): datetime(2005, 12, 31),
  687. datetime(2005, 12, 31): datetime(2006, 12, 31)}))
  688. offset_cases.append((YearEnd(0), {
  689. datetime(2008, 1, 1): datetime(2008, 12, 31),
  690. datetime(2008, 6, 30): datetime(2008, 12, 31),
  691. datetime(2008, 12, 31): datetime(2008, 12, 31),
  692. datetime(2005, 12, 30): datetime(2005, 12, 31)}))
  693. offset_cases.append((YearEnd(-1), {
  694. datetime(2007, 1, 1): datetime(2006, 12, 31),
  695. datetime(2008, 6, 30): datetime(2007, 12, 31),
  696. datetime(2008, 12, 31): datetime(2007, 12, 31),
  697. datetime(2006, 12, 29): datetime(2005, 12, 31),
  698. datetime(2006, 12, 30): datetime(2005, 12, 31),
  699. datetime(2007, 1, 1): datetime(2006, 12, 31)}))
  700. offset_cases.append((YearEnd(-2), {
  701. datetime(2007, 1, 1): datetime(2005, 12, 31),
  702. datetime(2008, 6, 30): datetime(2006, 12, 31),
  703. datetime(2008, 12, 31): datetime(2006, 12, 31)}))
  704. @pytest.mark.parametrize('case', offset_cases)
  705. def test_offset(self, case):
  706. offset, cases = case
  707. for base, expected in compat.iteritems(cases):
  708. assert_offset_equal(offset, base, expected)
  709. on_offset_cases = [(YearEnd(), datetime(2007, 12, 31), True),
  710. (YearEnd(), datetime(2008, 1, 1), False),
  711. (YearEnd(), datetime(2006, 12, 31), True),
  712. (YearEnd(), datetime(2006, 12, 29), False)]
  713. @pytest.mark.parametrize('case', on_offset_cases)
  714. def test_onOffset(self, case):
  715. offset, dt, expected = case
  716. assert_onOffset(offset, dt, expected)
  717. class TestYearEndDiffMonth(Base):
  718. offset_cases = []
  719. offset_cases.append((YearEnd(month=3),
  720. {datetime(2008, 1, 1): datetime(2008, 3, 31),
  721. datetime(2008, 2, 15): datetime(2008, 3, 31),
  722. datetime(2008, 3, 31): datetime(2009, 3, 31),
  723. datetime(2008, 3, 30): datetime(2008, 3, 31),
  724. datetime(2005, 3, 31): datetime(2006, 3, 31),
  725. datetime(2006, 7, 30): datetime(2007, 3, 31)}))
  726. offset_cases.append((YearEnd(0, month=3),
  727. {datetime(2008, 1, 1): datetime(2008, 3, 31),
  728. datetime(2008, 2, 28): datetime(2008, 3, 31),
  729. datetime(2008, 3, 31): datetime(2008, 3, 31),
  730. datetime(2005, 3, 30): datetime(2005, 3, 31)}))
  731. offset_cases.append((YearEnd(-1, month=3),
  732. {datetime(2007, 1, 1): datetime(2006, 3, 31),
  733. datetime(2008, 2, 28): datetime(2007, 3, 31),
  734. datetime(2008, 3, 31): datetime(2007, 3, 31),
  735. datetime(2006, 3, 29): datetime(2005, 3, 31),
  736. datetime(2006, 3, 30): datetime(2005, 3, 31),
  737. datetime(2007, 3, 1): datetime(2006, 3, 31)}))
  738. offset_cases.append((YearEnd(-2, month=3),
  739. {datetime(2007, 1, 1): datetime(2005, 3, 31),
  740. datetime(2008, 6, 30): datetime(2007, 3, 31),
  741. datetime(2008, 3, 31): datetime(2006, 3, 31)}))
  742. @pytest.mark.parametrize('case', offset_cases)
  743. def test_offset(self, case):
  744. offset, cases = case
  745. for base, expected in compat.iteritems(cases):
  746. assert_offset_equal(offset, base, expected)
  747. on_offset_cases = [(YearEnd(month=3), datetime(2007, 3, 31), True),
  748. (YearEnd(month=3), datetime(2008, 1, 1), False),
  749. (YearEnd(month=3), datetime(2006, 3, 31), True),
  750. (YearEnd(month=3), datetime(2006, 3, 29), False)]
  751. @pytest.mark.parametrize('case', on_offset_cases)
  752. def test_onOffset(self, case):
  753. offset, dt, expected = case
  754. assert_onOffset(offset, dt, expected)
  755. class TestBYearBegin(Base):
  756. _offset = BYearBegin
  757. def test_misspecified(self):
  758. pytest.raises(ValueError, BYearBegin, month=13)
  759. pytest.raises(ValueError, BYearEnd, month=13)
  760. offset_cases = []
  761. offset_cases.append((BYearBegin(), {
  762. datetime(2008, 1, 1): datetime(2009, 1, 1),
  763. datetime(2008, 6, 30): datetime(2009, 1, 1),
  764. datetime(2008, 12, 31): datetime(2009, 1, 1),
  765. datetime(2011, 1, 1): datetime(2011, 1, 3),
  766. datetime(2011, 1, 3): datetime(2012, 1, 2),
  767. datetime(2005, 12, 30): datetime(2006, 1, 2),
  768. datetime(2005, 12, 31): datetime(2006, 1, 2)}))
  769. offset_cases.append((BYearBegin(0), {
  770. datetime(2008, 1, 1): datetime(2008, 1, 1),
  771. datetime(2008, 6, 30): datetime(2009, 1, 1),
  772. datetime(2008, 12, 31): datetime(2009, 1, 1),
  773. datetime(2005, 12, 30): datetime(2006, 1, 2),
  774. datetime(2005, 12, 31): datetime(2006, 1, 2)}))
  775. offset_cases.append((BYearBegin(-1), {
  776. datetime(2007, 1, 1): datetime(2006, 1, 2),
  777. datetime(2009, 1, 4): datetime(2009, 1, 1),
  778. datetime(2009, 1, 1): datetime(2008, 1, 1),
  779. datetime(2008, 6, 30): datetime(2008, 1, 1),
  780. datetime(2008, 12, 31): datetime(2008, 1, 1),
  781. datetime(2006, 12, 29): datetime(2006, 1, 2),
  782. datetime(2006, 12, 30): datetime(2006, 1, 2),
  783. datetime(2006, 1, 1): datetime(2005, 1, 3)}))
  784. offset_cases.append((BYearBegin(-2), {
  785. datetime(2007, 1, 1): datetime(2005, 1, 3),
  786. datetime(2007, 6, 30): datetime(2006, 1, 2),
  787. datetime(2008, 12, 31): datetime(2007, 1, 1)}))
  788. @pytest.mark.parametrize('case', offset_cases)
  789. def test_offset(self, case):
  790. offset, cases = case
  791. for base, expected in compat.iteritems(cases):
  792. assert_offset_equal(offset, base, expected)
  793. class TestBYearEnd(Base):
  794. _offset = BYearEnd
  795. offset_cases = []
  796. offset_cases.append((BYearEnd(), {
  797. datetime(2008, 1, 1): datetime(2008, 12, 31),
  798. datetime(2008, 6, 30): datetime(2008, 12, 31),
  799. datetime(2008, 12, 31): datetime(2009, 12, 31),
  800. datetime(2005, 12, 30): datetime(2006, 12, 29),
  801. datetime(2005, 12, 31): datetime(2006, 12, 29)}))
  802. offset_cases.append((BYearEnd(0), {
  803. datetime(2008, 1, 1): datetime(2008, 12, 31),
  804. datetime(2008, 6, 30): datetime(2008, 12, 31),
  805. datetime(2008, 12, 31): datetime(2008, 12, 31),
  806. datetime(2005, 12, 31): datetime(2006, 12, 29)}))
  807. offset_cases.append((BYearEnd(-1), {
  808. datetime(2007, 1, 1): datetime(2006, 12, 29),
  809. datetime(2008, 6, 30): datetime(2007, 12, 31),
  810. datetime(2008, 12, 31): datetime(2007, 12, 31),
  811. datetime(2006, 12, 29): datetime(2005, 12, 30),
  812. datetime(2006, 12, 30): datetime(2006, 12, 29),
  813. datetime(2007, 1, 1): datetime(2006, 12, 29)}))
  814. offset_cases.append((BYearEnd(-2), {
  815. datetime(2007, 1, 1): datetime(2005, 12, 30),
  816. datetime(2008, 6, 30): datetime(2006, 12, 29),
  817. datetime(2008, 12, 31): datetime(2006, 12, 29)}))
  818. @pytest.mark.parametrize('case', offset_cases)
  819. def test_offset(self, case):
  820. offset, cases = case
  821. for base, expected in compat.iteritems(cases):
  822. assert_offset_equal(offset, base, expected)
  823. on_offset_cases = [(BYearEnd(), datetime(2007, 12, 31), True),
  824. (BYearEnd(), datetime(2008, 1, 1), False),
  825. (BYearEnd(), datetime(2006, 12, 31), False),
  826. (BYearEnd(), datetime(2006, 12, 29), True)]
  827. @pytest.mark.parametrize('case', on_offset_cases)
  828. def test_onOffset(self, case):
  829. offset, dt, expected = case
  830. assert_onOffset(offset, dt, expected)
  831. class TestBYearEndLagged(Base):
  832. _offset = BYearEnd
  833. def test_bad_month_fail(self):
  834. pytest.raises(Exception, BYearEnd, month=13)
  835. pytest.raises(Exception, BYearEnd, month=0)
  836. offset_cases = []
  837. offset_cases.append((BYearEnd(month=6), {
  838. datetime(2008, 1, 1): datetime(2008, 6, 30),
  839. datetime(2007, 6, 30): datetime(2008, 6, 30)}))
  840. offset_cases.append((BYearEnd(n=-1, month=6), {
  841. datetime(2008, 1, 1): datetime(2007, 6, 29),
  842. datetime(2007, 6, 30): datetime(2007, 6, 29)}))
  843. @pytest.mark.parametrize('case', offset_cases)
  844. def test_offset(self, case):
  845. offset, cases = case
  846. for base, expected in compat.iteritems(cases):
  847. assert_offset_equal(offset, base, expected)
  848. def test_roll(self):
  849. offset = BYearEnd(month=6)
  850. date = datetime(2009, 11, 30)
  851. assert offset.rollforward(date) == datetime(2010, 6, 30)
  852. assert offset.rollback(date) == datetime(2009, 6, 30)
  853. on_offset_cases = [(BYearEnd(month=2), datetime(2007, 2, 28), True),
  854. (BYearEnd(month=6), datetime(2007, 6, 30), False)]
  855. @pytest.mark.parametrize('case', on_offset_cases)
  856. def test_onOffset(self, case):
  857. offset, dt, expected = case
  858. assert_onOffset(offset, dt, expected)