test_fiscal.py 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657
  1. # -*- coding: utf-8 -*-
  2. """
  3. Tests for Fiscal Year and Fiscal Quarter offset classes
  4. """
  5. from datetime import datetime
  6. from dateutil.relativedelta import relativedelta
  7. import pytest
  8. from pandas._libs.tslibs.frequencies import INVALID_FREQ_ERR_MSG
  9. from pandas import Timestamp
  10. from pandas.tseries.frequencies import get_offset
  11. from pandas.tseries.offsets import FY5253, FY5253Quarter
  12. from .common import assert_offset_equal, assert_onOffset
  13. from .test_offsets import Base, WeekDay
  14. def makeFY5253LastOfMonthQuarter(*args, **kwds):
  15. return FY5253Quarter(*args, variation="last", **kwds)
  16. def makeFY5253NearestEndMonthQuarter(*args, **kwds):
  17. return FY5253Quarter(*args, variation="nearest", **kwds)
  18. def makeFY5253NearestEndMonth(*args, **kwds):
  19. return FY5253(*args, variation="nearest", **kwds)
  20. def makeFY5253LastOfMonth(*args, **kwds):
  21. return FY5253(*args, variation="last", **kwds)
  22. def test_get_offset_name():
  23. assert (makeFY5253LastOfMonthQuarter(
  24. weekday=1, startingMonth=3,
  25. qtr_with_extra_week=4).freqstr == "REQ-L-MAR-TUE-4")
  26. assert (makeFY5253NearestEndMonthQuarter(
  27. weekday=1, startingMonth=3,
  28. qtr_with_extra_week=3).freqstr == "REQ-N-MAR-TUE-3")
  29. def test_get_offset():
  30. with pytest.raises(ValueError, match=INVALID_FREQ_ERR_MSG):
  31. get_offset('gibberish')
  32. with pytest.raises(ValueError, match=INVALID_FREQ_ERR_MSG):
  33. get_offset('QS-JAN-B')
  34. pairs = [
  35. ("RE-N-DEC-MON",
  36. makeFY5253NearestEndMonth(weekday=0, startingMonth=12)),
  37. ("RE-L-DEC-TUE",
  38. makeFY5253LastOfMonth(weekday=1, startingMonth=12)),
  39. ("REQ-L-MAR-TUE-4",
  40. makeFY5253LastOfMonthQuarter(weekday=1,
  41. startingMonth=3,
  42. qtr_with_extra_week=4)),
  43. ("REQ-L-DEC-MON-3",
  44. makeFY5253LastOfMonthQuarter(weekday=0,
  45. startingMonth=12,
  46. qtr_with_extra_week=3)),
  47. ("REQ-N-DEC-MON-3",
  48. makeFY5253NearestEndMonthQuarter(weekday=0,
  49. startingMonth=12,
  50. qtr_with_extra_week=3))]
  51. for name, expected in pairs:
  52. offset = get_offset(name)
  53. assert offset == expected, ("Expected %r to yield %r (actual: %r)" %
  54. (name, expected, offset))
  55. class TestFY5253LastOfMonth(Base):
  56. offset_lom_sat_aug = makeFY5253LastOfMonth(1, startingMonth=8,
  57. weekday=WeekDay.SAT)
  58. offset_lom_sat_sep = makeFY5253LastOfMonth(1, startingMonth=9,
  59. weekday=WeekDay.SAT)
  60. on_offset_cases = [
  61. # From Wikipedia (see:
  62. # http://en.wikipedia.org/wiki/4%E2%80%934%E2%80%935_calendar#Last_Saturday_of_the_month_at_fiscal_year_end)
  63. (offset_lom_sat_aug, datetime(2006, 8, 26), True),
  64. (offset_lom_sat_aug, datetime(2007, 8, 25), True),
  65. (offset_lom_sat_aug, datetime(2008, 8, 30), True),
  66. (offset_lom_sat_aug, datetime(2009, 8, 29), True),
  67. (offset_lom_sat_aug, datetime(2010, 8, 28), True),
  68. (offset_lom_sat_aug, datetime(2011, 8, 27), True),
  69. (offset_lom_sat_aug, datetime(2012, 8, 25), True),
  70. (offset_lom_sat_aug, datetime(2013, 8, 31), True),
  71. (offset_lom_sat_aug, datetime(2014, 8, 30), True),
  72. (offset_lom_sat_aug, datetime(2015, 8, 29), True),
  73. (offset_lom_sat_aug, datetime(2016, 8, 27), True),
  74. (offset_lom_sat_aug, datetime(2017, 8, 26), True),
  75. (offset_lom_sat_aug, datetime(2018, 8, 25), True),
  76. (offset_lom_sat_aug, datetime(2019, 8, 31), True),
  77. (offset_lom_sat_aug, datetime(2006, 8, 27), False),
  78. (offset_lom_sat_aug, datetime(2007, 8, 28), False),
  79. (offset_lom_sat_aug, datetime(2008, 8, 31), False),
  80. (offset_lom_sat_aug, datetime(2009, 8, 30), False),
  81. (offset_lom_sat_aug, datetime(2010, 8, 29), False),
  82. (offset_lom_sat_aug, datetime(2011, 8, 28), False),
  83. (offset_lom_sat_aug, datetime(2006, 8, 25), False),
  84. (offset_lom_sat_aug, datetime(2007, 8, 24), False),
  85. (offset_lom_sat_aug, datetime(2008, 8, 29), False),
  86. (offset_lom_sat_aug, datetime(2009, 8, 28), False),
  87. (offset_lom_sat_aug, datetime(2010, 8, 27), False),
  88. (offset_lom_sat_aug, datetime(2011, 8, 26), False),
  89. (offset_lom_sat_aug, datetime(2019, 8, 30), False),
  90. # From GMCR (see for example:
  91. # http://yahoo.brand.edgar-online.com/Default.aspx?
  92. # companyid=3184&formtypeID=7)
  93. (offset_lom_sat_sep, datetime(2010, 9, 25), True),
  94. (offset_lom_sat_sep, datetime(2011, 9, 24), True),
  95. (offset_lom_sat_sep, datetime(2012, 9, 29), True)]
  96. @pytest.mark.parametrize('case', on_offset_cases)
  97. def test_onOffset(self, case):
  98. offset, dt, expected = case
  99. assert_onOffset(offset, dt, expected)
  100. def test_apply(self):
  101. offset_lom_aug_sat = makeFY5253LastOfMonth(startingMonth=8,
  102. weekday=WeekDay.SAT)
  103. offset_lom_aug_sat_1 = makeFY5253LastOfMonth(n=1, startingMonth=8,
  104. weekday=WeekDay.SAT)
  105. date_seq_lom_aug_sat = [datetime(2006, 8, 26), datetime(2007, 8, 25),
  106. datetime(2008, 8, 30), datetime(2009, 8, 29),
  107. datetime(2010, 8, 28), datetime(2011, 8, 27),
  108. datetime(2012, 8, 25), datetime(2013, 8, 31),
  109. datetime(2014, 8, 30), datetime(2015, 8, 29),
  110. datetime(2016, 8, 27)]
  111. tests = [
  112. (offset_lom_aug_sat, date_seq_lom_aug_sat),
  113. (offset_lom_aug_sat_1, date_seq_lom_aug_sat),
  114. (offset_lom_aug_sat, [
  115. datetime(2006, 8, 25)] + date_seq_lom_aug_sat),
  116. (offset_lom_aug_sat_1, [
  117. datetime(2006, 8, 27)] + date_seq_lom_aug_sat[1:]),
  118. (makeFY5253LastOfMonth(n=-1, startingMonth=8,
  119. weekday=WeekDay.SAT),
  120. list(reversed(date_seq_lom_aug_sat))),
  121. ]
  122. for test in tests:
  123. offset, data = test
  124. current = data[0]
  125. for datum in data[1:]:
  126. current = current + offset
  127. assert current == datum
  128. class TestFY5253NearestEndMonth(Base):
  129. def test_get_year_end(self):
  130. assert (makeFY5253NearestEndMonth(
  131. startingMonth=8, weekday=WeekDay.SAT).get_year_end(
  132. datetime(2013, 1, 1)) == datetime(2013, 8, 31))
  133. assert (makeFY5253NearestEndMonth(
  134. startingMonth=8, weekday=WeekDay.SUN).get_year_end(
  135. datetime(2013, 1, 1)) == datetime(2013, 9, 1))
  136. assert (makeFY5253NearestEndMonth(
  137. startingMonth=8, weekday=WeekDay.FRI).get_year_end(
  138. datetime(2013, 1, 1)) == datetime(2013, 8, 30))
  139. offset_n = FY5253(weekday=WeekDay.TUE, startingMonth=12,
  140. variation="nearest")
  141. assert (offset_n.get_year_end(datetime(2012, 1, 1)) ==
  142. datetime(2013, 1, 1))
  143. assert (offset_n.get_year_end(datetime(2012, 1, 10)) ==
  144. datetime(2013, 1, 1))
  145. assert (offset_n.get_year_end(datetime(2013, 1, 1)) ==
  146. datetime(2013, 12, 31))
  147. assert (offset_n.get_year_end(datetime(2013, 1, 2)) ==
  148. datetime(2013, 12, 31))
  149. assert (offset_n.get_year_end(datetime(2013, 1, 3)) ==
  150. datetime(2013, 12, 31))
  151. assert (offset_n.get_year_end(datetime(2013, 1, 10)) ==
  152. datetime(2013, 12, 31))
  153. JNJ = FY5253(n=1, startingMonth=12, weekday=6, variation="nearest")
  154. assert (JNJ.get_year_end(datetime(2006, 1, 1)) ==
  155. datetime(2006, 12, 31))
  156. offset_lom_aug_sat = makeFY5253NearestEndMonth(1, startingMonth=8,
  157. weekday=WeekDay.SAT)
  158. offset_lom_aug_thu = makeFY5253NearestEndMonth(1, startingMonth=8,
  159. weekday=WeekDay.THU)
  160. offset_n = FY5253(weekday=WeekDay.TUE, startingMonth=12,
  161. variation="nearest")
  162. on_offset_cases = [
  163. # From Wikipedia (see:
  164. # http://en.wikipedia.org/wiki/4%E2%80%934%E2%80%935_calendar
  165. # #Saturday_nearest_the_end_of_month)
  166. # 2006-09-02 2006 September 2
  167. # 2007-09-01 2007 September 1
  168. # 2008-08-30 2008 August 30 (leap year)
  169. # 2009-08-29 2009 August 29
  170. # 2010-08-28 2010 August 28
  171. # 2011-09-03 2011 September 3
  172. # 2012-09-01 2012 September 1 (leap year)
  173. # 2013-08-31 2013 August 31
  174. # 2014-08-30 2014 August 30
  175. # 2015-08-29 2015 August 29
  176. # 2016-09-03 2016 September 3 (leap year)
  177. # 2017-09-02 2017 September 2
  178. # 2018-09-01 2018 September 1
  179. # 2019-08-31 2019 August 31
  180. (offset_lom_aug_sat, datetime(2006, 9, 2), True),
  181. (offset_lom_aug_sat, datetime(2007, 9, 1), True),
  182. (offset_lom_aug_sat, datetime(2008, 8, 30), True),
  183. (offset_lom_aug_sat, datetime(2009, 8, 29), True),
  184. (offset_lom_aug_sat, datetime(2010, 8, 28), True),
  185. (offset_lom_aug_sat, datetime(2011, 9, 3), True),
  186. (offset_lom_aug_sat, datetime(2016, 9, 3), True),
  187. (offset_lom_aug_sat, datetime(2017, 9, 2), True),
  188. (offset_lom_aug_sat, datetime(2018, 9, 1), True),
  189. (offset_lom_aug_sat, datetime(2019, 8, 31), True),
  190. (offset_lom_aug_sat, datetime(2006, 8, 27), False),
  191. (offset_lom_aug_sat, datetime(2007, 8, 28), False),
  192. (offset_lom_aug_sat, datetime(2008, 8, 31), False),
  193. (offset_lom_aug_sat, datetime(2009, 8, 30), False),
  194. (offset_lom_aug_sat, datetime(2010, 8, 29), False),
  195. (offset_lom_aug_sat, datetime(2011, 8, 28), False),
  196. (offset_lom_aug_sat, datetime(2006, 8, 25), False),
  197. (offset_lom_aug_sat, datetime(2007, 8, 24), False),
  198. (offset_lom_aug_sat, datetime(2008, 8, 29), False),
  199. (offset_lom_aug_sat, datetime(2009, 8, 28), False),
  200. (offset_lom_aug_sat, datetime(2010, 8, 27), False),
  201. (offset_lom_aug_sat, datetime(2011, 8, 26), False),
  202. (offset_lom_aug_sat, datetime(2019, 8, 30), False),
  203. # From Micron, see:
  204. # http://google.brand.edgar-online.com/?sym=MU&formtypeID=7
  205. (offset_lom_aug_thu, datetime(2012, 8, 30), True),
  206. (offset_lom_aug_thu, datetime(2011, 9, 1), True),
  207. (offset_n, datetime(2012, 12, 31), False),
  208. (offset_n, datetime(2013, 1, 1), True),
  209. (offset_n, datetime(2013, 1, 2), False)]
  210. @pytest.mark.parametrize('case', on_offset_cases)
  211. def test_onOffset(self, case):
  212. offset, dt, expected = case
  213. assert_onOffset(offset, dt, expected)
  214. def test_apply(self):
  215. date_seq_nem_8_sat = [datetime(2006, 9, 2), datetime(2007, 9, 1),
  216. datetime(2008, 8, 30), datetime(2009, 8, 29),
  217. datetime(2010, 8, 28), datetime(2011, 9, 3)]
  218. JNJ = [datetime(2005, 1, 2), datetime(2006, 1, 1),
  219. datetime(2006, 12, 31), datetime(2007, 12, 30),
  220. datetime(2008, 12, 28), datetime(2010, 1, 3),
  221. datetime(2011, 1, 2), datetime(2012, 1, 1),
  222. datetime(2012, 12, 30)]
  223. DEC_SAT = FY5253(n=-1, startingMonth=12, weekday=5,
  224. variation="nearest")
  225. tests = [
  226. (makeFY5253NearestEndMonth(startingMonth=8,
  227. weekday=WeekDay.SAT),
  228. date_seq_nem_8_sat),
  229. (makeFY5253NearestEndMonth(n=1, startingMonth=8,
  230. weekday=WeekDay.SAT),
  231. date_seq_nem_8_sat),
  232. (makeFY5253NearestEndMonth(startingMonth=8, weekday=WeekDay.SAT),
  233. [datetime(2006, 9, 1)] + date_seq_nem_8_sat),
  234. (makeFY5253NearestEndMonth(n=1, startingMonth=8,
  235. weekday=WeekDay.SAT),
  236. [datetime(2006, 9, 3)] + date_seq_nem_8_sat[1:]),
  237. (makeFY5253NearestEndMonth(n=-1, startingMonth=8,
  238. weekday=WeekDay.SAT),
  239. list(reversed(date_seq_nem_8_sat))),
  240. (makeFY5253NearestEndMonth(n=1, startingMonth=12,
  241. weekday=WeekDay.SUN), JNJ),
  242. (makeFY5253NearestEndMonth(n=-1, startingMonth=12,
  243. weekday=WeekDay.SUN),
  244. list(reversed(JNJ))),
  245. (makeFY5253NearestEndMonth(n=1, startingMonth=12,
  246. weekday=WeekDay.SUN),
  247. [datetime(2005, 1, 2), datetime(2006, 1, 1)]),
  248. (makeFY5253NearestEndMonth(n=1, startingMonth=12,
  249. weekday=WeekDay.SUN),
  250. [datetime(2006, 1, 2), datetime(2006, 12, 31)]),
  251. (DEC_SAT, [datetime(2013, 1, 15), datetime(2012, 12, 29)])
  252. ]
  253. for test in tests:
  254. offset, data = test
  255. current = data[0]
  256. for datum in data[1:]:
  257. current = current + offset
  258. assert current == datum
  259. class TestFY5253LastOfMonthQuarter(Base):
  260. def test_isAnchored(self):
  261. assert makeFY5253LastOfMonthQuarter(
  262. startingMonth=1, weekday=WeekDay.SAT,
  263. qtr_with_extra_week=4).isAnchored()
  264. assert makeFY5253LastOfMonthQuarter(
  265. weekday=WeekDay.SAT, startingMonth=3,
  266. qtr_with_extra_week=4).isAnchored()
  267. assert not makeFY5253LastOfMonthQuarter(
  268. 2, startingMonth=1, weekday=WeekDay.SAT,
  269. qtr_with_extra_week=4).isAnchored()
  270. def test_equality(self):
  271. assert (makeFY5253LastOfMonthQuarter(
  272. startingMonth=1, weekday=WeekDay.SAT,
  273. qtr_with_extra_week=4) == makeFY5253LastOfMonthQuarter(
  274. startingMonth=1, weekday=WeekDay.SAT, qtr_with_extra_week=4))
  275. assert (makeFY5253LastOfMonthQuarter(
  276. startingMonth=1, weekday=WeekDay.SAT,
  277. qtr_with_extra_week=4) != makeFY5253LastOfMonthQuarter(
  278. startingMonth=1, weekday=WeekDay.SUN, qtr_with_extra_week=4))
  279. assert (makeFY5253LastOfMonthQuarter(
  280. startingMonth=1, weekday=WeekDay.SAT,
  281. qtr_with_extra_week=4) != makeFY5253LastOfMonthQuarter(
  282. startingMonth=2, weekday=WeekDay.SAT, qtr_with_extra_week=4))
  283. def test_offset(self):
  284. offset = makeFY5253LastOfMonthQuarter(1, startingMonth=9,
  285. weekday=WeekDay.SAT,
  286. qtr_with_extra_week=4)
  287. offset2 = makeFY5253LastOfMonthQuarter(2, startingMonth=9,
  288. weekday=WeekDay.SAT,
  289. qtr_with_extra_week=4)
  290. offset4 = makeFY5253LastOfMonthQuarter(4, startingMonth=9,
  291. weekday=WeekDay.SAT,
  292. qtr_with_extra_week=4)
  293. offset_neg1 = makeFY5253LastOfMonthQuarter(-1, startingMonth=9,
  294. weekday=WeekDay.SAT,
  295. qtr_with_extra_week=4)
  296. offset_neg2 = makeFY5253LastOfMonthQuarter(-2, startingMonth=9,
  297. weekday=WeekDay.SAT,
  298. qtr_with_extra_week=4)
  299. GMCR = [datetime(2010, 3, 27), datetime(2010, 6, 26),
  300. datetime(2010, 9, 25), datetime(2010, 12, 25),
  301. datetime(2011, 3, 26), datetime(2011, 6, 25),
  302. datetime(2011, 9, 24), datetime(2011, 12, 24),
  303. datetime(2012, 3, 24), datetime(2012, 6, 23),
  304. datetime(2012, 9, 29), datetime(2012, 12, 29),
  305. datetime(2013, 3, 30), datetime(2013, 6, 29)]
  306. assert_offset_equal(offset, base=GMCR[0], expected=GMCR[1])
  307. assert_offset_equal(offset, base=GMCR[0] + relativedelta(days=-1),
  308. expected=GMCR[0])
  309. assert_offset_equal(offset, base=GMCR[1], expected=GMCR[2])
  310. assert_offset_equal(offset2, base=GMCR[0], expected=GMCR[2])
  311. assert_offset_equal(offset4, base=GMCR[0], expected=GMCR[4])
  312. assert_offset_equal(offset_neg1, base=GMCR[-1], expected=GMCR[-2])
  313. assert_offset_equal(offset_neg1,
  314. base=GMCR[-1] + relativedelta(days=+1),
  315. expected=GMCR[-1])
  316. assert_offset_equal(offset_neg2, base=GMCR[-1], expected=GMCR[-3])
  317. date = GMCR[0] + relativedelta(days=-1)
  318. for expected in GMCR:
  319. assert_offset_equal(offset, date, expected)
  320. date = date + offset
  321. date = GMCR[-1] + relativedelta(days=+1)
  322. for expected in reversed(GMCR):
  323. assert_offset_equal(offset_neg1, date, expected)
  324. date = date + offset_neg1
  325. lomq_aug_sat_4 = makeFY5253LastOfMonthQuarter(1, startingMonth=8,
  326. weekday=WeekDay.SAT,
  327. qtr_with_extra_week=4)
  328. lomq_sep_sat_4 = makeFY5253LastOfMonthQuarter(1, startingMonth=9,
  329. weekday=WeekDay.SAT,
  330. qtr_with_extra_week=4)
  331. on_offset_cases = [
  332. # From Wikipedia
  333. (lomq_aug_sat_4, datetime(2006, 8, 26), True),
  334. (lomq_aug_sat_4, datetime(2007, 8, 25), True),
  335. (lomq_aug_sat_4, datetime(2008, 8, 30), True),
  336. (lomq_aug_sat_4, datetime(2009, 8, 29), True),
  337. (lomq_aug_sat_4, datetime(2010, 8, 28), True),
  338. (lomq_aug_sat_4, datetime(2011, 8, 27), True),
  339. (lomq_aug_sat_4, datetime(2019, 8, 31), True),
  340. (lomq_aug_sat_4, datetime(2006, 8, 27), False),
  341. (lomq_aug_sat_4, datetime(2007, 8, 28), False),
  342. (lomq_aug_sat_4, datetime(2008, 8, 31), False),
  343. (lomq_aug_sat_4, datetime(2009, 8, 30), False),
  344. (lomq_aug_sat_4, datetime(2010, 8, 29), False),
  345. (lomq_aug_sat_4, datetime(2011, 8, 28), False),
  346. (lomq_aug_sat_4, datetime(2006, 8, 25), False),
  347. (lomq_aug_sat_4, datetime(2007, 8, 24), False),
  348. (lomq_aug_sat_4, datetime(2008, 8, 29), False),
  349. (lomq_aug_sat_4, datetime(2009, 8, 28), False),
  350. (lomq_aug_sat_4, datetime(2010, 8, 27), False),
  351. (lomq_aug_sat_4, datetime(2011, 8, 26), False),
  352. (lomq_aug_sat_4, datetime(2019, 8, 30), False),
  353. # From GMCR
  354. (lomq_sep_sat_4, datetime(2010, 9, 25), True),
  355. (lomq_sep_sat_4, datetime(2011, 9, 24), True),
  356. (lomq_sep_sat_4, datetime(2012, 9, 29), True),
  357. (lomq_sep_sat_4, datetime(2013, 6, 29), True),
  358. (lomq_sep_sat_4, datetime(2012, 6, 23), True),
  359. (lomq_sep_sat_4, datetime(2012, 6, 30), False),
  360. (lomq_sep_sat_4, datetime(2013, 3, 30), True),
  361. (lomq_sep_sat_4, datetime(2012, 3, 24), True),
  362. (lomq_sep_sat_4, datetime(2012, 12, 29), True),
  363. (lomq_sep_sat_4, datetime(2011, 12, 24), True),
  364. # INTC (extra week in Q1)
  365. # See: http://www.intc.com/releasedetail.cfm?ReleaseID=542844
  366. (makeFY5253LastOfMonthQuarter(1, startingMonth=12,
  367. weekday=WeekDay.SAT,
  368. qtr_with_extra_week=1),
  369. datetime(2011, 4, 2), True),
  370. # see: http://google.brand.edgar-online.com/?sym=INTC&formtypeID=7
  371. (makeFY5253LastOfMonthQuarter(1, startingMonth=12,
  372. weekday=WeekDay.SAT,
  373. qtr_with_extra_week=1),
  374. datetime(2012, 12, 29), True),
  375. (makeFY5253LastOfMonthQuarter(1, startingMonth=12,
  376. weekday=WeekDay.SAT,
  377. qtr_with_extra_week=1),
  378. datetime(2011, 12, 31), True),
  379. (makeFY5253LastOfMonthQuarter(1, startingMonth=12,
  380. weekday=WeekDay.SAT,
  381. qtr_with_extra_week=1),
  382. datetime(2010, 12, 25), True)]
  383. @pytest.mark.parametrize('case', on_offset_cases)
  384. def test_onOffset(self, case):
  385. offset, dt, expected = case
  386. assert_onOffset(offset, dt, expected)
  387. def test_year_has_extra_week(self):
  388. # End of long Q1
  389. assert makeFY5253LastOfMonthQuarter(
  390. 1, startingMonth=12, weekday=WeekDay.SAT,
  391. qtr_with_extra_week=1).year_has_extra_week(datetime(2011, 4, 2))
  392. # Start of long Q1
  393. assert makeFY5253LastOfMonthQuarter(
  394. 1, startingMonth=12, weekday=WeekDay.SAT,
  395. qtr_with_extra_week=1).year_has_extra_week(datetime(2010, 12, 26))
  396. # End of year before year with long Q1
  397. assert not makeFY5253LastOfMonthQuarter(
  398. 1, startingMonth=12, weekday=WeekDay.SAT,
  399. qtr_with_extra_week=1).year_has_extra_week(datetime(2010, 12, 25))
  400. for year in [x
  401. for x in range(1994, 2011 + 1)
  402. if x not in [2011, 2005, 2000, 1994]]:
  403. assert not makeFY5253LastOfMonthQuarter(
  404. 1, startingMonth=12, weekday=WeekDay.SAT,
  405. qtr_with_extra_week=1).year_has_extra_week(
  406. datetime(year, 4, 2))
  407. # Other long years
  408. assert makeFY5253LastOfMonthQuarter(
  409. 1, startingMonth=12, weekday=WeekDay.SAT,
  410. qtr_with_extra_week=1).year_has_extra_week(datetime(2005, 4, 2))
  411. assert makeFY5253LastOfMonthQuarter(
  412. 1, startingMonth=12, weekday=WeekDay.SAT,
  413. qtr_with_extra_week=1).year_has_extra_week(datetime(2000, 4, 2))
  414. assert makeFY5253LastOfMonthQuarter(
  415. 1, startingMonth=12, weekday=WeekDay.SAT,
  416. qtr_with_extra_week=1).year_has_extra_week(datetime(1994, 4, 2))
  417. def test_get_weeks(self):
  418. sat_dec_1 = makeFY5253LastOfMonthQuarter(1, startingMonth=12,
  419. weekday=WeekDay.SAT,
  420. qtr_with_extra_week=1)
  421. sat_dec_4 = makeFY5253LastOfMonthQuarter(1, startingMonth=12,
  422. weekday=WeekDay.SAT,
  423. qtr_with_extra_week=4)
  424. assert sat_dec_1.get_weeks(datetime(2011, 4, 2)) == [14, 13, 13, 13]
  425. assert sat_dec_4.get_weeks(datetime(2011, 4, 2)) == [13, 13, 13, 14]
  426. assert sat_dec_1.get_weeks(datetime(2010, 12, 25)) == [13, 13, 13, 13]
  427. class TestFY5253NearestEndMonthQuarter(Base):
  428. offset_nem_sat_aug_4 = makeFY5253NearestEndMonthQuarter(
  429. 1, startingMonth=8, weekday=WeekDay.SAT,
  430. qtr_with_extra_week=4)
  431. offset_nem_thu_aug_4 = makeFY5253NearestEndMonthQuarter(
  432. 1, startingMonth=8, weekday=WeekDay.THU,
  433. qtr_with_extra_week=4)
  434. offset_n = FY5253(weekday=WeekDay.TUE, startingMonth=12,
  435. variation="nearest")
  436. on_offset_cases = [
  437. # From Wikipedia
  438. (offset_nem_sat_aug_4, datetime(2006, 9, 2), True),
  439. (offset_nem_sat_aug_4, datetime(2007, 9, 1), True),
  440. (offset_nem_sat_aug_4, datetime(2008, 8, 30), True),
  441. (offset_nem_sat_aug_4, datetime(2009, 8, 29), True),
  442. (offset_nem_sat_aug_4, datetime(2010, 8, 28), True),
  443. (offset_nem_sat_aug_4, datetime(2011, 9, 3), True),
  444. (offset_nem_sat_aug_4, datetime(2016, 9, 3), True),
  445. (offset_nem_sat_aug_4, datetime(2017, 9, 2), True),
  446. (offset_nem_sat_aug_4, datetime(2018, 9, 1), True),
  447. (offset_nem_sat_aug_4, datetime(2019, 8, 31), True),
  448. (offset_nem_sat_aug_4, datetime(2006, 8, 27), False),
  449. (offset_nem_sat_aug_4, datetime(2007, 8, 28), False),
  450. (offset_nem_sat_aug_4, datetime(2008, 8, 31), False),
  451. (offset_nem_sat_aug_4, datetime(2009, 8, 30), False),
  452. (offset_nem_sat_aug_4, datetime(2010, 8, 29), False),
  453. (offset_nem_sat_aug_4, datetime(2011, 8, 28), False),
  454. (offset_nem_sat_aug_4, datetime(2006, 8, 25), False),
  455. (offset_nem_sat_aug_4, datetime(2007, 8, 24), False),
  456. (offset_nem_sat_aug_4, datetime(2008, 8, 29), False),
  457. (offset_nem_sat_aug_4, datetime(2009, 8, 28), False),
  458. (offset_nem_sat_aug_4, datetime(2010, 8, 27), False),
  459. (offset_nem_sat_aug_4, datetime(2011, 8, 26), False),
  460. (offset_nem_sat_aug_4, datetime(2019, 8, 30), False),
  461. # From Micron, see:
  462. # http://google.brand.edgar-online.com/?sym=MU&formtypeID=7
  463. (offset_nem_thu_aug_4, datetime(2012, 8, 30), True),
  464. (offset_nem_thu_aug_4, datetime(2011, 9, 1), True),
  465. # See: http://google.brand.edgar-online.com/?sym=MU&formtypeID=13
  466. (offset_nem_thu_aug_4, datetime(2013, 5, 30), True),
  467. (offset_nem_thu_aug_4, datetime(2013, 2, 28), True),
  468. (offset_nem_thu_aug_4, datetime(2012, 11, 29), True),
  469. (offset_nem_thu_aug_4, datetime(2012, 5, 31), True),
  470. (offset_nem_thu_aug_4, datetime(2007, 3, 1), True),
  471. (offset_nem_thu_aug_4, datetime(1994, 3, 3), True),
  472. (offset_n, datetime(2012, 12, 31), False),
  473. (offset_n, datetime(2013, 1, 1), True),
  474. (offset_n, datetime(2013, 1, 2), False)]
  475. @pytest.mark.parametrize('case', on_offset_cases)
  476. def test_onOffset(self, case):
  477. offset, dt, expected = case
  478. assert_onOffset(offset, dt, expected)
  479. def test_offset(self):
  480. offset = makeFY5253NearestEndMonthQuarter(1, startingMonth=8,
  481. weekday=WeekDay.THU,
  482. qtr_with_extra_week=4)
  483. MU = [datetime(2012, 5, 31),
  484. datetime(2012, 8, 30), datetime(2012, 11, 29),
  485. datetime(2013, 2, 28), datetime(2013, 5, 30)]
  486. date = MU[0] + relativedelta(days=-1)
  487. for expected in MU:
  488. assert_offset_equal(offset, date, expected)
  489. date = date + offset
  490. assert_offset_equal(offset,
  491. datetime(2012, 5, 31),
  492. datetime(2012, 8, 30))
  493. assert_offset_equal(offset,
  494. datetime(2012, 5, 30),
  495. datetime(2012, 5, 31))
  496. offset2 = FY5253Quarter(weekday=5, startingMonth=12, variation="last",
  497. qtr_with_extra_week=4)
  498. assert_offset_equal(offset2,
  499. datetime(2013, 1, 15),
  500. datetime(2013, 3, 30))
  501. def test_bunched_yearends():
  502. # GH#14774 cases with two fiscal year-ends in the same calendar-year
  503. fy = FY5253(n=1, weekday=5, startingMonth=12, variation='nearest')
  504. dt = Timestamp('2004-01-01')
  505. assert fy.rollback(dt) == Timestamp('2002-12-28')
  506. assert (-fy).apply(dt) == Timestamp('2002-12-28')
  507. assert dt - fy == Timestamp('2002-12-28')
  508. assert fy.rollforward(dt) == Timestamp('2004-01-03')
  509. assert fy.apply(dt) == Timestamp('2004-01-03')
  510. assert fy + dt == Timestamp('2004-01-03')
  511. assert dt + fy == Timestamp('2004-01-03')
  512. # Same thing, but starting from a Timestamp in the previous year.
  513. dt = Timestamp('2003-12-31')
  514. assert fy.rollback(dt) == Timestamp('2002-12-28')
  515. assert (-fy).apply(dt) == Timestamp('2002-12-28')
  516. assert dt - fy == Timestamp('2002-12-28')
  517. def test_fy5253_last_onoffset():
  518. # GH#18877 dates on the year-end but not normalized to midnight
  519. offset = FY5253(n=-5, startingMonth=5, variation="last", weekday=0)
  520. ts = Timestamp('1984-05-28 06:29:43.955911354+0200',
  521. tz='Europe/San_Marino')
  522. fast = offset.onOffset(ts)
  523. slow = (ts + offset) - offset == ts
  524. assert fast == slow
  525. def test_fy5253_nearest_onoffset():
  526. # GH#18877 dates on the year-end but not normalized to midnight
  527. offset = FY5253(n=3, startingMonth=7, variation="nearest", weekday=2)
  528. ts = Timestamp('2032-07-28 00:12:59.035729419+0000', tz='Africa/Dakar')
  529. fast = offset.onOffset(ts)
  530. slow = (ts + offset) - offset == ts
  531. assert fast == slow
  532. def test_fy5253qtr_onoffset_nearest():
  533. # GH#19036
  534. ts = Timestamp('1985-09-02 23:57:46.232550356-0300',
  535. tz='Atlantic/Bermuda')
  536. offset = FY5253Quarter(n=3, qtr_with_extra_week=1, startingMonth=2,
  537. variation="nearest", weekday=0)
  538. fast = offset.onOffset(ts)
  539. slow = (ts + offset) - offset == ts
  540. assert fast == slow
  541. def test_fy5253qtr_onoffset_last():
  542. # GH#19036
  543. offset = FY5253Quarter(n=-2, qtr_with_extra_week=1,
  544. startingMonth=7, variation="last", weekday=2)
  545. ts = Timestamp('2011-01-26 19:03:40.331096129+0200',
  546. tz='Africa/Windhoek')
  547. slow = (ts + offset) - offset == ts
  548. fast = offset.onOffset(ts)
  549. assert fast == slow