PageRenderTime 67ms CodeModel.GetById 20ms RepoModel.GetById 0ms app.codeStats 1ms

/pandas/tseries/tests/test_offsets.py

http://github.com/pydata/pandas
Python | 3083 lines | 2330 code | 658 blank | 95 comment | 143 complexity | 1bea9c676a786885d7553507d2807240 MD5 | raw file
Possible License(s): BSD-3-Clause, Apache-2.0
  1. from datetime import date, datetime, timedelta
  2. from dateutil.relativedelta import relativedelta
  3. from pandas.compat import range
  4. from pandas import compat
  5. import nose
  6. from nose.tools import assert_raises
  7. import numpy as np
  8. from pandas.core.datetools import (
  9. bday, BDay, CDay, BQuarterEnd, BMonthEnd,
  10. CBMonthEnd, CBMonthBegin,
  11. BYearEnd, MonthEnd, MonthBegin, BYearBegin,
  12. QuarterBegin, BQuarterBegin, BMonthBegin, DateOffset, Week,
  13. YearBegin, YearEnd, Hour, Minute, Second, Day, Micro, Milli, Nano, Easter,
  14. WeekOfMonth, format, ole2datetime, QuarterEnd, to_datetime, normalize_date,
  15. get_offset, get_offset_name, get_standard_freq)
  16. from pandas.tseries.frequencies import _offset_map
  17. from pandas.tseries.index import _to_m8, DatetimeIndex, _daterange_cache, date_range
  18. from pandas.tseries.tools import parse_time_string, _maybe_get_tz
  19. import pandas.tseries.offsets as offsets
  20. from pandas.tslib import monthrange, OutOfBoundsDatetime, NaT
  21. from pandas.lib import Timestamp
  22. from pandas.util.testing import assertRaisesRegexp
  23. import pandas.util.testing as tm
  24. from pandas.tseries.offsets import BusinessMonthEnd, CacheableOffset, \
  25. LastWeekOfMonth, FY5253, FY5253Quarter, WeekDay
  26. from pandas.tseries.holiday import USFederalHolidayCalendar
  27. from pandas import _np_version_under1p7
  28. _multiprocess_can_split_ = True
  29. def test_monthrange():
  30. import calendar
  31. for y in range(2000, 2013):
  32. for m in range(1, 13):
  33. assert monthrange(y, m) == calendar.monthrange(y, m)
  34. ####
  35. ## Misc function tests
  36. ####
  37. def test_format():
  38. actual = format(datetime(2008, 1, 15))
  39. assert actual == '20080115'
  40. def test_ole2datetime():
  41. actual = ole2datetime(60000)
  42. assert actual == datetime(2064, 4, 8)
  43. assert_raises(ValueError, ole2datetime, 60)
  44. def test_to_datetime1():
  45. actual = to_datetime(datetime(2008, 1, 15))
  46. assert actual == datetime(2008, 1, 15)
  47. actual = to_datetime('20080115')
  48. assert actual == datetime(2008, 1, 15)
  49. # unparseable
  50. s = 'Month 1, 1999'
  51. assert to_datetime(s) == s
  52. def test_normalize_date():
  53. actual = normalize_date(datetime(2007, 10, 1, 1, 12, 5, 10))
  54. assert actual == datetime(2007, 10, 1)
  55. def test_to_m8():
  56. valb = datetime(2007, 10, 1)
  57. valu = _to_m8(valb)
  58. tm.assert_isinstance(valu, np.datetime64)
  59. # assert valu == np.datetime64(datetime(2007,10,1))
  60. # def test_datetime64_box():
  61. # valu = np.datetime64(datetime(2007,10,1))
  62. # valb = _dt_box(valu)
  63. # assert type(valb) == datetime
  64. # assert valb == datetime(2007,10,1)
  65. #####
  66. ### DateOffset Tests
  67. #####
  68. class Base(tm.TestCase):
  69. _offset = None
  70. _offset_types = [getattr(offsets, o) for o in offsets.__all__]
  71. skip_np_u1p7 = [offsets.CustomBusinessDay, offsets.CDay, offsets.CustomBusinessMonthBegin,
  72. offsets.CustomBusinessMonthEnd, offsets.Nano]
  73. @property
  74. def offset_types(self):
  75. if _np_version_under1p7:
  76. return [o for o in self._offset_types if o not in self.skip_np_u1p7]
  77. else:
  78. return self._offset_types
  79. def _get_offset(self, klass, value=1, normalize=False):
  80. # create instance from offset class
  81. if klass is FY5253 or klass is FY5253Quarter:
  82. klass = klass(n=value, startingMonth=1, weekday=1,
  83. qtr_with_extra_week=1, variation='last',
  84. normalize=normalize)
  85. elif klass is LastWeekOfMonth:
  86. klass = klass(n=value, weekday=5, normalize=normalize)
  87. elif klass is WeekOfMonth:
  88. klass = klass(n=value, week=1, weekday=5, normalize=normalize)
  89. elif klass is Week:
  90. klass = klass(n=value, weekday=5, normalize=normalize)
  91. else:
  92. try:
  93. klass = klass(value, normalize=normalize)
  94. except:
  95. klass = klass(normalize=normalize)
  96. return klass
  97. def test_apply_out_of_range(self):
  98. if self._offset is None:
  99. return
  100. if _np_version_under1p7 and self._offset in self.skip_np_u1p7:
  101. raise nose.SkipTest('numpy >= 1.7 required')
  102. # try to create an out-of-bounds result timestamp; if we can't create the offset
  103. # skip
  104. try:
  105. offset = self._get_offset(self._offset, value=10000)
  106. result = Timestamp('20080101') + offset
  107. self.assertIsInstance(result, datetime)
  108. except (OutOfBoundsDatetime):
  109. raise
  110. except (ValueError, KeyError) as e:
  111. raise nose.SkipTest("cannot create out_of_range offset: {0} {1}".format(str(self).split('.')[-1],e))
  112. class TestCommon(Base):
  113. def setUp(self):
  114. # exected value created by Base._get_offset
  115. # are applied to 2011/01/01 09:00 (Saturday)
  116. # used for .apply and .rollforward
  117. self.expecteds = {'Day': Timestamp('2011-01-02 09:00:00'),
  118. 'BusinessDay': Timestamp('2011-01-03 09:00:00'),
  119. 'CustomBusinessDay': Timestamp('2011-01-03 09:00:00'),
  120. 'CustomBusinessMonthEnd': Timestamp('2011-01-31 09:00:00'),
  121. 'CustomBusinessMonthBegin': Timestamp('2011-01-03 09:00:00'),
  122. 'MonthBegin': Timestamp('2011-02-01 09:00:00'),
  123. 'BusinessMonthBegin': Timestamp('2011-01-03 09:00:00'),
  124. 'MonthEnd': Timestamp('2011-01-31 09:00:00'),
  125. 'BusinessMonthEnd': Timestamp('2011-01-31 09:00:00'),
  126. 'YearBegin': Timestamp('2012-01-01 09:00:00'),
  127. 'BYearBegin': Timestamp('2011-01-03 09:00:00'),
  128. 'YearEnd': Timestamp('2011-12-31 09:00:00'),
  129. 'BYearEnd': Timestamp('2011-12-30 09:00:00'),
  130. 'QuarterBegin': Timestamp('2011-03-01 09:00:00'),
  131. 'BQuarterBegin': Timestamp('2011-03-01 09:00:00'),
  132. 'QuarterEnd': Timestamp('2011-03-31 09:00:00'),
  133. 'BQuarterEnd': Timestamp('2011-03-31 09:00:00'),
  134. 'WeekOfMonth': Timestamp('2011-01-08 09:00:00'),
  135. 'LastWeekOfMonth': Timestamp('2011-01-29 09:00:00'),
  136. 'FY5253Quarter': Timestamp('2011-01-25 09:00:00'),
  137. 'FY5253': Timestamp('2011-01-25 09:00:00'),
  138. 'Week': Timestamp('2011-01-08 09:00:00'),
  139. 'Easter': Timestamp('2011-04-24 09:00:00'),
  140. 'Hour': Timestamp('2011-01-01 10:00:00'),
  141. 'Minute': Timestamp('2011-01-01 09:01:00'),
  142. 'Second': Timestamp('2011-01-01 09:00:01'),
  143. 'Milli': Timestamp('2011-01-01 09:00:00.001000'),
  144. 'Micro': Timestamp('2011-01-01 09:00:00.000001'),
  145. 'Nano': Timestamp(np.datetime64('2011-01-01T09:00:00.000000001Z'))}
  146. self.timezones = ['UTC', 'Asia/Tokyo', 'US/Eastern']
  147. def test_return_type(self):
  148. for offset in self.offset_types:
  149. offset = self._get_offset(offset)
  150. # make sure that we are returning a Timestamp
  151. result = Timestamp('20080101') + offset
  152. self.assertIsInstance(result, Timestamp)
  153. # make sure that we are returning NaT
  154. self.assertTrue(NaT + offset is NaT)
  155. self.assertTrue(offset + NaT is NaT)
  156. self.assertTrue(NaT - offset is NaT)
  157. self.assertTrue((-offset).apply(NaT) is NaT)
  158. def _check_offsetfunc_works(self, offset, funcname, dt, expected,
  159. normalize=False):
  160. offset_s = self._get_offset(offset, normalize=normalize)
  161. func = getattr(offset_s, funcname)
  162. result = func(dt)
  163. self.assert_(isinstance(result, Timestamp))
  164. self.assertEqual(result, expected)
  165. result = func(Timestamp(dt))
  166. self.assert_(isinstance(result, Timestamp))
  167. self.assertEqual(result, expected)
  168. if isinstance(dt, np.datetime64):
  169. # test tz when input is datetime or Timestamp
  170. return
  171. tm._skip_if_no_pytz()
  172. import pytz
  173. for tz in self.timezones:
  174. expected_localize = expected.tz_localize(tz)
  175. dt_tz = pytz.timezone(tz).localize(dt)
  176. result = func(dt_tz)
  177. self.assert_(isinstance(result, Timestamp))
  178. self.assertEqual(result, expected_localize)
  179. result = func(Timestamp(dt, tz=tz))
  180. self.assert_(isinstance(result, Timestamp))
  181. self.assertEqual(result, expected_localize)
  182. def _check_nanofunc_works(self, offset, funcname, dt, expected):
  183. offset = self._get_offset(offset)
  184. func = getattr(offset, funcname)
  185. t1 = Timestamp(dt)
  186. self.assertEqual(func(t1), expected)
  187. def test_apply(self):
  188. sdt = datetime(2011, 1, 1, 9, 0)
  189. ndt = np.datetime64('2011-01-01 09:00Z')
  190. for offset in self.offset_types:
  191. for dt in [sdt, ndt]:
  192. expected = self.expecteds[offset.__name__]
  193. if offset == Nano:
  194. self._check_nanofunc_works(offset, 'apply', dt, expected)
  195. else:
  196. self._check_offsetfunc_works(offset, 'apply', dt, expected)
  197. expected = Timestamp(expected.date())
  198. self._check_offsetfunc_works(offset, 'apply', dt, expected,
  199. normalize=True)
  200. def test_rollforward(self):
  201. expecteds = self.expecteds.copy()
  202. # result will not be changed if the target is on the offset
  203. no_changes = ['Day', 'MonthBegin', 'YearBegin', 'Week', 'Hour', 'Minute',
  204. 'Second', 'Milli', 'Micro', 'Nano']
  205. for n in no_changes:
  206. expecteds[n] = Timestamp('2011/01/01 09:00')
  207. # but be changed when normalize=True
  208. norm_expected = expecteds.copy()
  209. for k in norm_expected:
  210. norm_expected[k] = Timestamp(norm_expected[k].date())
  211. normalized = {'Day': Timestamp('2011-01-02 00:00:00'),
  212. 'MonthBegin': Timestamp('2011-02-01 00:00:00'),
  213. 'YearBegin': Timestamp('2012-01-01 00:00:00'),
  214. 'Week': Timestamp('2011-01-08 00:00:00'),
  215. 'Hour': Timestamp('2011-01-01 00:00:00'),
  216. 'Minute': Timestamp('2011-01-01 00:00:00'),
  217. 'Second': Timestamp('2011-01-01 00:00:00'),
  218. 'Milli': Timestamp('2011-01-01 00:00:00'),
  219. 'Micro': Timestamp('2011-01-01 00:00:00')}
  220. norm_expected.update(normalized)
  221. sdt = datetime(2011, 1, 1, 9, 0)
  222. ndt = np.datetime64('2011-01-01 09:00Z')
  223. for offset in self.offset_types:
  224. for dt in [sdt, ndt]:
  225. expected = expecteds[offset.__name__]
  226. if offset == Nano:
  227. self._check_nanofunc_works(offset, 'rollforward', dt, expected)
  228. else:
  229. self._check_offsetfunc_works(offset, 'rollforward', dt, expected)
  230. expected = norm_expected[offset.__name__]
  231. self._check_offsetfunc_works(offset, 'rollforward', dt, expected,
  232. normalize=True)
  233. def test_rollback(self):
  234. expecteds = {'BusinessDay': Timestamp('2010-12-31 09:00:00'),
  235. 'CustomBusinessDay': Timestamp('2010-12-31 09:00:00'),
  236. 'CustomBusinessMonthEnd': Timestamp('2010-12-31 09:00:00'),
  237. 'CustomBusinessMonthBegin': Timestamp('2010-12-01 09:00:00'),
  238. 'BusinessMonthBegin': Timestamp('2010-12-01 09:00:00'),
  239. 'MonthEnd': Timestamp('2010-12-31 09:00:00'),
  240. 'BusinessMonthEnd': Timestamp('2010-12-31 09:00:00'),
  241. 'BYearBegin': Timestamp('2010-01-01 09:00:00'),
  242. 'YearEnd': Timestamp('2010-12-31 09:00:00'),
  243. 'BYearEnd': Timestamp('2010-12-31 09:00:00'),
  244. 'QuarterBegin': Timestamp('2010-12-01 09:00:00'),
  245. 'BQuarterBegin': Timestamp('2010-12-01 09:00:00'),
  246. 'QuarterEnd': Timestamp('2010-12-31 09:00:00'),
  247. 'BQuarterEnd': Timestamp('2010-12-31 09:00:00'),
  248. 'WeekOfMonth': Timestamp('2010-12-11 09:00:00'),
  249. 'LastWeekOfMonth': Timestamp('2010-12-25 09:00:00'),
  250. 'FY5253Quarter': Timestamp('2010-10-26 09:00:00'),
  251. 'FY5253': Timestamp('2010-01-26 09:00:00'),
  252. 'Easter': Timestamp('2010-04-04 09:00:00')}
  253. # result will not be changed if the target is on the offset
  254. for n in ['Day', 'MonthBegin', 'YearBegin', 'Week', 'Hour', 'Minute',
  255. 'Second', 'Milli', 'Micro', 'Nano']:
  256. expecteds[n] = Timestamp('2011/01/01 09:00')
  257. # but be changed when normalize=True
  258. norm_expected = expecteds.copy()
  259. for k in norm_expected:
  260. norm_expected[k] = Timestamp(norm_expected[k].date())
  261. normalized = {'Day': Timestamp('2010-12-31 00:00:00'),
  262. 'MonthBegin': Timestamp('2010-12-01 00:00:00'),
  263. 'YearBegin': Timestamp('2010-01-01 00:00:00'),
  264. 'Week': Timestamp('2010-12-25 00:00:00'),
  265. 'Hour': Timestamp('2011-01-01 00:00:00'),
  266. 'Minute': Timestamp('2011-01-01 00:00:00'),
  267. 'Second': Timestamp('2011-01-01 00:00:00'),
  268. 'Milli': Timestamp('2011-01-01 00:00:00'),
  269. 'Micro': Timestamp('2011-01-01 00:00:00')}
  270. norm_expected.update(normalized)
  271. sdt = datetime(2011, 1, 1, 9, 0)
  272. ndt = np.datetime64('2011-01-01 09:00Z')
  273. for offset in self.offset_types:
  274. for dt in [sdt, ndt]:
  275. expected = expecteds[offset.__name__]
  276. if offset == Nano:
  277. self._check_nanofunc_works(offset, 'rollback', dt, expected)
  278. else:
  279. self._check_offsetfunc_works(offset, 'rollback', dt, expected)
  280. expected = norm_expected[offset.__name__]
  281. self._check_offsetfunc_works(offset, 'rollback',
  282. dt, expected, normalize=True)
  283. def test_onOffset(self):
  284. for offset in self.offset_types:
  285. dt = self.expecteds[offset.__name__]
  286. offset_s = self._get_offset(offset)
  287. self.assert_(offset_s.onOffset(dt))
  288. # when normalize=True, onOffset checks time is 00:00:00
  289. offset_n = self._get_offset(offset, normalize=True)
  290. self.assert_(not offset_n.onOffset(dt))
  291. date = datetime(dt.year, dt.month, dt.day)
  292. self.assert_(offset_n.onOffset(date))
  293. def test_add(self):
  294. dt = datetime(2011, 1, 1, 9, 0)
  295. for offset in self.offset_types:
  296. offset_s = self._get_offset(offset)
  297. expected = self.expecteds[offset.__name__]
  298. result_dt = dt + offset_s
  299. result_ts = Timestamp(dt) + offset_s
  300. for result in [result_dt, result_ts]:
  301. self.assertTrue(isinstance(result, Timestamp))
  302. self.assertEqual(result, expected)
  303. tm._skip_if_no_pytz()
  304. for tz in self.timezones:
  305. expected_localize = expected.tz_localize(tz)
  306. result = Timestamp(dt, tz=tz) + offset_s
  307. self.assert_(isinstance(result, Timestamp))
  308. self.assertEqual(result, expected_localize)
  309. # normalize=True
  310. offset_s = self._get_offset(offset, normalize=True)
  311. expected = Timestamp(expected.date())
  312. result_dt = dt + offset_s
  313. result_ts = Timestamp(dt) + offset_s
  314. for result in [result_dt, result_ts]:
  315. self.assertTrue(isinstance(result, Timestamp))
  316. self.assertEqual(result, expected)
  317. for tz in self.timezones:
  318. expected_localize = expected.tz_localize(tz)
  319. result = Timestamp(dt, tz=tz) + offset_s
  320. self.assert_(isinstance(result, Timestamp))
  321. self.assertEqual(result, expected_localize)
  322. class TestDateOffset(Base):
  323. _multiprocess_can_split_ = True
  324. def setUp(self):
  325. self.d = Timestamp(datetime(2008, 1, 2))
  326. _offset_map.clear()
  327. def test_repr(self):
  328. repr(DateOffset())
  329. repr(DateOffset(2))
  330. repr(2 * DateOffset())
  331. repr(2 * DateOffset(months=2))
  332. def test_mul(self):
  333. assert DateOffset(2) == 2 * DateOffset(1)
  334. assert DateOffset(2) == DateOffset(1) * 2
  335. def test_constructor(self):
  336. assert((self.d + DateOffset(months=2)) == datetime(2008, 3, 2))
  337. assert((self.d - DateOffset(months=2)) == datetime(2007, 11, 2))
  338. assert((self.d + DateOffset(2)) == datetime(2008, 1, 4))
  339. assert not DateOffset(2).isAnchored()
  340. assert DateOffset(1).isAnchored()
  341. d = datetime(2008, 1, 31)
  342. assert((d + DateOffset(months=1)) == datetime(2008, 2, 29))
  343. def test_copy(self):
  344. assert(DateOffset(months=2).copy() == DateOffset(months=2))
  345. def test_eq(self):
  346. offset1 = DateOffset(days=1)
  347. offset2 = DateOffset(days=365)
  348. self.assertNotEqual(offset1, offset2)
  349. class TestBusinessDay(Base):
  350. _multiprocess_can_split_ = True
  351. _offset = BDay
  352. def setUp(self):
  353. self.d = datetime(2008, 1, 1)
  354. self.offset = BDay()
  355. self.offset2 = BDay(2)
  356. def test_different_normalize_equals(self):
  357. # equivalent in this special case
  358. offset = BDay()
  359. offset2 = BDay()
  360. offset2.normalize = True
  361. self.assertEqual(offset, offset2)
  362. def test_repr(self):
  363. self.assertEqual(repr(self.offset), '<BusinessDay>')
  364. assert repr(self.offset2) == '<2 * BusinessDays>'
  365. expected = '<BusinessDay: offset=datetime.timedelta(1)>'
  366. assert repr(self.offset + timedelta(1)) == expected
  367. def test_with_offset(self):
  368. offset = self.offset + timedelta(hours=2)
  369. assert (self.d + offset) == datetime(2008, 1, 2, 2)
  370. def testEQ(self):
  371. self.assertEqual(self.offset2, self.offset2)
  372. def test_mul(self):
  373. pass
  374. def test_hash(self):
  375. self.assertEqual(hash(self.offset2), hash(self.offset2))
  376. def testCall(self):
  377. self.assertEqual(self.offset2(self.d), datetime(2008, 1, 3))
  378. def testRAdd(self):
  379. self.assertEqual(self.d + self.offset2, self.offset2 + self.d)
  380. def testSub(self):
  381. off = self.offset2
  382. self.assertRaises(Exception, off.__sub__, self.d)
  383. self.assertEqual(2 * off - off, off)
  384. self.assertEqual(self.d - self.offset2, self.d + BDay(-2))
  385. def testRSub(self):
  386. self.assertEqual(self.d - self.offset2, (-self.offset2).apply(self.d))
  387. def testMult1(self):
  388. self.assertEqual(self.d + 10 * self.offset, self.d + BDay(10))
  389. def testMult2(self):
  390. self.assertEqual(self.d + (-5 * BDay(-10)),
  391. self.d + BDay(50))
  392. def testRollback1(self):
  393. self.assertEqual(BDay(10).rollback(self.d), self.d)
  394. def testRollback2(self):
  395. self.assertEqual(
  396. BDay(10).rollback(datetime(2008, 1, 5)), datetime(2008, 1, 4))
  397. def testRollforward1(self):
  398. self.assertEqual(BDay(10).rollforward(self.d), self.d)
  399. def testRollforward2(self):
  400. self.assertEqual(
  401. BDay(10).rollforward(datetime(2008, 1, 5)), datetime(2008, 1, 7))
  402. def test_roll_date_object(self):
  403. offset = BDay()
  404. dt = date(2012, 9, 15)
  405. result = offset.rollback(dt)
  406. self.assertEqual(result, datetime(2012, 9, 14))
  407. result = offset.rollforward(dt)
  408. self.assertEqual(result, datetime(2012, 9, 17))
  409. offset = offsets.Day()
  410. result = offset.rollback(dt)
  411. self.assertEqual(result, datetime(2012, 9, 15))
  412. result = offset.rollforward(dt)
  413. self.assertEqual(result, datetime(2012, 9, 15))
  414. def test_onOffset(self):
  415. tests = [(BDay(), datetime(2008, 1, 1), True),
  416. (BDay(), datetime(2008, 1, 5), False)]
  417. for offset, date, expected in tests:
  418. assertOnOffset(offset, date, expected)
  419. def test_apply(self):
  420. tests = []
  421. tests.append((bday,
  422. {datetime(2008, 1, 1): datetime(2008, 1, 2),
  423. datetime(2008, 1, 4): datetime(2008, 1, 7),
  424. datetime(2008, 1, 5): datetime(2008, 1, 7),
  425. datetime(2008, 1, 6): datetime(2008, 1, 7),
  426. datetime(2008, 1, 7): datetime(2008, 1, 8)}))
  427. tests.append((2 * bday,
  428. {datetime(2008, 1, 1): datetime(2008, 1, 3),
  429. datetime(2008, 1, 4): datetime(2008, 1, 8),
  430. datetime(2008, 1, 5): datetime(2008, 1, 8),
  431. datetime(2008, 1, 6): datetime(2008, 1, 8),
  432. datetime(2008, 1, 7): datetime(2008, 1, 9)}))
  433. tests.append((-bday,
  434. {datetime(2008, 1, 1): datetime(2007, 12, 31),
  435. datetime(2008, 1, 4): datetime(2008, 1, 3),
  436. datetime(2008, 1, 5): datetime(2008, 1, 4),
  437. datetime(2008, 1, 6): datetime(2008, 1, 4),
  438. datetime(2008, 1, 7): datetime(2008, 1, 4),
  439. datetime(2008, 1, 8): datetime(2008, 1, 7)}))
  440. tests.append((-2 * bday,
  441. {datetime(2008, 1, 1): datetime(2007, 12, 28),
  442. datetime(2008, 1, 4): datetime(2008, 1, 2),
  443. datetime(2008, 1, 5): datetime(2008, 1, 3),
  444. datetime(2008, 1, 6): datetime(2008, 1, 3),
  445. datetime(2008, 1, 7): datetime(2008, 1, 3),
  446. datetime(2008, 1, 8): datetime(2008, 1, 4),
  447. datetime(2008, 1, 9): datetime(2008, 1, 7)}))
  448. tests.append((BDay(0),
  449. {datetime(2008, 1, 1): datetime(2008, 1, 1),
  450. datetime(2008, 1, 4): datetime(2008, 1, 4),
  451. datetime(2008, 1, 5): datetime(2008, 1, 7),
  452. datetime(2008, 1, 6): datetime(2008, 1, 7),
  453. datetime(2008, 1, 7): datetime(2008, 1, 7)}))
  454. for offset, cases in tests:
  455. for base, expected in compat.iteritems(cases):
  456. assertEq(offset, base, expected)
  457. def test_apply_large_n(self):
  458. dt = datetime(2012, 10, 23)
  459. result = dt + BDay(10)
  460. self.assertEqual(result, datetime(2012, 11, 6))
  461. result = dt + BDay(100) - BDay(100)
  462. self.assertEqual(result, dt)
  463. off = BDay() * 6
  464. rs = datetime(2012, 1, 1) - off
  465. xp = datetime(2011, 12, 23)
  466. self.assertEqual(rs, xp)
  467. st = datetime(2011, 12, 18)
  468. rs = st + off
  469. xp = datetime(2011, 12, 26)
  470. self.assertEqual(rs, xp)
  471. off = BDay() * 10
  472. rs = datetime(2014, 1, 5) + off # see #5890
  473. xp = datetime(2014, 1, 17)
  474. self.assertEqual(rs, xp)
  475. def test_apply_corner(self):
  476. self.assertRaises(TypeError, BDay().apply, BMonthEnd())
  477. def test_offsets_compare_equal(self):
  478. # root cause of #456
  479. offset1 = BDay()
  480. offset2 = BDay()
  481. self.assertFalse(offset1 != offset2)
  482. class TestCustomBusinessDay(Base):
  483. _multiprocess_can_split_ = True
  484. _offset = CDay
  485. def setUp(self):
  486. self.d = datetime(2008, 1, 1)
  487. self.nd = np.datetime64('2008-01-01 00:00:00Z')
  488. tm._skip_if_no_cday()
  489. self.offset = CDay()
  490. self.offset2 = CDay(2)
  491. def test_different_normalize_equals(self):
  492. # equivalent in this special case
  493. offset = CDay()
  494. offset2 = CDay()
  495. offset2.normalize = True
  496. self.assertEqual(offset, offset2)
  497. def test_repr(self):
  498. assert repr(self.offset) == '<CustomBusinessDay>'
  499. assert repr(self.offset2) == '<2 * CustomBusinessDays>'
  500. expected = '<BusinessDay: offset=datetime.timedelta(1)>'
  501. assert repr(self.offset + timedelta(1)) == expected
  502. def test_with_offset(self):
  503. offset = self.offset + timedelta(hours=2)
  504. assert (self.d + offset) == datetime(2008, 1, 2, 2)
  505. def testEQ(self):
  506. self.assertEqual(self.offset2, self.offset2)
  507. def test_mul(self):
  508. pass
  509. def test_hash(self):
  510. self.assertEqual(hash(self.offset2), hash(self.offset2))
  511. def testCall(self):
  512. self.assertEqual(self.offset2(self.d), datetime(2008, 1, 3))
  513. self.assertEqual(self.offset2(self.nd), datetime(2008, 1, 3))
  514. def testRAdd(self):
  515. self.assertEqual(self.d + self.offset2, self.offset2 + self.d)
  516. def testSub(self):
  517. off = self.offset2
  518. self.assertRaises(Exception, off.__sub__, self.d)
  519. self.assertEqual(2 * off - off, off)
  520. self.assertEqual(self.d - self.offset2, self.d + CDay(-2))
  521. def testRSub(self):
  522. self.assertEqual(self.d - self.offset2, (-self.offset2).apply(self.d))
  523. def testMult1(self):
  524. self.assertEqual(self.d + 10 * self.offset, self.d + CDay(10))
  525. def testMult2(self):
  526. self.assertEqual(self.d + (-5 * CDay(-10)),
  527. self.d + CDay(50))
  528. def testRollback1(self):
  529. self.assertEqual(CDay(10).rollback(self.d), self.d)
  530. def testRollback2(self):
  531. self.assertEqual(
  532. CDay(10).rollback(datetime(2008, 1, 5)), datetime(2008, 1, 4))
  533. def testRollforward1(self):
  534. self.assertEqual(CDay(10).rollforward(self.d), self.d)
  535. def testRollforward2(self):
  536. self.assertEqual(
  537. CDay(10).rollforward(datetime(2008, 1, 5)), datetime(2008, 1, 7))
  538. def test_roll_date_object(self):
  539. offset = CDay()
  540. dt = date(2012, 9, 15)
  541. result = offset.rollback(dt)
  542. self.assertEqual(result, datetime(2012, 9, 14))
  543. result = offset.rollforward(dt)
  544. self.assertEqual(result, datetime(2012, 9, 17))
  545. offset = offsets.Day()
  546. result = offset.rollback(dt)
  547. self.assertEqual(result, datetime(2012, 9, 15))
  548. result = offset.rollforward(dt)
  549. self.assertEqual(result, datetime(2012, 9, 15))
  550. def test_onOffset(self):
  551. tests = [(CDay(), datetime(2008, 1, 1), True),
  552. (CDay(), datetime(2008, 1, 5), False)]
  553. for offset, date, expected in tests:
  554. assertOnOffset(offset, date, expected)
  555. def test_apply(self):
  556. from pandas.core.datetools import cday
  557. tests = []
  558. tests.append((cday,
  559. {datetime(2008, 1, 1): datetime(2008, 1, 2),
  560. datetime(2008, 1, 4): datetime(2008, 1, 7),
  561. datetime(2008, 1, 5): datetime(2008, 1, 7),
  562. datetime(2008, 1, 6): datetime(2008, 1, 7),
  563. datetime(2008, 1, 7): datetime(2008, 1, 8)}))
  564. tests.append((2 * cday,
  565. {datetime(2008, 1, 1): datetime(2008, 1, 3),
  566. datetime(2008, 1, 4): datetime(2008, 1, 8),
  567. datetime(2008, 1, 5): datetime(2008, 1, 8),
  568. datetime(2008, 1, 6): datetime(2008, 1, 8),
  569. datetime(2008, 1, 7): datetime(2008, 1, 9)}))
  570. tests.append((-cday,
  571. {datetime(2008, 1, 1): datetime(2007, 12, 31),
  572. datetime(2008, 1, 4): datetime(2008, 1, 3),
  573. datetime(2008, 1, 5): datetime(2008, 1, 4),
  574. datetime(2008, 1, 6): datetime(2008, 1, 4),
  575. datetime(2008, 1, 7): datetime(2008, 1, 4),
  576. datetime(2008, 1, 8): datetime(2008, 1, 7)}))
  577. tests.append((-2 * cday,
  578. {datetime(2008, 1, 1): datetime(2007, 12, 28),
  579. datetime(2008, 1, 4): datetime(2008, 1, 2),
  580. datetime(2008, 1, 5): datetime(2008, 1, 3),
  581. datetime(2008, 1, 6): datetime(2008, 1, 3),
  582. datetime(2008, 1, 7): datetime(2008, 1, 3),
  583. datetime(2008, 1, 8): datetime(2008, 1, 4),
  584. datetime(2008, 1, 9): datetime(2008, 1, 7)}))
  585. tests.append((CDay(0),
  586. {datetime(2008, 1, 1): datetime(2008, 1, 1),
  587. datetime(2008, 1, 4): datetime(2008, 1, 4),
  588. datetime(2008, 1, 5): datetime(2008, 1, 7),
  589. datetime(2008, 1, 6): datetime(2008, 1, 7),
  590. datetime(2008, 1, 7): datetime(2008, 1, 7)}))
  591. for offset, cases in tests:
  592. for base, expected in compat.iteritems(cases):
  593. assertEq(offset, base, expected)
  594. def test_apply_large_n(self):
  595. dt = datetime(2012, 10, 23)
  596. result = dt + CDay(10)
  597. self.assertEqual(result, datetime(2012, 11, 6))
  598. result = dt + CDay(100) - CDay(100)
  599. self.assertEqual(result, dt)
  600. off = CDay() * 6
  601. rs = datetime(2012, 1, 1) - off
  602. xp = datetime(2011, 12, 23)
  603. self.assertEqual(rs, xp)
  604. st = datetime(2011, 12, 18)
  605. rs = st + off
  606. xp = datetime(2011, 12, 26)
  607. self.assertEqual(rs, xp)
  608. def test_apply_corner(self):
  609. self.assertRaises(Exception, CDay().apply, BMonthEnd())
  610. def test_offsets_compare_equal(self):
  611. # root cause of #456
  612. offset1 = CDay()
  613. offset2 = CDay()
  614. self.assertFalse(offset1 != offset2)
  615. def test_holidays(self):
  616. # Define a TradingDay offset
  617. holidays = ['2012-05-01', datetime(2013, 5, 1),
  618. np.datetime64('2014-05-01')]
  619. tday = CDay(holidays=holidays)
  620. for year in range(2012, 2015):
  621. dt = datetime(year, 4, 30)
  622. xp = datetime(year, 5, 2)
  623. rs = dt + tday
  624. self.assertEqual(rs, xp)
  625. def test_weekmask(self):
  626. weekmask_saudi = 'Sat Sun Mon Tue Wed' # Thu-Fri Weekend
  627. weekmask_uae = '1111001' # Fri-Sat Weekend
  628. weekmask_egypt = [1,1,1,1,0,0,1] # Fri-Sat Weekend
  629. bday_saudi = CDay(weekmask=weekmask_saudi)
  630. bday_uae = CDay(weekmask=weekmask_uae)
  631. bday_egypt = CDay(weekmask=weekmask_egypt)
  632. dt = datetime(2013, 5, 1)
  633. xp_saudi = datetime(2013, 5, 4)
  634. xp_uae = datetime(2013, 5, 2)
  635. xp_egypt = datetime(2013, 5, 2)
  636. self.assertEqual(xp_saudi, dt + bday_saudi)
  637. self.assertEqual(xp_uae, dt + bday_uae)
  638. self.assertEqual(xp_egypt, dt + bday_egypt)
  639. xp2 = datetime(2013, 5, 5)
  640. self.assertEqual(xp2, dt + 2 * bday_saudi)
  641. self.assertEqual(xp2, dt + 2 * bday_uae)
  642. self.assertEqual(xp2, dt + 2 * bday_egypt)
  643. def test_weekmask_and_holidays(self):
  644. weekmask_egypt = 'Sun Mon Tue Wed Thu' # Fri-Sat Weekend
  645. holidays = ['2012-05-01', datetime(2013, 5, 1),
  646. np.datetime64('2014-05-01')]
  647. bday_egypt = CDay(holidays=holidays, weekmask=weekmask_egypt)
  648. dt = datetime(2013, 4, 30)
  649. xp_egypt = datetime(2013, 5, 5)
  650. self.assertEqual(xp_egypt, dt + 2 * bday_egypt)
  651. def test_calendar(self):
  652. calendar = USFederalHolidayCalendar()
  653. dt = datetime(2014, 1, 17)
  654. assertEq(CDay(calendar=calendar), dt, datetime(2014, 1, 21))
  655. class CustomBusinessMonthBase(object):
  656. _multiprocess_can_split_ = True
  657. def setUp(self):
  658. self.d = datetime(2008, 1, 1)
  659. tm._skip_if_no_cday()
  660. self.offset = self._object()
  661. self.offset2 = self._object(2)
  662. def testEQ(self):
  663. self.assertEqual(self.offset2, self.offset2)
  664. def test_mul(self):
  665. pass
  666. def test_hash(self):
  667. self.assertEqual(hash(self.offset2), hash(self.offset2))
  668. def testRAdd(self):
  669. self.assertEqual(self.d + self.offset2, self.offset2 + self.d)
  670. def testSub(self):
  671. off = self.offset2
  672. self.assertRaises(Exception, off.__sub__, self.d)
  673. self.assertEqual(2 * off - off, off)
  674. self.assertEqual(self.d - self.offset2,
  675. self.d + self._object(-2))
  676. def testRSub(self):
  677. self.assertEqual(self.d - self.offset2, (-self.offset2).apply(self.d))
  678. def testMult1(self):
  679. self.assertEqual(self.d + 10 * self.offset,
  680. self.d + self._object(10))
  681. def testMult2(self):
  682. self.assertEqual(self.d + (-5 * self._object(-10)),
  683. self.d + self._object(50))
  684. def test_offsets_compare_equal(self):
  685. offset1 = self._object()
  686. offset2 = self._object()
  687. self.assertFalse(offset1 != offset2)
  688. class TestCustomBusinessMonthEnd(CustomBusinessMonthBase, Base):
  689. _object = CBMonthEnd
  690. def test_different_normalize_equals(self):
  691. # equivalent in this special case
  692. offset = CBMonthEnd()
  693. offset2 = CBMonthEnd()
  694. offset2.normalize = True
  695. self.assertEqual(offset, offset2)
  696. def test_repr(self):
  697. assert repr(self.offset) == '<CustomBusinessMonthEnd>'
  698. assert repr(self.offset2) == '<2 * CustomBusinessMonthEnds>'
  699. def testCall(self):
  700. self.assertEqual(self.offset2(self.d), datetime(2008, 2, 29))
  701. def testRollback1(self):
  702. self.assertEqual(
  703. CDay(10).rollback(datetime(2007, 12, 31)), datetime(2007, 12, 31))
  704. def testRollback2(self):
  705. self.assertEqual(CBMonthEnd(10).rollback(self.d),
  706. datetime(2007,12,31))
  707. def testRollforward1(self):
  708. self.assertEqual(CBMonthEnd(10).rollforward(self.d), datetime(2008,1,31))
  709. def test_roll_date_object(self):
  710. offset = CBMonthEnd()
  711. dt = date(2012, 9, 15)
  712. result = offset.rollback(dt)
  713. self.assertEqual(result, datetime(2012, 8, 31))
  714. result = offset.rollforward(dt)
  715. self.assertEqual(result, datetime(2012, 9, 28))
  716. offset = offsets.Day()
  717. result = offset.rollback(dt)
  718. self.assertEqual(result, datetime(2012, 9, 15))
  719. result = offset.rollforward(dt)
  720. self.assertEqual(result, datetime(2012, 9, 15))
  721. def test_onOffset(self):
  722. tests = [(CBMonthEnd(), datetime(2008, 1, 31), True),
  723. (CBMonthEnd(), datetime(2008, 1, 1), False)]
  724. for offset, date, expected in tests:
  725. assertOnOffset(offset, date, expected)
  726. def test_apply(self):
  727. cbm = CBMonthEnd()
  728. tests = []
  729. tests.append((cbm,
  730. {datetime(2008, 1, 1): datetime(2008, 1, 31),
  731. datetime(2008, 2, 7): datetime(2008, 2, 29)}))
  732. tests.append((2 * cbm,
  733. {datetime(2008, 1, 1): datetime(2008, 2, 29),
  734. datetime(2008, 2, 7): datetime(2008, 3, 31)}))
  735. tests.append((-cbm,
  736. {datetime(2008, 1, 1): datetime(2007, 12, 31),
  737. datetime(2008, 2, 8): datetime(2008, 1, 31)}))
  738. tests.append((-2 * cbm,
  739. {datetime(2008, 1, 1): datetime(2007, 11, 30),
  740. datetime(2008, 2, 9): datetime(2007, 12, 31)}))
  741. tests.append((CBMonthEnd(0),
  742. {datetime(2008, 1, 1): datetime(2008, 1, 31),
  743. datetime(2008, 2, 7): datetime(2008, 2, 29)}))
  744. for offset, cases in tests:
  745. for base, expected in compat.iteritems(cases):
  746. assertEq(offset, base, expected)
  747. def test_apply_large_n(self):
  748. dt = datetime(2012, 10, 23)
  749. result = dt + CBMonthEnd(10)
  750. self.assertEqual(result, datetime(2013, 7, 31))
  751. result = dt + CDay(100) - CDay(100)
  752. self.assertEqual(result, dt)
  753. off = CBMonthEnd() * 6
  754. rs = datetime(2012, 1, 1) - off
  755. xp = datetime(2011, 7, 29)
  756. self.assertEqual(rs, xp)
  757. st = datetime(2011, 12, 18)
  758. rs = st + off
  759. xp = datetime(2012, 5, 31)
  760. self.assertEqual(rs, xp)
  761. def test_holidays(self):
  762. # Define a TradingDay offset
  763. holidays = ['2012-01-31', datetime(2012, 2, 28),
  764. np.datetime64('2012-02-29')]
  765. bm_offset = CBMonthEnd(holidays=holidays)
  766. dt = datetime(2012,1,1)
  767. self.assertEqual(dt + bm_offset,datetime(2012,1,30))
  768. self.assertEqual(dt + 2*bm_offset,datetime(2012,2,27))
  769. def test_datetimeindex(self):
  770. from pandas.tseries.holiday import USFederalHolidayCalendar
  771. self.assertEqual(DatetimeIndex(start='20120101',end='20130101',freq=CBMonthEnd(calendar=USFederalHolidayCalendar())).tolist()[0],
  772. datetime(2012,1,31))
  773. class TestCustomBusinessMonthBegin(CustomBusinessMonthBase, Base):
  774. _object = CBMonthBegin
  775. def test_different_normalize_equals(self):
  776. # equivalent in this special case
  777. offset = CBMonthBegin()
  778. offset2 = CBMonthBegin()
  779. offset2.normalize = True
  780. self.assertEqual(offset, offset2)
  781. def test_repr(self):
  782. assert repr(self.offset) == '<CustomBusinessMonthBegin>'
  783. assert repr(self.offset2) == '<2 * CustomBusinessMonthBegins>'
  784. def testCall(self):
  785. self.assertEqual(self.offset2(self.d), datetime(2008, 3, 3))
  786. def testRollback1(self):
  787. self.assertEqual(
  788. CDay(10).rollback(datetime(2007, 12, 31)), datetime(2007, 12, 31))
  789. def testRollback2(self):
  790. self.assertEqual(CBMonthBegin(10).rollback(self.d),
  791. datetime(2008,1,1))
  792. def testRollforward1(self):
  793. self.assertEqual(CBMonthBegin(10).rollforward(self.d), datetime(2008,1,1))
  794. def test_roll_date_object(self):
  795. offset = CBMonthBegin()
  796. dt = date(2012, 9, 15)
  797. result = offset.rollback(dt)
  798. self.assertEqual(result, datetime(2012, 9, 3))
  799. result = offset.rollforward(dt)
  800. self.assertEqual(result, datetime(2012, 10, 1))
  801. offset = offsets.Day()
  802. result = offset.rollback(dt)
  803. self.assertEqual(result, datetime(2012, 9, 15))
  804. result = offset.rollforward(dt)
  805. self.assertEqual(result, datetime(2012, 9, 15))
  806. def test_onOffset(self):
  807. tests = [(CBMonthBegin(), datetime(2008, 1, 1), True),
  808. (CBMonthBegin(), datetime(2008, 1, 31), False)]
  809. for offset, date, expected in tests:
  810. assertOnOffset(offset, date, expected)
  811. def test_apply(self):
  812. cbm = CBMonthBegin()
  813. tests = []
  814. tests.append((cbm,
  815. {datetime(2008, 1, 1): datetime(2008, 2, 1),
  816. datetime(2008, 2, 7): datetime(2008, 3, 3)}))
  817. tests.append((2 * cbm,
  818. {datetime(2008, 1, 1): datetime(2008, 3, 3),
  819. datetime(2008, 2, 7): datetime(2008, 4, 1)}))
  820. tests.append((-cbm,
  821. {datetime(2008, 1, 1): datetime(2007, 12, 3),
  822. datetime(2008, 2, 8): datetime(2008, 2, 1)}))
  823. tests.append((-2 * cbm,
  824. {datetime(2008, 1, 1): datetime(2007, 11, 1),
  825. datetime(2008, 2, 9): datetime(2008, 1, 1)}))
  826. tests.append((CBMonthBegin(0),
  827. {datetime(2008, 1, 1): datetime(2008, 1, 1),
  828. datetime(2008, 1, 7): datetime(2008, 2, 1)}))
  829. for offset, cases in tests:
  830. for base, expected in compat.iteritems(cases):
  831. assertEq(offset, base, expected)
  832. def test_apply_large_n(self):
  833. dt = datetime(2012, 10, 23)
  834. result = dt + CBMonthBegin(10)
  835. self.assertEqual(result, datetime(2013, 8, 1))
  836. result = dt + CDay(100) - CDay(100)
  837. self.assertEqual(result, dt)
  838. off = CBMonthBegin() * 6
  839. rs = datetime(2012, 1, 1) - off
  840. xp = datetime(2011, 7, 1)
  841. self.assertEqual(rs, xp)
  842. st = datetime(2011, 12, 18)
  843. rs = st + off
  844. xp = datetime(2012, 6, 1)
  845. self.assertEqual(rs, xp)
  846. def test_holidays(self):
  847. # Define a TradingDay offset
  848. holidays = ['2012-02-01', datetime(2012, 2, 2),
  849. np.datetime64('2012-03-01')]
  850. bm_offset = CBMonthBegin(holidays=holidays)
  851. dt = datetime(2012,1,1)
  852. self.assertEqual(dt + bm_offset,datetime(2012,1,2))
  853. self.assertEqual(dt + 2*bm_offset,datetime(2012,2,3))
  854. def test_datetimeindex(self):
  855. self.assertEqual(DatetimeIndex(start='20120101',end='20130101',freq=CBMonthBegin(calendar=USFederalHolidayCalendar())).tolist()[0],
  856. datetime(2012,1,3))
  857. def assertOnOffset(offset, date, expected):
  858. actual = offset.onOffset(date)
  859. assert actual == expected, ("\nExpected: %s\nActual: %s\nFor Offset: %s)"
  860. "\nAt Date: %s" %
  861. (expected, actual, offset, date))
  862. class TestWeek(Base):
  863. _offset = Week
  864. def test_repr(self):
  865. self.assertEqual(repr(Week(weekday=0)), "<Week: weekday=0>")
  866. self.assertEqual(repr(Week(n=-1, weekday=0)), "<-1 * Week: weekday=0>")
  867. self.assertEqual(repr(Week(n=-2, weekday=0)), "<-2 * Weeks: weekday=0>")
  868. def test_corner(self):
  869. self.assertRaises(ValueError, Week, weekday=7)
  870. assertRaisesRegexp(ValueError, "Day must be", Week, weekday=-1)
  871. def test_isAnchored(self):
  872. self.assertTrue(Week(weekday=0).isAnchored())
  873. self.assertFalse(Week().isAnchored())
  874. self.assertFalse(Week(2, weekday=2).isAnchored())
  875. self.assertFalse(Week(2).isAnchored())
  876. def test_offset(self):
  877. tests = []
  878. tests.append((Week(), # not business week
  879. {datetime(2008, 1, 1): datetime(2008, 1, 8),
  880. datetime(2008, 1, 4): datetime(2008, 1, 11),
  881. datetime(2008, 1, 5): datetime(2008, 1, 12),
  882. datetime(2008, 1, 6): datetime(2008, 1, 13),
  883. datetime(2008, 1, 7): datetime(2008, 1, 14)}))
  884. tests.append((Week(weekday=0), # Mon
  885. {datetime(2007, 12, 31): datetime(2008, 1, 7),
  886. datetime(2008, 1, 4): datetime(2008, 1, 7),
  887. datetime(2008, 1, 5): datetime(2008, 1, 7),
  888. datetime(2008, 1, 6): datetime(2008, 1, 7),
  889. datetime(2008, 1, 7): datetime(2008, 1, 14)}))
  890. tests.append((Week(0, weekday=0), # n=0 -> roll forward. Mon
  891. {datetime(2007, 12, 31): datetime(2007, 12, 31),
  892. datetime(2008, 1, 4): datetime(2008, 1, 7),
  893. datetime(2008, 1, 5): datetime(2008, 1, 7),
  894. datetime(2008, 1, 6): datetime(2008, 1, 7),
  895. datetime(2008, 1, 7): datetime(2008, 1, 7)}))
  896. tests.append((Week(-2, weekday=1), # n=0 -> roll forward. Mon
  897. {datetime(2010, 4, 6): datetime(2010, 3, 23),
  898. datetime(2010, 4, 8): datetime(2010, 3, 30),
  899. datetime(2010, 4, 5): datetime(2010, 3, 23)}))
  900. for offset, cases in tests:
  901. for base, expected in compat.iteritems(cases):
  902. assertEq(offset, base, expected)
  903. def test_onOffset(self):
  904. for weekday in range(7):
  905. offset = Week(weekday=weekday)
  906. for day in range(1, 8):
  907. date = datetime(2008, 1, day)
  908. if day % 7 == weekday:
  909. expected = True
  910. else:
  911. expected = False
  912. assertOnOffset(offset, date, expected)
  913. def test_offsets_compare_equal(self):
  914. # root cause of #456
  915. offset1 = Week()
  916. offset2 = Week()
  917. self.assertFalse(offset1 != offset2)
  918. class TestWeekOfMonth(Base):
  919. _offset = WeekOfMonth
  920. def test_constructor(self):
  921. assertRaisesRegexp(ValueError, "^N cannot be 0", WeekOfMonth, n=0, week=1, weekday=1)
  922. assertRaisesRegexp(ValueError, "^Week", WeekOfMonth, n=1, week=4, weekday=0)
  923. assertRaisesRegexp(ValueError, "^Week", WeekOfMonth, n=1, week=-1, weekday=0)
  924. assertRaisesRegexp(ValueError, "^Day", WeekOfMonth, n=1, week=0, weekday=-1)
  925. assertRaisesRegexp(ValueError, "^Day", WeekOfMonth, n=1, week=0, weekday=7)
  926. def test_repr(self):
  927. self.assertEqual(repr(WeekOfMonth(weekday=1,week=2)), "<WeekOfMonth: week=2, weekday=1>")
  928. def test_offset(self):
  929. date1 = datetime(2011, 1, 4) # 1st Tuesday of Month
  930. date2 = datetime(2011, 1, 11) # 2nd Tuesday of Month
  931. date3 = datetime(2011, 1, 18) # 3rd Tuesday of Month
  932. date4 = datetime(2011, 1, 25) # 4th Tuesday of Month
  933. # see for loop for structure
  934. test_cases = [
  935. (-2, 2, 1, date1, datetime(2010, 11, 16)),
  936. (-2, 2, 1, date2, datetime(2010, 11, 16)),
  937. (-2, 2, 1, date3, datetime(2010, 11, 16)),
  938. (-2, 2, 1, date4, datetime(2010, 12, 21)),
  939. (-1, 2, 1, date1, datetime(2010, 12, 21)),
  940. (-1, 2, 1, date2, datetime(2010, 12, 21)),
  941. (-1, 2, 1, date3, datetime(2010, 12, 21)),
  942. (-1, 2, 1, date4, datetime(2011, 1, 18)),
  943. (1, 0, 0, date1, datetime(2011, 2, 7)),
  944. (1, 0, 0, date2, datetime(2011, 2, 7)),
  945. (1, 0, 0, date3, datetime(2011, 2, 7)),
  946. (1, 0, 0, date4, datetime(2011, 2, 7)),
  947. (1, 0, 1, date1, datetime(2011, 2, 1)),
  948. (1, 0, 1, date2, datetime(2011, 2, 1)),
  949. (1, 0, 1, date3, datetime(2011, 2, 1)),
  950. (1, 0, 1, date4, datetime(2011, 2, 1)),
  951. (1, 0, 2, date1, datetime(2011, 1, 5)),
  952. (1, 0, 2, date2, datetime(2011, 2, 2)),
  953. (1, 0, 2, date3, datetime(2011, 2, 2)),
  954. (1, 0, 2, date4, datetime(2011, 2, 2)),
  955. (1, 2, 1, date1, datetime(2011, 1, 18)),
  956. (1, 2, 1, date2, datetime(2011, 1, 18)),
  957. (1, 2, 1, date3, datetime(2011, 2, 15)),
  958. (1, 2, 1, date4, datetime(2011, 2, 15)),
  959. (2, 2, 1, date1, datetime(2011, 2, 15)),
  960. (2, 2, 1, date2, datetime(2011, 2, 15)),
  961. (2, 2, 1, date3, datetime(2011, 3, 15)),
  962. (2, 2, 1, date4, datetime(2011, 3, 15)),
  963. ]
  964. for n, week, weekday, date, expected in test_cases:
  965. offset = WeekOfMonth(n, week=week, weekday=weekday)
  966. assertEq(offset, date, expected)
  967. # try subtracting
  968. result = datetime(2011, 2, 1) - WeekOfMonth(week=1, weekday=2)
  969. self.assertEqual(result, datetime(2011, 1, 12))
  970. result = datetime(2011, 2, 3) - WeekOfMonth(week=0, weekday=2)
  971. self.assertEqual(result, datetime(2011, 2, 2))
  972. def test_onOffset(self):
  973. test_cases = [
  974. (0, 0, datetime(2011, 2, 7), True),
  975. (0, 0, datetime(2011, 2, 6), False),
  976. (0, 0, datetime(2011, 2, 14), False),
  977. (1, 0, datetime(2011, 2, 14), True),
  978. (0, 1, datetime(2011, 2, 1), True),
  979. (0, 1, datetime(2011, 2, 8), False),
  980. ]
  981. for week, weekday, date, expected in test_cases:
  982. offset = WeekOfMonth(week=week, weekday=weekday)
  983. self.assertEqual(offset.onOffset(date), expected)
  984. class TestLastWeekOfMonth(Base):
  985. _offset = LastWeekOfMonth
  986. def test_constructor(self):
  987. assertRaisesRegexp(ValueError, "^N cannot be 0", \
  988. LastWeekOfMonth, n=0, weekday=1)
  989. assertRaisesRegexp(ValueError, "^Day", LastWeekOfMonth, n=1, weekday=-1)
  990. assertRaisesRegexp(ValueError, "^Day", LastWeekOfMonth, n=1, weekday=7)
  991. def test_offset(self):
  992. #### Saturday
  993. last_sat = datetime(2013,8,31)
  994. next_sat = datetime(2013,9,28)
  995. offset_sat = LastWeekOfMonth(n=1, weekday=5)
  996. one_day_before = (last_sat + timedelta(days=-1))
  997. self.assertEqual(one_day_before + offset_sat, last_sat)
  998. one_day_after = (last_sat + timedelta(days=+1))
  999. self.assertEqual(one_day_after + offset_sat, next_sat)
  1000. #Test On that day
  1001. self.assertEqual(last_sat + offset_sat, next_sat)
  1002. #### Thursday
  1003. offset_thur = LastWeekOfMonth(n=1, weekday=3)
  1004. last_thurs = datetime(2013,1,31)
  1005. next_thurs = datetime(2013,2,28)
  1006. one_day_before = last_thurs + timedelta(days=-1)
  1007. self.assertEqual(one_day_before + offset_thur, last_thurs)
  1008. one_day_after = last_thurs + timedelta(days=+1)
  1009. self.assertEqual(one_day_after + offset_thur, next_thurs)
  1010. # Test on that day
  1011. self.assertEqual(last_thurs + offset_thur, next_thurs)
  1012. three_before = last_thurs + timedelta(days=-3)
  1013. self.assertEqual(three_before + offset_thur, last_thurs)
  1014. two_after = last_thurs + timedelta(days=+2)
  1015. self.assertEqual(two_after + offset_thur, next_thurs)
  1016. offset_sunday = LastWeekOfMonth(n=1, weekday=WeekDay.SUN)
  1017. self.assertEqual(datetime(2013,7,31) + offset_sunday, datetime(2013,8,25))
  1018. def test_onOffset(self):
  1019. test_cases = [
  1020. (WeekDay.SUN, datetime(2013, 1, 27), True),
  1021. (WeekDay.SAT, datetime(2013, 3, 30), True),
  1022. (WeekDay.MON, datetime(2013, 2, 18), False), #Not the last Mon
  1023. (WeekDay.SUN, datetime(2013, 2, 25), False), #Not a SUN
  1024. (WeekDay.MON, datetime(2013, 2, 25), True),
  1025. (WeekDay.SAT, datetime(2013, 11, 30), True),
  1026. (WeekDay.SAT, datetime(2006, 8, 26), True),
  1027. (WeekDay.SAT, datetime(2007, 8, 25), True),
  1028. (WeekDay.SAT, datetime(2008, 8, 30), True),
  1029. (WeekDay.SAT, datetime(2009, 8, 29), True),
  1030. (WeekDay.SAT, datetime(2010, 8, 28), True),
  1031. (WeekDay.SAT, datetime(2011, 8, 27), True),
  1032. (WeekDay.SAT, datetime(2019, 8, 31), True),
  1033. ]
  1034. for weekday, date, expected in test_cases:
  1035. offset = LastWeekOfMonth(weekday=weekday)
  1036. self.assertEqual(offset.onOffset(date), expected, msg=date)
  1037. class TestBMonthBegin(Base):
  1038. _offset = BMonthBegin
  1039. def test_offset(self):
  1040. tests = []
  1041. tests.append((BMonthBegin(),
  1042. {datetime(2008, 1, 1): datetime(2008, 2, 1),
  1043. datetime(2008, 1, 31): datetime(2008, 2, 1),
  1044. datetime(2006, 12, 29): datetime(2007, 1, 1),
  1045. datetime(2006, 12, 31): datetime(2007, 1, 1),
  1046. datetime(2006, 9, 1): datetime(2006, 10, 2),
  1047. datetime(2007, 1, 1): datetime(2007, 2, 1),
  1048. datetime(2006, 12, 1): datetime(2007, 1, 1)}))
  1049. tests.append((BMonthBegin(0),
  1050. {datetime(2008, 1, 1): datetime(2008, 1, 1),
  1051. datetime(2006, 10, 2): datetime(2006, 10, 2),
  1052. datetime(2008, 1, 31): datetime(2008, 2, 1),
  1053. datetime(2006, 12, 29): datetime(2007, 1, 1),
  1054. datetime(2006, 12, 31): datetime(2007, 1, 1),
  1055. datetime(2006, 9, 15): datetime(2006, 10, 2)}))
  1056. tests.append((BMonthBegin(2),
  1057. {datetime(2008, 1, 1): datetime(2008, 3, 3),
  1058. datetime(2008, 1, 15): datetime(2008, 3, 3),
  1059. datetime(2006, 12, 29): datetime(2007, 2, 1),
  1060. datetime(2006, 12, 31): datetime(2007, 2, 1),
  1061. datetime(2007, 1, 1): datetime(2007, 3, 1),
  1062. datetime(2006, 11, 1): datetime(2007, 1, 1)}))
  1063. tests.append((BMonthBegin(-1),
  1064. {datetime(2007, 1, 1): datetime(2006, 12, 1),
  1065. datetime(2008, 6, 30): datetime(2008, 6, 2),
  1066. datetime(2008, 6, 1): datetime(2008, 5, 1),
  1067. datetime(2008, 3, 10): datetime(2008, 3, 3),
  1068. datetime(2008, 12, 31): datetime(2008, 12, 1),
  1069. datetime(2006, 12, 29): datetime(2006, 12, 1),
  1070. datetime(2006, 12, 30): datetime(2006, 12, 1),
  1071. datetime(2007, 1, 1): datetime(2006, 12, 1)}))
  1072. for offset, cases in tests:
  1073. for base, expected in compat.iteritems(cases):
  1074. assertEq(offset, base, expected)
  1075. def test_onOffset(self):
  1076. tests = [(BMonthBegin(), datetime(2007, 12, 31), False),
  1077. (BMonthBegin(), datetime(2008, 1, 1), True),
  1078. (BMonthBegin(), datetime(2001, 4, 2), True),
  1079. (BMonthBegin(), datetime(2008, 3, 3), True)]
  1080. for offset, date, expected in tests:
  1081. assertOnOffset(offset, date, expected)
  1082. def test_offsets_compare_equal(self):
  1083. # root cause of #456
  1084. offset1 = BMonthBegin()
  1085. offset2 = BMonthBegin()
  1086. self.assertFalse(offset1 != offset2)
  1087. class TestBMonthEnd(Base):
  1088. _offset = BMonthEnd
  1089. def test_offset(self):
  1090. tests = []
  1091. tests.append((BMonthEnd(),
  1092. {datetime(2008, 1, 1): datetime(2008, 1, 31),
  1093. datetime(2008, 1, 31): datetime(2008, 2, 29),
  1094. datetime(2006, 12, 29): datetime(2007, 1, 31),
  1095. datetime(2006, 12, 31): datetime(2007, 1, 31),
  1096. datetime(2007, 1, 1): datetime(2007, 1, 31),
  1097. datetime(2006, 12, 1): datetime(2006, 12, 29)}))
  1098. tests.append((BMonthEnd(0),
  1099. {datetime(2008, 1, 1): datetime(2008, 1, 31),
  1100. datetime(2008, 1, 31): datetime(2008, 1, 31),
  1101. datetime(2006, 12, 29): datetime(2006, 12, 29),
  1102. datetime(2006, 12, 31): datetime(2007, 1, 31),
  1103. datetime(2007, 1, 1): datetime(2007, 1, 31)}))
  1104. tests.append((BMonthEnd(2),
  1105. {datetime(2008, 1, 1): datetime(2008, 2, 29),
  1106. datetime(2008, 1, 31): datetime(2008, 3, 31),
  1107. datetime(2006, 12, 29): datetime(2007, 2, 28),
  1108. datetime(2006, 12, 31): datetime(2007, 2, 28),
  1109. datetime(2007, 1, 1): datetime(2007, 2, 28),
  1110. datetime(2006, 11, 1): datetime(2006, 12, 29)}))
  1111. tests.append((BMonthEnd(-1),
  1112. {datetime(2007, 1, 1): datetime(2006, 12, 29),
  1113. datetime(2008, 6, 30): datetime(2008, 5, 30),
  1114. datetime(2008, 12, 31): datetime(2008, 11, 28),
  1115. datetime(2006, 12, 29): datetime(2006, 11, 30),
  1116. datetime(2006, 12, 30): datetime(2006, 12, 29),
  1117. datetime(2007, 1, 1): datetime(2006, 12, 29)}))
  1118. for offset, cases in tests:
  1119. for base, expected in compat.iteritems(cases):
  1120. assertEq(offset, base, expected)
  1121. def test_normalize(self):
  1122. dt = datetime(2007, 1, 1, 3)
  1123. result = dt + BMonthEnd(normalize=True)
  1124. expected = dt.replace(hour=0) + BMonthEnd()
  1125. self.assertEqual(result, expected)
  1126. def test_onOffset(self):
  1127. tests = [(BMonthEnd(), datetime(2007, 12, 31), True),
  1128. (BMonthEnd(), datetime(2008, 1, 1), False)]
  1129. for offset, date, expected in tests:
  1130. assertOnOffset(offset, date, expected)
  1131. def test_offsets_compare_equal(self):
  1132. # root cause of #456
  1133. offset1 = BMonthEnd()
  1134. offset2 = BMonthEnd()
  1135. self.assertFalse(offset1 != offset2)
  1136. class TestMonthBegin(Base):
  1137. _offset = MonthBegin
  1138. def test_offset(self):
  1139. tests = []
  1140. # NOTE: I'm not entirely happy with the logic here for Begin -ss
  1141. # see thread 'offset conventions' on the ML
  1142. tests.append((MonthBegin(),
  1143. {datetime(2008, 1, 31): datetime(2008, 2, 1),
  1144. datetime(2008, 2, 1): datetime(2008, 3, 1),
  1145. datetime(2006, 12, 31): datetime(2007, 1, 1),
  1146. datetime(2006, 12, 1): datetime(2007, 1, 1),
  1147. datetime(2007, 1, 31): datetime(2007, 2, 1)}))
  1148. tests.append((MonthBegin(0),
  1149. {datetime(2008, 1, 31): datetime(2008, 2, 1),
  1150. datetime(2008, 1, 1): datetime(2008, 1, 1),
  1151. datetime(2006, 12, 3): datetime(2007, 1, 1),
  1152. datetime(2007, 1, 31): datetime(2007, 2, 1)}))
  1153. tests.append((MonthBegin(2),
  1154. {datetime(2008, 2, 29): datetime(2008, 4, 1),
  1155. datetime(2008, 1, 31): datetime(2008, 3, 1),
  1156. datetime(2006, 12, 31): datetime(2007, 2, 1),
  1157. datetime(2007, 12, 28): datetime(2008, 2, 1),
  1158. datetime(2007, 1, 1): datetime(2007, 3, 1),
  1159. datetime(2006, 11, 1): datetime(2007, 1, 1)}))
  1160. tests.append((MonthBegin(-1),
  1161. {datetime(2007, 1, 1): datetime(2006, 12, 1),
  1162. datetime(2008, 5, 31): datetime(2008, 5, 1),
  1163. datetime(2008, 12, 31): datetime(2008, 12, 1),
  1164. datetime(2006, 12, 29): datetime(2006, 12, 1),
  1165. datetime(2006, 1, 2): datetime(2006, 1, 1)}))
  1166. for offset, cases in tests:
  1167. for base, expected in compat.iteritems(cases):
  1168. assertEq(offset, base, expected)
  1169. class TestMonthEnd(Base):
  1170. _offset = MonthEnd
  1171. def test_offset(self):
  1172. tests = []
  1173. tests.append((MonthEnd(),
  1174. {datetime(2008, 1, 1): datetime(2008, 1, 31),
  1175. datetime(2008, 1, 31): datetime(2008, 2, 29),
  1176. datetime(2006, 12, 29): datetime(2006, 12, 31),
  1177. datetime(2006, 12, 31): datetime(2007, 1, 31),
  1178. datetime(2007, 1, 1): datetime(2007, 1, 31),
  1179. datetime(2006, 12, 1): datetime(2006, 12, 31)}))
  1180. tests.append((MonthEnd(0),
  1181. {datetime(2008, 1, 1): datetime(2008, 1, 31),
  1182. datetime(2008, 1, 31): datetime(2008, 1, 31),
  1183. datetime(2006, 12, 29): datetime(2006, 12, 31),
  1184. datetime(2006, 12, 31): datetime(2006, 12, 31),
  1185. datetime(2007, 1, 1): datetime(2007, 1, 31)}))
  1186. tests.append((MonthEnd(2),
  1187. {datetime(2008, 1, 1): datetime(2008, 2, 29),
  1188. datetime(2008, 1, 31): datetime(2008, 3, 31),
  1189. datetime(2006, 12, 29): datetime(2007, 1, 31),
  1190. datetime(2006, 12, 31): datetime(2007, 2, 28),
  1191. datetime(2007, 1, 1): datetime(2007, 2, 28),
  1192. datetime(2006, 11, 1): datetime(2006, 12, 31)}))
  1193. tests.append((MonthEnd(-1),
  1194. {datetime(2007, 1, 1): datetime(2006, 12, 31),
  1195. datetime(2008, 6, 30): datetime(2008, 5, 31),
  1196. datetime(2008, 12, 31): datetime(2008, 11, 30),
  1197. datetime(2006, 12, 29): datetime(2006, 11, 30),
  1198. datetime(2006, 12, 30): datetime(2006, 11, 30),
  1199. datetime(2007, 1, 1): datetime(2006, 12, 31)}))
  1200. for offset, cases in tests:
  1201. for base, expected in compat.iteritems(cases):
  1202. assertEq(offset, base, expected)
  1203. # def test_day_of_month(self):
  1204. # dt = datetime(2007, 1, 1)
  1205. # offset = MonthEnd(day=20)
  1206. # result = dt + offset
  1207. # self.assertEqual(result, datetime(2007, 1, 20))
  1208. # result = result + offset
  1209. # self.assertEqual(result, datetime(2007, 2, 20))
  1210. def test_normalize(self):
  1211. dt = datetime(2007, 1, 1, 3)
  1212. result = dt + MonthEnd(normalize=True)
  1213. expected = dt.replace(hour=0) + MonthEnd()
  1214. self.assertEqual(result, expected)
  1215. def test_onOffset(self):
  1216. tests = [(MonthEnd(), datetime(2007, 12, 31), True),
  1217. (MonthEnd(), datetime(2008, 1, 1), False)]
  1218. for offset, date, expected in tests:
  1219. assertOnOffset(offset, date, expected)
  1220. class TestBQuarterBegin(Base):
  1221. _offset = BQuarterBegin
  1222. def test_repr(self):
  1223. self.assertEqual(repr(BQuarterBegin()),"<BusinessQuarterBegin: startingMonth=3>")
  1224. self.assertEqual(repr(BQuarterBegin(startingMonth=3)), "<BusinessQuarterBegin: startingMonth=3>")
  1225. self.assertEqual(repr(BQuarterBegin(startingMonth=1)), "<BusinessQuarterBegin: startingMonth=1>")
  1226. def test_isAnchored(self):
  1227. self.assertTrue(BQuarterBegin(startingMonth=1).isAnchored())
  1228. self.assertTrue(BQuarterBegin().isAnchored())
  1229. self.assertFalse(BQuarterBegin(2, startingMonth=1).isAnchored())
  1230. def test_offset(self):
  1231. tests = []
  1232. tests.append((BQuarterBegin(startingMonth=1),
  1233. {datetime(2008, 1, 1): datetime(2008, 4, 1),
  1234. datetime(2008, 1, 31): datetime(2008, 4, 1),
  1235. datetime(2008, 2, 15): datetime(2008, 4, 1),
  1236. datetime(2008, 2, 29): datetime(2008, 4, 1),
  1237. datetime(2008, 3, 15): datetime(2008, 4, 1),
  1238. datetime(2008, 3, 31): datetime(2008, 4, 1),
  1239. datetime(2008, 4, 15): datetime(2008, 7, 1),
  1240. datetime(2007, 3, 15): datetime(2007, 4, 2),
  1241. datetime(2007, 2, 28): datetime(2007, 4, 2),
  1242. datetime(2007, 1, 1): datetime(2007, 4, 2),
  1243. datetime(2007, 4, 15): datetime(2007, 7, 2),
  1244. datetime(2007, 7, 1): datetime(2007, 7, 2),
  1245. datetime(2007, 4, 1): datetime(2007, 4, 2),
  1246. datetime(2007, 4, 2): datetime(2007, 7, 2),
  1247. datetime(2008, 4, 30): datetime(2008, 7, 1), }))
  1248. tests.append((BQuarterBegin(startingMonth=2),
  1249. {datetime(2008, 1, 1): datetime(2008, 2, 1),
  1250. datetime(2008, 1, 31): datetime(2008, 2, 1),
  1251. datetime(2008, 1, 15): datetime(2008, 2, 1),
  1252. datetime(2008, 2, 29): datetime(2008, 5, 1),
  1253. datetime(2008, 3, 15): datetime(2008, 5, 1),
  1254. datetime(2008, 3, 31): datetime(2008, 5, 1),
  1255. datetime(2008, 4, 15): datetime(2008, 5, 1),
  1256. datetime(2008, 8, 15): datetime(2008, 11, 3),
  1257. datetime(2008, 9, 15): datetime(2008, 11, 3),
  1258. datetime(2008, 11, 1): datetime(2008, 11, 3),
  1259. datetime(2008, 4, 30): datetime(2008, 5, 1), }))
  1260. tests.append((BQuarterBegin(startingMonth=1, n=0),
  1261. {datetime(2008, 1, 1): datetime(2008, 1, 1),
  1262. datetime(2007, 12, 31): datetime(2008, 1, 1),
  1263. datetime(2008, 2, 15): datetime(2008, 4, 1),
  1264. datetime(2008, 2, 29): datetime(2008, 4, 1),
  1265. datetime(2008, 1, 15): datetime(2008, 4, 1),
  1266. datetime(2008, 2, 27): datetime(2008, 4, 1),
  1267. datetime(2008, 3, 15): datetime(2008, 4, 1),
  1268. datetime(2007, 4, 1): datetime(2007, 4, 2),
  1269. datetime(2007, 4, 2): datetime(2007, 4, 2),
  1270. datetime(2007, 7, 1): datetime(2007, 7, 2),
  1271. datetime(2007, 4, 15): datetime(2007, 7, 2),
  1272. datetime(2007, 7, 2): datetime(2007, 7, 2), }))
  1273. tests.append((BQuarterBegin(startingMonth=1, n=-1),
  1274. {datetime(2008, 1, 1): datetime(2007, 10, 1),
  1275. datetime(2008, 1, 31): datetime(2008, 1, 1),
  1276. datetime(2008, 2, 15): datetime(2008, 1, 1),
  1277. datetime(2008, 2, 29): datetime(2008, 1, 1),
  1278. datetime(2008, 3, 15): datetime(2008, 1, 1),
  1279. datetime(2008, 3, 31): datetime(2008, 1, 1),
  1280. datetime(2008, 4, 15): datetime(2008, 4, 1),
  1281. datetime(2007, 7, 3): datetime(2007, 7, 2),
  1282. datetime(2007, 4, 3): datetime(2007, 4, 2),
  1283. datetime(2007, 7, 2): datetime(2007, 4, 2),
  1284. datetime(2008, 4, 1): datetime(2008, 1, 1), }))
  1285. tests.append((BQuarterBegin(startingMonth=1, n=2),
  1286. {datetime(2008, 1, 1): datetime(2008, 7, 1),
  1287. datetime(2008, 1, 15): datetime(2008, 7, 1),
  1288. datetime(2008, 2, 29): datetime(2008, 7, 1),
  1289. datetime(2008, 3, 15): datetime(2008, 7, 1),
  1290. datetime(2007, 3, 31): datetime(2007, 7, 2),
  1291. datetime(2007, 4, 15): datetime(2007, 10, 1),
  1292. datetime(2008, 4, 30): datetime(2008, 10, 1), }))
  1293. for offset, cases in tests:
  1294. for base, expected in compat.iteritems(cases):
  1295. assertEq(offset, base, expected)
  1296. # corner
  1297. offset = BQuarterBegin(n=-1, startingMonth=1)
  1298. self.assertEqual(datetime(2007, 4, 3) + offset, datetime(2007, 4, 2))
  1299. class TestBQuarterEnd(Base):
  1300. _offset = BQuarterEnd
  1301. def test_repr(self):
  1302. self.assertEqual(repr(BQuarterEnd()),"<BusinessQuarterEnd: startingMonth=3>")
  1303. self.assertEqual(repr(BQuarterEnd(startingMonth=3)), "<BusinessQuarterEnd: startingMonth=3>")
  1304. self.assertEqual(repr(BQuarterEnd(startingMonth=1)), "<BusinessQuarterEnd: startingMonth=1>")
  1305. def test_isAnchored(self):
  1306. self.assertTrue(BQuarterEnd(startingMonth=1).isAnchored())
  1307. self.assertTrue(BQuarterEnd().isAnchored())
  1308. self.assertFalse(BQuarterEnd(2, startingMonth=1).isAnchored())
  1309. def test_offset(self):
  1310. tests = []
  1311. tests.append((BQuarterEnd(startingMonth=1),
  1312. {datetime(2008, 1, 1): datetime(2008, 1, 31),
  1313. datetime(2008, 1, 31): datetime(2008, 4, 30),
  1314. datetime(2008, 2, 15): datetime(2008, 4, 30),
  1315. datetime(2008, 2, 29): datetime(2008, 4, 30),
  1316. datetime(2008, 3, 15): datetime(2008, 4, 30),
  1317. datetime(2008, 3, 31): datetime(2008, 4, 30),
  1318. datetime(2008, 4, 15): datetime(2008, 4, 30),
  1319. datetime(2008, 4, 30): datetime(2008, 7, 31), }))
  1320. tests.append((BQuarterEnd(startingMonth=2),
  1321. {datetime(2008, 1, 1): datetime(2008, 2, 29),
  1322. datetime(2008, 1, 31): datetime(2008, 2, 29),
  1323. datetime(2008, 2, 15): datetime(2008, 2, 29),
  1324. datetime(2008, 2, 29): datetime(2008, 5, 30),
  1325. datetime(2008, 3, 15): datetime(2008, 5, 30),
  1326. datetime(2008, 3, 31): datetime(2008, 5, 30),
  1327. datetime(2008, 4, 15): datetime(2008, 5, 30),
  1328. datetime(2008, 4, 30): datetime(2008, 5, 30), }))
  1329. tests.append((BQuarterEnd(startingMonth=1, n=0),
  1330. {datetime(2008, 1, 1): datetime(2008, 1, 31),
  1331. datetime(2008, 1, 31): datetime(2008, 1, 31),
  1332. datetime(2008, 2, 15): datetime(2008, 4, 30),
  1333. datetime(2008, 2, 29): datetime(2008, 4, 30),
  1334. datetime(2008, 3, 15): datetime(2008, 4, 30),
  1335. datetime(2008, 3, 31): datetime(2008, 4, 30),
  1336. datetime(2008, 4, 15): datetime(2008, 4, 30),
  1337. datetime(2008, 4, 30): datetime(2008, 4, 30), }))
  1338. tests.append((BQuarterEnd(startingMonth=1, n=-1),
  1339. {datetime(2008, 1, 1): datetime(2007, 10, 31),
  1340. datetime(2008, 1, 31): datetime(2007, 10, 31),
  1341. datetime(2008, 2, 15): datetime(2008, 1, 31),
  1342. datetime(2008, 2, 29): datetime(2008, 1, 31),
  1343. datetime(2008, 3, 15): datetime(2008, 1, 31),
  1344. datetime(2008, 3, 31): datetime(2008, 1, 31),
  1345. datetime(2008, 4, 15): datetime(2008, 1, 31),
  1346. datetime(2008, 4, 30): datetime(2008, 1, 31), }))
  1347. tests.append((BQuarterEnd(startingMonth=1, n=2),
  1348. {datetime(2008, 1, 31): datetime(2008, 7, 31),
  1349. datetime(2008, 2, 15): datetime(2008, 7, 31),
  1350. datetime(2008, 2, 29): datetime(2008, 7, 31),
  1351. datetime(2008, 3, 15): datetime(2008, 7, 31),
  1352. datetime(2008, 3, 31): datetime(2008, 7, 31),
  1353. datetime(2008, 4, 15): datetime(2008, 7, 31),
  1354. datetime(2008, 4, 30): datetime(2008, 10, 31), }))
  1355. for offset, cases in tests:
  1356. for base, expected in compat.iteritems(cases):
  1357. assertEq(offset, base, expected)
  1358. # corner
  1359. offset = BQuarterEnd(n=-1, startingMonth=1)
  1360. self.assertEqual(datetime(2010, 1, 31) + offset, datetime(2010, 1, 29))
  1361. def test_onOffset(self):
  1362. tests = [
  1363. (BQuarterEnd(1, startingMonth=1), datetime(2008, 1, 31), True),
  1364. (BQuarterEnd(1, startingMonth=1), datetime(2007, 12, 31), False),
  1365. (BQuarterEnd(1, startingMonth=1), datetime(2008, 2, 29), False),
  1366. (BQuarterEnd(1, startingMonth=1), datetime(2007, 3, 30), False),
  1367. (BQuarterEnd(1, startingMonth=1), datetime(2007, 3, 31), False),
  1368. (BQuarterEnd(1, startingMonth=1), datetime(2008, 4, 30), True),
  1369. (BQuarterEnd(1, startingMonth=1), datetime(2008, 5, 30), False),
  1370. (BQuarterEnd(1, startingMonth=1), datetime(2007, 6, 29), False),
  1371. (BQuarterEnd(1, startingMonth=1), datetime(2007, 6, 30), False),
  1372. (BQuarterEnd(1, startingMonth=2), datetime(2008, 1, 31), False),
  1373. (BQuarterEnd(1, startingMonth=2), datetime(2007, 12, 31), False),
  1374. (BQuarterEnd(1, startingMonth=2), datetime(2008, 2, 29), True),
  1375. (BQuarterEnd(1, startingMonth=2), datetime(2007, 3, 30), False),
  1376. (BQuarterEnd(1, startingMonth=2), datetime(2007, 3, 31), False),
  1377. (BQuarterEnd(1, startingMonth=2), datetime(2008, 4, 30), False),
  1378. (BQuarterEnd(1, startingMonth=2), datetime(2008, 5, 30), True),
  1379. (BQuarterEnd(1, startingMonth=2), datetime(2007, 6, 29), False),
  1380. (BQuarterEnd(1, startingMonth=2), datetime(2007, 6, 30), False),
  1381. (BQuarterEnd(1, startingMonth=3), datetime(2008, 1, 31), False),
  1382. (BQuarterEnd(1, startingMonth=3), datetime(2007, 12, 31), True),
  1383. (BQuarterEnd(1, startingMonth=3), datetime(2008, 2, 29), False),
  1384. (BQuarterEnd(1, startingMonth=3), datetime(2007, 3, 30), True),
  1385. (BQuarterEnd(1, startingMonth=3), datetime(2007, 3, 31), False),
  1386. (BQuarterEnd(1, startingMonth=3), datetime(2008, 4, 30), False),
  1387. (BQuarterEnd(1, startingMonth=3), datetime(2008, 5, 30), False),
  1388. (BQuarterEnd(1, startingMonth=3), datetime(2007, 6, 29), True),
  1389. (BQuarterEnd(1, startingMonth=3), datetime(2007, 6, 30), False),
  1390. ]
  1391. for offset, date, expected in tests:
  1392. assertOnOffset(offset, date, expected)
  1393. def makeFY5253LastOfMonthQuarter(*args, **kwds):
  1394. return FY5253Quarter(*args, variation="last", **kwds)
  1395. def makeFY5253NearestEndMonthQuarter(*args, **kwds):
  1396. return FY5253Quarter(*args, variation="nearest", **kwds)
  1397. def makeFY5253NearestEndMonth(*args, **kwds):
  1398. return FY5253(*args, variation="nearest", **kwds)
  1399. def makeFY5253LastOfMonth(*args, **kwds):
  1400. return FY5253(*args, variation="last", **kwds)
  1401. class TestFY5253LastOfMonth(Base):
  1402. def test_onOffset(self):
  1403. offset_lom_sat_aug = makeFY5253LastOfMonth(1, startingMonth=8, weekday=WeekDay.SAT)
  1404. offset_lom_sat_sep = makeFY5253LastOfMonth(1, startingMonth=9, weekday=WeekDay.SAT)
  1405. tests = [
  1406. #From Wikipedia (see: http://en.wikipedia.org/wiki/4%E2%80%934%E2%80%935_calendar#Last_Saturday_of_the_month_at_fiscal_year_end)
  1407. (offset_lom_sat_aug, datetime(2006, 8, 26), True),
  1408. (offset_lom_sat_aug, datetime(2007, 8, 25), True),
  1409. (offset_lom_sat_aug, datetime(2008, 8, 30), True),
  1410. (offset_lom_sat_aug, datetime(2009, 8, 29), True),
  1411. (offset_lom_sat_aug, datetime(2010, 8, 28), True),
  1412. (offset_lom_sat_aug, datetime(2011, 8, 27), True),
  1413. (offset_lom_sat_aug, datetime(2012, 8, 25), True),
  1414. (offset_lom_sat_aug, datetime(2013, 8, 31), True),
  1415. (offset_lom_sat_aug, datetime(2014, 8, 30), True),
  1416. (offset_lom_sat_aug, datetime(2015, 8, 29), True),
  1417. (offset_lom_sat_aug, datetime(2016, 8, 27), True),
  1418. (offset_lom_sat_aug, datetime(2017, 8, 26), True),
  1419. (offset_lom_sat_aug, datetime(2018, 8, 25), True),
  1420. (offset_lom_sat_aug, datetime(2019, 8, 31), True),
  1421. (offset_lom_sat_aug, datetime(2006, 8, 27), False),
  1422. (offset_lom_sat_aug, datetime(2007, 8, 28), False),
  1423. (offset_lom_sat_aug, datetime(2008, 8, 31), False),
  1424. (offset_lom_sat_aug, datetime(2009, 8, 30), False),
  1425. (offset_lom_sat_aug, datetime(2010, 8, 29), False),
  1426. (offset_lom_sat_aug, datetime(2011, 8, 28), False),
  1427. (offset_lom_sat_aug, datetime(2006, 8, 25), False),
  1428. (offset_lom_sat_aug, datetime(2007, 8, 24), False),
  1429. (offset_lom_sat_aug, datetime(2008, 8, 29), False),
  1430. (offset_lom_sat_aug, datetime(2009, 8, 28), False),
  1431. (offset_lom_sat_aug, datetime(2010, 8, 27), False),
  1432. (offset_lom_sat_aug, datetime(2011, 8, 26), False),
  1433. (offset_lom_sat_aug, datetime(2019, 8, 30), False),
  1434. #From GMCR (see for example: http://yahoo.brand.edgar-online.com/Default.aspx?companyid=3184&formtypeID=7)
  1435. (offset_lom_sat_sep, datetime(2010, 9, 25), True),
  1436. (offset_lom_sat_sep, datetime(2011, 9, 24), True),
  1437. (offset_lom_sat_sep, datetime(2012, 9, 29), True),
  1438. ]
  1439. for offset, date, expected in tests:
  1440. assertOnOffset(offset, date, expected)
  1441. def test_apply(self):
  1442. offset_lom_aug_sat = makeFY5253LastOfMonth(startingMonth=8, weekday=WeekDay.SAT)
  1443. offset_lom_aug_sat_1 = makeFY5253LastOfMonth(n=1, startingMonth=8, weekday=WeekDay.SAT)
  1444. date_seq_lom_aug_sat = [datetime(2006, 8, 26), datetime(2007, 8, 25),
  1445. datetime(2008, 8, 30), datetime(2009, 8, 29),
  1446. datetime(2010, 8, 28), datetime(2011, 8, 27),
  1447. datetime(2012, 8, 25), datetime(2013, 8, 31),
  1448. datetime(2014, 8, 30), datetime(2015, 8, 29),
  1449. datetime(2016, 8, 27)]
  1450. tests = [
  1451. (offset_lom_aug_sat, date_seq_lom_aug_sat),
  1452. (offset_lom_aug_sat_1, date_seq_lom_aug_sat),
  1453. (offset_lom_aug_sat, [datetime(2006, 8, 25)] + date_seq_lom_aug_sat),
  1454. (offset_lom_aug_sat_1, [datetime(2006, 8, 27)] + date_seq_lom_aug_sat[1:]),
  1455. (makeFY5253LastOfMonth(n=-1, startingMonth=8, weekday=WeekDay.SAT), list(reversed(date_seq_lom_aug_sat))),
  1456. ]
  1457. for test in tests:
  1458. offset, data = test
  1459. current = data[0]
  1460. for datum in data[1:]:
  1461. current = current + offset
  1462. self.assertEqual(current, datum)
  1463. class TestFY5253NearestEndMonth(Base):
  1464. def test_get_target_month_end(self):
  1465. self.assertEqual(makeFY5253NearestEndMonth(startingMonth=8, weekday=WeekDay.SAT).get_target_month_end(datetime(2013,1,1)), datetime(2013,8,31))
  1466. self.assertEqual(makeFY5253NearestEndMonth(startingMonth=12, weekday=WeekDay.SAT).get_target_month_end(datetime(2013,1,1)), datetime(2013,12,31))
  1467. self.assertEqual(makeFY5253NearestEndMonth(startingMonth=2, weekday=WeekDay.SAT).get_target_month_end(datetime(2013,1,1)), datetime(2013,2,28))
  1468. def test_get_year_end(self):
  1469. self.assertEqual(makeFY5253NearestEndMonth(startingMonth=8, weekday=WeekDay.SAT).get_year_end(datetime(2013,1,1)), datetime(2013,8,31))
  1470. self.assertEqual(makeFY5253NearestEndMonth(startingMonth=8, weekday=WeekDay.SUN).get_year_end(datetime(2013,1,1)), datetime(2013,9,1))
  1471. self.assertEqual(makeFY5253NearestEndMonth(startingMonth=8, weekday=WeekDay.FRI).get_year_end(datetime(2013,1,1)), datetime(2013,8,30))
  1472. offset_n = FY5253(weekday=WeekDay.TUE, startingMonth=12,
  1473. variation="nearest")
  1474. self.assertEqual(offset_n.get_year_end(datetime(2012,1,1)), datetime(2013,1,1))
  1475. self.assertEqual(offset_n.get_year_end(datetime(2012,1,10)), datetime(2013,1,1))
  1476. self.assertEqual(offset_n.get_year_end(datetime(2013,1,1)), datetime(2013,12,31))
  1477. self.assertEqual(offset_n.get_year_end(datetime(2013,1,2)), datetime(2013,12,31))
  1478. self.assertEqual(offset_n.get_year_end(datetime(2013,1,3)), datetime(2013,12,31))
  1479. self.assertEqual(offset_n.get_year_end(datetime(2013,1,10)), datetime(2013,12,31))
  1480. JNJ = FY5253(n=1, startingMonth=12, weekday=6, variation="nearest")
  1481. self.assertEqual(JNJ.get_year_end(datetime(2006, 1, 1)), datetime(2006, 12, 31))
  1482. def test_onOffset(self):
  1483. offset_lom_aug_sat = makeFY5253NearestEndMonth(1, startingMonth=8, weekday=WeekDay.SAT)
  1484. offset_lom_aug_thu = makeFY5253NearestEndMonth(1, startingMonth=8, weekday=WeekDay.THU)
  1485. offset_n = FY5253(weekday=WeekDay.TUE, startingMonth=12,
  1486. variation="nearest")
  1487. tests = [
  1488. # From Wikipedia (see: http://en.wikipedia.org/wiki/4%E2%80%934%E2%80%935_calendar#Saturday_nearest_the_end_of_month)
  1489. # 2006-09-02 2006 September 2
  1490. # 2007-09-01 2007 September 1
  1491. # 2008-08-30 2008 August 30 (leap year)
  1492. # 2009-08-29 2009 August 29
  1493. # 2010-08-28 2010 August 28
  1494. # 2011-09-03 2011 September 3
  1495. # 2012-09-01 2012 September 1 (leap year)
  1496. # 2013-08-31 2013 August 31
  1497. # 2014-08-30 2014 August 30
  1498. # 2015-08-29 2015 August 29
  1499. # 2016-09-03 2016 September 3 (leap year)
  1500. # 2017-09-02 2017 September 2
  1501. # 2018-09-01 2018 September 1
  1502. # 2019-08-31 2019 August 31
  1503. (offset_lom_aug_sat, datetime(2006, 9, 2), True),
  1504. (offset_lom_aug_sat, datetime(2007, 9, 1), True),
  1505. (offset_lom_aug_sat, datetime(2008, 8, 30), True),
  1506. (offset_lom_aug_sat, datetime(2009, 8, 29), True),
  1507. (offset_lom_aug_sat, datetime(2010, 8, 28), True),
  1508. (offset_lom_aug_sat, datetime(2011, 9, 3), True),
  1509. (offset_lom_aug_sat, datetime(2016, 9, 3), True),
  1510. (offset_lom_aug_sat, datetime(2017, 9, 2), True),
  1511. (offset_lom_aug_sat, datetime(2018, 9, 1), True),
  1512. (offset_lom_aug_sat, datetime(2019, 8, 31), True),
  1513. (offset_lom_aug_sat, datetime(2006, 8, 27), False),
  1514. (offset_lom_aug_sat, datetime(2007, 8, 28), False),
  1515. (offset_lom_aug_sat, datetime(2008, 8, 31), False),
  1516. (offset_lom_aug_sat, datetime(2009, 8, 30), False),
  1517. (offset_lom_aug_sat, datetime(2010, 8, 29), False),
  1518. (offset_lom_aug_sat, datetime(2011, 8, 28), False),
  1519. (offset_lom_aug_sat, datetime(2006, 8, 25), False),
  1520. (offset_lom_aug_sat, datetime(2007, 8, 24), False),
  1521. (offset_lom_aug_sat, datetime(2008, 8, 29), False),
  1522. (offset_lom_aug_sat, datetime(2009, 8, 28), False),
  1523. (offset_lom_aug_sat, datetime(2010, 8, 27), False),
  1524. (offset_lom_aug_sat, datetime(2011, 8, 26), False),
  1525. (offset_lom_aug_sat, datetime(2019, 8, 30), False),
  1526. #From Micron, see: http://google.brand.edgar-online.com/?sym=MU&formtypeID=7
  1527. (offset_lom_aug_thu, datetime(2012, 8, 30), True),
  1528. (offset_lom_aug_thu, datetime(2011, 9, 1), True),
  1529. (offset_n, datetime(2012, 12, 31), False),
  1530. (offset_n, datetime(2013, 1, 1), True),
  1531. (offset_n, datetime(2013, 1, 2), False),
  1532. ]
  1533. for offset, date, expected in tests:
  1534. assertOnOffset(offset, date, expected)
  1535. def test_apply(self):
  1536. date_seq_nem_8_sat = [datetime(2006, 9, 2), datetime(2007, 9, 1),
  1537. datetime(2008, 8, 30), datetime(2009, 8, 29),
  1538. datetime(2010, 8, 28), datetime(2011, 9, 3)]
  1539. JNJ = [datetime(2005, 1, 2), datetime(2006, 1, 1),
  1540. datetime(2006, 12, 31), datetime(2007, 12, 30),
  1541. datetime(2008, 12, 28), datetime(2010, 1, 3),
  1542. datetime(2011, 1, 2), datetime(2012, 1, 1),
  1543. datetime(2012, 12, 30)]
  1544. DEC_SAT = FY5253(n=-1, startingMonth=12, weekday=5, variation="nearest")
  1545. tests = [
  1546. (makeFY5253NearestEndMonth(startingMonth=8, weekday=WeekDay.SAT), date_seq_nem_8_sat),
  1547. (makeFY5253NearestEndMonth(n=1, startingMonth=8, weekday=WeekDay.SAT), date_seq_nem_8_sat),
  1548. (makeFY5253NearestEndMonth(startingMonth=8, weekday=WeekDay.SAT), [datetime(2006, 9, 1)] + date_seq_nem_8_sat),
  1549. (makeFY5253NearestEndMonth(n=1, startingMonth=8, weekday=WeekDay.SAT), [datetime(2006, 9, 3)] + date_seq_nem_8_sat[1:]),
  1550. (makeFY5253NearestEndMonth(n=-1, startingMonth=8, weekday=WeekDay.SAT), list(reversed(date_seq_nem_8_sat))),
  1551. (makeFY5253NearestEndMonth(n=1, startingMonth=12, weekday=WeekDay.SUN), JNJ),
  1552. (makeFY5253NearestEndMonth(n=-1, startingMonth=12, weekday=WeekDay.SUN), list(reversed(JNJ))),
  1553. (makeFY5253NearestEndMonth(n=1, startingMonth=12, weekday=WeekDay.SUN), [datetime(2005,1,2), datetime(2006, 1, 1)]),
  1554. (makeFY5253NearestEndMonth(n=1, startingMonth=12, weekday=WeekDay.SUN), [datetime(2006,1,2), datetime(2006, 12, 31)]),
  1555. (DEC_SAT, [datetime(2013,1,15), datetime(2012,12,29)])
  1556. ]
  1557. for test in tests:
  1558. offset, data = test
  1559. current = data[0]
  1560. for datum in data[1:]:
  1561. current = current + offset
  1562. self.assertEqual(current, datum)
  1563. class TestFY5253LastOfMonthQuarter(Base):
  1564. def test_isAnchored(self):
  1565. self.assertTrue(makeFY5253LastOfMonthQuarter(startingMonth=1, weekday=WeekDay.SAT, qtr_with_extra_week=4).isAnchored())
  1566. self.assertTrue(makeFY5253LastOfMonthQuarter(weekday=WeekDay.SAT, startingMonth=3, qtr_with_extra_week=4).isAnchored())
  1567. self.assertFalse(makeFY5253LastOfMonthQuarter(2, startingMonth=1, weekday=WeekDay.SAT, qtr_with_extra_week=4).isAnchored())
  1568. def test_equality(self):
  1569. self.assertEqual(makeFY5253LastOfMonthQuarter(startingMonth=1, weekday=WeekDay.SAT, qtr_with_extra_week=4), makeFY5253LastOfMonthQuarter(startingMonth=1, weekday=WeekDay.SAT, qtr_with_extra_week=4))
  1570. self.assertNotEqual(makeFY5253LastOfMonthQuarter(startingMonth=1, weekday=WeekDay.SAT, qtr_with_extra_week=4), makeFY5253LastOfMonthQuarter(startingMonth=1, weekday=WeekDay.SUN, qtr_with_extra_week=4))
  1571. self.assertNotEqual(makeFY5253LastOfMonthQuarter(startingMonth=1, weekday=WeekDay.SAT, qtr_with_extra_week=4), makeFY5253LastOfMonthQuarter(startingMonth=2, weekday=WeekDay.SAT, qtr_with_extra_week=4))
  1572. def test_offset(self):
  1573. offset = makeFY5253LastOfMonthQuarter(1, startingMonth=9, weekday=WeekDay.SAT, qtr_with_extra_week=4)
  1574. offset2 = makeFY5253LastOfMonthQuarter(2, startingMonth=9, weekday=WeekDay.SAT, qtr_with_extra_week=4)
  1575. offset4 = makeFY5253LastOfMonthQuarter(4, startingMonth=9, weekday=WeekDay.SAT, qtr_with_extra_week=4)
  1576. offset_neg1 = makeFY5253LastOfMonthQuarter(-1, startingMonth=9, weekday=WeekDay.SAT, qtr_with_extra_week=4)
  1577. offset_neg2 = makeFY5253LastOfMonthQuarter(-2, startingMonth=9, weekday=WeekDay.SAT, qtr_with_extra_week=4)
  1578. GMCR = [datetime(2010, 3, 27),
  1579. datetime(2010, 6, 26),
  1580. datetime(2010, 9, 25),
  1581. datetime(2010, 12, 25),
  1582. datetime(2011, 3, 26),
  1583. datetime(2011, 6, 25),
  1584. datetime(2011, 9, 24),
  1585. datetime(2011, 12, 24),
  1586. datetime(2012, 3, 24),
  1587. datetime(2012, 6, 23),
  1588. datetime(2012, 9, 29),
  1589. datetime(2012, 12, 29),
  1590. datetime(2013, 3, 30),
  1591. datetime(2013, 6, 29)]
  1592. assertEq(offset, base=GMCR[0], expected=GMCR[1])
  1593. assertEq(offset, base=GMCR[0] + relativedelta(days=-1), expected=GMCR[0])
  1594. assertEq(offset, base=GMCR[1], expected=GMCR[2])
  1595. assertEq(offset2, base=GMCR[0], expected=GMCR[2])
  1596. assertEq(offset4, base=GMCR[0], expected=GMCR[4])
  1597. assertEq(offset_neg1, base=GMCR[-1], expected=GMCR[-2])
  1598. assertEq(offset_neg1, base=GMCR[-1] + relativedelta(days=+1), expected=GMCR[-1])
  1599. assertEq(offset_neg2, base=GMCR[-1], expected=GMCR[-3])
  1600. date = GMCR[0] + relativedelta(days=-1)
  1601. for expected in GMCR:
  1602. assertEq(offset, date, expected)
  1603. date = date + offset
  1604. date = GMCR[-1] + relativedelta(days=+1)
  1605. for expected in reversed(GMCR):
  1606. assertEq(offset_neg1, date, expected)
  1607. date = date + offset_neg1
  1608. def test_onOffset(self):
  1609. lomq_aug_sat_4 = makeFY5253LastOfMonthQuarter(1, startingMonth=8, weekday=WeekDay.SAT, qtr_with_extra_week=4)
  1610. lomq_sep_sat_4 = makeFY5253LastOfMonthQuarter(1, startingMonth=9, weekday=WeekDay.SAT, qtr_with_extra_week=4)
  1611. tests = [
  1612. #From Wikipedia
  1613. (lomq_aug_sat_4, datetime(2006, 8, 26), True),
  1614. (lomq_aug_sat_4, datetime(2007, 8, 25), True),
  1615. (lomq_aug_sat_4, datetime(2008, 8, 30), True),
  1616. (lomq_aug_sat_4, datetime(2009, 8, 29), True),
  1617. (lomq_aug_sat_4, datetime(2010, 8, 28), True),
  1618. (lomq_aug_sat_4, datetime(2011, 8, 27), True),
  1619. (lomq_aug_sat_4, datetime(2019, 8, 31), True),
  1620. (lomq_aug_sat_4, datetime(2006, 8, 27), False),
  1621. (lomq_aug_sat_4, datetime(2007, 8, 28), False),
  1622. (lomq_aug_sat_4, datetime(2008, 8, 31), False),
  1623. (lomq_aug_sat_4, datetime(2009, 8, 30), False),
  1624. (lomq_aug_sat_4, datetime(2010, 8, 29), False),
  1625. (lomq_aug_sat_4, datetime(2011, 8, 28), False),
  1626. (lomq_aug_sat_4, datetime(2006, 8, 25), False),
  1627. (lomq_aug_sat_4, datetime(2007, 8, 24), False),
  1628. (lomq_aug_sat_4, datetime(2008, 8, 29), False),
  1629. (lomq_aug_sat_4, datetime(2009, 8, 28), False),
  1630. (lomq_aug_sat_4, datetime(2010, 8, 27), False),
  1631. (lomq_aug_sat_4, datetime(2011, 8, 26), False),
  1632. (lomq_aug_sat_4, datetime(2019, 8, 30), False),
  1633. #From GMCR
  1634. (lomq_sep_sat_4, datetime(2010, 9, 25), True),
  1635. (lomq_sep_sat_4, datetime(2011, 9, 24), True),
  1636. (lomq_sep_sat_4, datetime(2012, 9, 29), True),
  1637. (lomq_sep_sat_4, datetime(2013, 6, 29), True),
  1638. (lomq_sep_sat_4, datetime(2012, 6, 23), True),
  1639. (lomq_sep_sat_4, datetime(2012, 6, 30), False),
  1640. (lomq_sep_sat_4, datetime(2013, 3, 30), True),
  1641. (lomq_sep_sat_4, datetime(2012, 3, 24), True),
  1642. (lomq_sep_sat_4, datetime(2012, 12, 29), True),
  1643. (lomq_sep_sat_4, datetime(2011, 12, 24), True),
  1644. #INTC (extra week in Q1)
  1645. #See: http://www.intc.com/releasedetail.cfm?ReleaseID=542844
  1646. (makeFY5253LastOfMonthQuarter(1, startingMonth=12, weekday=WeekDay.SAT, qtr_with_extra_week=1), datetime(2011, 4, 2), True),
  1647. #see: http://google.brand.edgar-online.com/?sym=INTC&formtypeID=7
  1648. (makeFY5253LastOfMonthQuarter(1, startingMonth=12, weekday=WeekDay.SAT, qtr_with_extra_week=1), datetime(2012, 12, 29), True),
  1649. (makeFY5253LastOfMonthQuarter(1, startingMonth=12, weekday=WeekDay.SAT, qtr_with_extra_week=1), datetime(2011, 12, 31), True),
  1650. (makeFY5253LastOfMonthQuarter(1, startingMonth=12, weekday=WeekDay.SAT, qtr_with_extra_week=1), datetime(2010, 12, 25), True),
  1651. ]
  1652. for offset, date, expected in tests:
  1653. assertOnOffset(offset, date, expected)
  1654. def test_year_has_extra_week(self):
  1655. #End of long Q1
  1656. self.assertTrue(makeFY5253LastOfMonthQuarter(1, startingMonth=12, weekday=WeekDay.SAT, qtr_with_extra_week=1).year_has_extra_week(datetime(2011, 4, 2)))
  1657. #Start of long Q1
  1658. self.assertTrue(makeFY5253LastOfMonthQuarter(1, startingMonth=12, weekday=WeekDay.SAT, qtr_with_extra_week=1).year_has_extra_week(datetime(2010, 12, 26)))
  1659. #End of year before year with long Q1
  1660. self.assertFalse(makeFY5253LastOfMonthQuarter(1, startingMonth=12, weekday=WeekDay.SAT, qtr_with_extra_week=1).year_has_extra_week(datetime(2010, 12, 25)))
  1661. for year in [x for x in range(1994, 2011+1) if x not in [2011, 2005, 2000, 1994]]:
  1662. self.assertFalse(makeFY5253LastOfMonthQuarter(1, startingMonth=12, weekday=WeekDay.SAT, qtr_with_extra_week=1).year_has_extra_week(datetime(year, 4, 2)))
  1663. #Other long years
  1664. self.assertTrue(makeFY5253LastOfMonthQuarter(1, startingMonth=12, weekday=WeekDay.SAT, qtr_with_extra_week=1).year_has_extra_week(datetime(2005, 4, 2)))
  1665. self.assertTrue(makeFY5253LastOfMonthQuarter(1, startingMonth=12, weekday=WeekDay.SAT, qtr_with_extra_week=1).year_has_extra_week(datetime(2000, 4, 2)))
  1666. self.assertTrue(makeFY5253LastOfMonthQuarter(1, startingMonth=12, weekday=WeekDay.SAT, qtr_with_extra_week=1).year_has_extra_week(datetime(1994, 4, 2)))
  1667. def test_get_weeks(self):
  1668. sat_dec_1 = makeFY5253LastOfMonthQuarter(1, startingMonth=12, weekday=WeekDay.SAT, qtr_with_extra_week=1)
  1669. sat_dec_4 = makeFY5253LastOfMonthQuarter(1, startingMonth=12, weekday=WeekDay.SAT, qtr_with_extra_week=4)
  1670. self.assertEqual(sat_dec_1.get_weeks(datetime(2011, 4, 2)), [14, 13, 13, 13])
  1671. self.assertEqual(sat_dec_4.get_weeks(datetime(2011, 4, 2)), [13, 13, 13, 14])
  1672. self.assertEqual(sat_dec_1.get_weeks(datetime(2010, 12, 25)), [13, 13, 13, 13])
  1673. class TestFY5253NearestEndMonthQuarter(Base):
  1674. def test_onOffset(self):
  1675. offset_nem_sat_aug_4 = makeFY5253NearestEndMonthQuarter(1, startingMonth=8, weekday=WeekDay.SAT, qtr_with_extra_week=4)
  1676. offset_nem_thu_aug_4 = makeFY5253NearestEndMonthQuarter(1, startingMonth=8, weekday=WeekDay.THU, qtr_with_extra_week=4)
  1677. offset_n = FY5253(weekday=WeekDay.TUE, startingMonth=12,
  1678. variation="nearest", qtr_with_extra_week=4)
  1679. tests = [
  1680. #From Wikipedia
  1681. (offset_nem_sat_aug_4, datetime(2006, 9, 2), True),
  1682. (offset_nem_sat_aug_4, datetime(2007, 9, 1), True),
  1683. (offset_nem_sat_aug_4, datetime(2008, 8, 30), True),
  1684. (offset_nem_sat_aug_4, datetime(2009, 8, 29), True),
  1685. (offset_nem_sat_aug_4, datetime(2010, 8, 28), True),
  1686. (offset_nem_sat_aug_4, datetime(2011, 9, 3), True),
  1687. (offset_nem_sat_aug_4, datetime(2016, 9, 3), True),
  1688. (offset_nem_sat_aug_4, datetime(2017, 9, 2), True),
  1689. (offset_nem_sat_aug_4, datetime(2018, 9, 1), True),
  1690. (offset_nem_sat_aug_4, datetime(2019, 8, 31), True),
  1691. (offset_nem_sat_aug_4, datetime(2006, 8, 27), False),
  1692. (offset_nem_sat_aug_4, datetime(2007, 8, 28), False),
  1693. (offset_nem_sat_aug_4, datetime(2008, 8, 31), False),
  1694. (offset_nem_sat_aug_4, datetime(2009, 8, 30), False),
  1695. (offset_nem_sat_aug_4, datetime(2010, 8, 29), False),
  1696. (offset_nem_sat_aug_4, datetime(2011, 8, 28), False),
  1697. (offset_nem_sat_aug_4, datetime(2006, 8, 25), False),
  1698. (offset_nem_sat_aug_4, datetime(2007, 8, 24), False),
  1699. (offset_nem_sat_aug_4, datetime(2008, 8, 29), False),
  1700. (offset_nem_sat_aug_4, datetime(2009, 8, 28), False),
  1701. (offset_nem_sat_aug_4, datetime(2010, 8, 27), False),
  1702. (offset_nem_sat_aug_4, datetime(2011, 8, 26), False),
  1703. (offset_nem_sat_aug_4, datetime(2019, 8, 30), False),
  1704. #From Micron, see: http://google.brand.edgar-online.com/?sym=MU&formtypeID=7
  1705. (offset_nem_thu_aug_4, datetime(2012, 8, 30), True),
  1706. (offset_nem_thu_aug_4, datetime(2011, 9, 1), True),
  1707. #See: http://google.brand.edgar-online.com/?sym=MU&formtypeID=13
  1708. (offset_nem_thu_aug_4, datetime(2013, 5, 30), True),
  1709. (offset_nem_thu_aug_4, datetime(2013, 2, 28), True),
  1710. (offset_nem_thu_aug_4, datetime(2012, 11, 29), True),
  1711. (offset_nem_thu_aug_4, datetime(2012, 5, 31), True),
  1712. (offset_nem_thu_aug_4, datetime(2007, 3, 1), True),
  1713. (offset_nem_thu_aug_4, datetime(1994, 3, 3), True),
  1714. (offset_n, datetime(2012, 12, 31), False),
  1715. (offset_n, datetime(2013, 1, 1), True),
  1716. (offset_n, datetime(2013, 1, 2), False)
  1717. ]
  1718. for offset, date, expected in tests:
  1719. assertOnOffset(offset, date, expected)
  1720. def test_offset(self):
  1721. offset = makeFY5253NearestEndMonthQuarter(1, startingMonth=8, weekday=WeekDay.THU, qtr_with_extra_week=4)
  1722. MU = [datetime(2012, 5, 31), datetime(2012, 8, 30), datetime(2012, 11, 29), datetime(2013, 2, 28), datetime(2013, 5, 30)]
  1723. date = MU[0] + relativedelta(days=-1)
  1724. for expected in MU:
  1725. assertEq(offset, date, expected)
  1726. date = date + offset
  1727. assertEq(offset, datetime(2012, 5, 31), datetime(2012, 8, 30))
  1728. assertEq(offset, datetime(2012, 5, 30), datetime(2012, 5, 31))
  1729. offset2 = FY5253Quarter(weekday=5, startingMonth=12,
  1730. variation="last", qtr_with_extra_week=4)
  1731. assertEq(offset2, datetime(2013,1,15), datetime(2013, 3, 30))
  1732. class TestQuarterBegin(Base):
  1733. def test_repr(self):
  1734. self.assertEqual(repr(QuarterBegin()), "<QuarterBegin: startingMonth=3>")
  1735. self.assertEqual(repr(QuarterBegin(startingMonth=3)), "<QuarterBegin: startingMonth=3>")
  1736. self.assertEqual(repr(QuarterBegin(startingMonth=1)),"<QuarterBegin: startingMonth=1>")
  1737. def test_isAnchored(self):
  1738. self.assertTrue(QuarterBegin(startingMonth=1).isAnchored())
  1739. self.assertTrue(QuarterBegin().isAnchored())
  1740. self.assertFalse(QuarterBegin(2, startingMonth=1).isAnchored())
  1741. def test_offset(self):
  1742. tests = []
  1743. tests.append((QuarterBegin(startingMonth=1),
  1744. {datetime(2007, 12, 1): datetime(2008, 1, 1),
  1745. datetime(2008, 1, 1): datetime(2008, 4, 1),
  1746. datetime(2008, 2, 15): datetime(2008, 4, 1),
  1747. datetime(2008, 2, 29): datetime(2008, 4, 1),
  1748. datetime(2008, 3, 15): datetime(2008, 4, 1),
  1749. datetime(2008, 3, 31): datetime(2008, 4, 1),
  1750. datetime(2008, 4, 15): datetime(2008, 7, 1),
  1751. datetime(2008, 4, 1): datetime(2008, 7, 1), }))
  1752. tests.append((QuarterBegin(startingMonth=2),
  1753. {datetime(2008, 1, 1): datetime(2008, 2, 1),
  1754. datetime(2008, 1, 31): datetime(2008, 2, 1),
  1755. datetime(2008, 1, 15): datetime(2008, 2, 1),
  1756. datetime(2008, 2, 29): datetime(2008, 5, 1),
  1757. datetime(2008, 3, 15): datetime(2008, 5, 1),
  1758. datetime(2008, 3, 31): datetime(2008, 5, 1),
  1759. datetime(2008, 4, 15): datetime(2008, 5, 1),
  1760. datetime(2008, 4, 30): datetime(2008, 5, 1), }))
  1761. tests.append((QuarterBegin(startingMonth=1, n=0),
  1762. {datetime(2008, 1, 1): datetime(2008, 1, 1),
  1763. datetime(2008, 12, 1): datetime(2009, 1, 1),
  1764. datetime(2008, 1, 1): datetime(2008, 1, 1),
  1765. datetime(2008, 2, 15): datetime(2008, 4, 1),
  1766. datetime(2008, 2, 29): datetime(2008, 4, 1),
  1767. datetime(2008, 3, 15): datetime(2008, 4, 1),
  1768. datetime(2008, 3, 31): datetime(2008, 4, 1),
  1769. datetime(2008, 4, 15): datetime(2008, 4, 1),
  1770. datetime(2008, 4, 30): datetime(2008, 4, 1), }))
  1771. tests.append((QuarterBegin(startingMonth=1, n=-1),
  1772. {datetime(2008, 1, 1): datetime(2007, 10, 1),
  1773. datetime(2008, 1, 31): datetime(2008, 1, 1),
  1774. datetime(2008, 2, 15): datetime(2008, 1, 1),
  1775. datetime(2008, 2, 29): datetime(2008, 1, 1),
  1776. datetime(2008, 3, 15): datetime(2008, 1, 1),
  1777. datetime(2008, 3, 31): datetime(2008, 1, 1),
  1778. datetime(2008, 4, 15): datetime(2008, 4, 1),
  1779. datetime(2008, 4, 30): datetime(2008, 4, 1),
  1780. datetime(2008, 7, 1): datetime(2008, 4, 1)}))
  1781. tests.append((QuarterBegin(startingMonth=1, n=2),
  1782. {datetime(2008, 1, 1): datetime(2008, 7, 1),
  1783. datetime(2008, 2, 15): datetime(2008, 7, 1),
  1784. datetime(2008, 2, 29): datetime(2008, 7, 1),
  1785. datetime(2008, 3, 15): datetime(2008, 7, 1),
  1786. datetime(2008, 3, 31): datetime(2008, 7, 1),
  1787. datetime(2008, 4, 15): datetime(2008, 10, 1),
  1788. datetime(2008, 4, 1): datetime(2008, 10, 1), }))
  1789. for offset, cases in tests:
  1790. for base, expected in compat.iteritems(cases):
  1791. assertEq(offset, base, expected)
  1792. # corner
  1793. offset = QuarterBegin(n=-1, startingMonth=1)
  1794. self.assertEqual(datetime(2010, 2, 1) + offset, datetime(2010, 1, 1))
  1795. class TestQuarterEnd(Base):
  1796. _offset = QuarterEnd
  1797. def test_repr(self):
  1798. self.assertEqual(repr(QuarterEnd()), "<QuarterEnd: startingMonth=3>")
  1799. self.assertEqual(repr(QuarterEnd(startingMonth=3)), "<QuarterEnd: startingMonth=3>")
  1800. self.assertEqual(repr(QuarterEnd(startingMonth=1)), "<QuarterEnd: startingMonth=1>")
  1801. def test_isAnchored(self):
  1802. self.assertTrue(QuarterEnd(startingMonth=1).isAnchored())
  1803. self.assertTrue(QuarterEnd().isAnchored())
  1804. self.assertFalse(QuarterEnd(2, startingMonth=1).isAnchored())
  1805. def test_offset(self):
  1806. tests = []
  1807. tests.append((QuarterEnd(startingMonth=1),
  1808. {datetime(2008, 1, 1): datetime(2008, 1, 31),
  1809. datetime(2008, 1, 31): datetime(2008, 4, 30),
  1810. datetime(2008, 2, 15): datetime(2008, 4, 30),
  1811. datetime(2008, 2, 29): datetime(2008, 4, 30),
  1812. datetime(2008, 3, 15): datetime(2008, 4, 30),
  1813. datetime(2008, 3, 31): datetime(2008, 4, 30),
  1814. datetime(2008, 4, 15): datetime(2008, 4, 30),
  1815. datetime(2008, 4, 30): datetime(2008, 7, 31), }))
  1816. tests.append((QuarterEnd(startingMonth=2),
  1817. {datetime(2008, 1, 1): datetime(2008, 2, 29),
  1818. datetime(2008, 1, 31): datetime(2008, 2, 29),
  1819. datetime(2008, 2, 15): datetime(2008, 2, 29),
  1820. datetime(2008, 2, 29): datetime(2008, 5, 31),
  1821. datetime(2008, 3, 15): datetime(2008, 5, 31),
  1822. datetime(2008, 3, 31): datetime(2008, 5, 31),
  1823. datetime(2008, 4, 15): datetime(2008, 5, 31),
  1824. datetime(2008, 4, 30): datetime(2008, 5, 31), }))
  1825. tests.append((QuarterEnd(startingMonth=1, n=0),
  1826. {datetime(2008, 1, 1): datetime(2008, 1, 31),
  1827. datetime(2008, 1, 31): datetime(2008, 1, 31),
  1828. datetime(2008, 2, 15): datetime(2008, 4, 30),
  1829. datetime(2008, 2, 29): datetime(2008, 4, 30),
  1830. datetime(2008, 3, 15): datetime(2008, 4, 30),
  1831. datetime(2008, 3, 31): datetime(2008, 4, 30),
  1832. datetime(2008, 4, 15): datetime(2008, 4, 30),
  1833. datetime(2008, 4, 30): datetime(2008, 4, 30), }))
  1834. tests.append((QuarterEnd(startingMonth=1, n=-1),
  1835. {datetime(2008, 1, 1): datetime(2007, 10, 31),
  1836. datetime(2008, 1, 31): datetime(2007, 10, 31),
  1837. datetime(2008, 2, 15): datetime(2008, 1, 31),
  1838. datetime(2008, 2, 29): datetime(2008, 1, 31),
  1839. datetime(2008, 3, 15): datetime(2008, 1, 31),
  1840. datetime(2008, 3, 31): datetime(2008, 1, 31),
  1841. datetime(2008, 4, 15): datetime(2008, 1, 31),
  1842. datetime(2008, 4, 30): datetime(2008, 1, 31),
  1843. datetime(2008, 7, 1): datetime(2008, 4, 30)}))
  1844. tests.append((QuarterEnd(startingMonth=1, n=2),
  1845. {datetime(2008, 1, 31): datetime(2008, 7, 31),
  1846. datetime(2008, 2, 15): datetime(2008, 7, 31),
  1847. datetime(2008, 2, 29): datetime(2008, 7, 31),
  1848. datetime(2008, 3, 15): datetime(2008, 7, 31),
  1849. datetime(2008, 3, 31): datetime(2008, 7, 31),
  1850. datetime(2008, 4, 15): datetime(2008, 7, 31),
  1851. datetime(2008, 4, 30): datetime(2008, 10, 31), }))
  1852. for offset, cases in tests:
  1853. for base, expected in compat.iteritems(cases):
  1854. assertEq(offset, base, expected)
  1855. # corner
  1856. offset = QuarterEnd(n=-1, startingMonth=1)
  1857. self.assertEqual(datetime(2010, 2, 1) + offset, datetime(2010, 1, 31))
  1858. def test_onOffset(self):
  1859. tests = [(QuarterEnd(1, startingMonth=1), datetime(2008, 1, 31), True),
  1860. (QuarterEnd(
  1861. 1, startingMonth=1), datetime(2007, 12, 31), False),
  1862. (QuarterEnd(
  1863. 1, startingMonth=1), datetime(2008, 2, 29), False),
  1864. (QuarterEnd(
  1865. 1, startingMonth=1), datetime(2007, 3, 30), False),
  1866. (QuarterEnd(
  1867. 1, startingMonth=1), datetime(2007, 3, 31), False),
  1868. (QuarterEnd(1, startingMonth=1), datetime(2008, 4, 30), True),
  1869. (QuarterEnd(
  1870. 1, startingMonth=1), datetime(2008, 5, 30), False),
  1871. (QuarterEnd(
  1872. 1, startingMonth=1), datetime(2008, 5, 31), False),
  1873. (QuarterEnd(
  1874. 1, startingMonth=1), datetime(2007, 6, 29), False),
  1875. (QuarterEnd(
  1876. 1, startingMonth=1), datetime(2007, 6, 30), False),
  1877. (QuarterEnd(
  1878. 1, startingMonth=2), datetime(2008, 1, 31), False),
  1879. (QuarterEnd(
  1880. 1, startingMonth=2), datetime(2007, 12, 31), False),
  1881. (QuarterEnd(1, startingMonth=2), datetime(2008, 2, 29), True),
  1882. (QuarterEnd(
  1883. 1, startingMonth=2), datetime(2007, 3, 30), False),
  1884. (QuarterEnd(
  1885. 1, startingMonth=2), datetime(2007, 3, 31), False),
  1886. (QuarterEnd(
  1887. 1, startingMonth=2), datetime(2008, 4, 30), False),
  1888. (QuarterEnd(
  1889. 1, startingMonth=2), datetime(2008, 5, 30), False),
  1890. (QuarterEnd(1, startingMonth=2), datetime(2008, 5, 31), True),
  1891. (QuarterEnd(
  1892. 1, startingMonth=2), datetime(2007, 6, 29), False),
  1893. (QuarterEnd(
  1894. 1, startingMonth=2), datetime(2007, 6, 30), False),
  1895. (QuarterEnd(
  1896. 1, startingMonth=3), datetime(2008, 1, 31), False),
  1897. (QuarterEnd(
  1898. 1, startingMonth=3), datetime(2007, 12, 31), True),
  1899. (QuarterEnd(
  1900. 1, startingMonth=3), datetime(2008, 2, 29), False),
  1901. (QuarterEnd(
  1902. 1, startingMonth=3), datetime(2007, 3, 30), False),
  1903. (QuarterEnd(1, startingMonth=3), datetime(2007, 3, 31), True),
  1904. (QuarterEnd(
  1905. 1, startingMonth=3), datetime(2008, 4, 30), False),
  1906. (QuarterEnd(
  1907. 1, startingMonth=3), datetime(2008, 5, 30), False),
  1908. (QuarterEnd(
  1909. 1, startingMonth=3), datetime(2008, 5, 31), False),
  1910. (QuarterEnd(
  1911. 1, startingMonth=3), datetime(2007, 6, 29), False),
  1912. (QuarterEnd(1, startingMonth=3), datetime(2007, 6, 30), True),
  1913. ]
  1914. for offset, date, expected in tests:
  1915. assertOnOffset(offset, date, expected)
  1916. class TestBYearBegin(Base):
  1917. _offset = BYearBegin
  1918. def test_misspecified(self):
  1919. self.assertRaises(ValueError, BYearBegin, month=13)
  1920. self.assertRaises(ValueError, BYearEnd, month=13)
  1921. def test_offset(self):
  1922. tests = []
  1923. tests.append((BYearBegin(),
  1924. {datetime(2008, 1, 1): datetime(2009, 1, 1),
  1925. datetime(2008, 6, 30): datetime(2009, 1, 1),
  1926. datetime(2008, 12, 31): datetime(2009, 1, 1),
  1927. datetime(2011, 1, 1): datetime(2011, 1, 3),
  1928. datetime(2011, 1, 3): datetime(2012, 1, 2),
  1929. datetime(2005, 12, 30): datetime(2006, 1, 2),
  1930. datetime(2005, 12, 31): datetime(2006, 1, 2)
  1931. }
  1932. ))
  1933. tests.append((BYearBegin(0),
  1934. {datetime(2008, 1, 1): datetime(2008, 1, 1),
  1935. datetime(2008, 6, 30): datetime(2009, 1, 1),
  1936. datetime(2008, 12, 31): datetime(2009, 1, 1),
  1937. datetime(2005, 12, 30): datetime(2006, 1, 2),
  1938. datetime(2005, 12, 31): datetime(2006, 1, 2), }))
  1939. tests.append((BYearBegin(-1),
  1940. {datetime(2007, 1, 1): datetime(2006, 1, 2),
  1941. datetime(2009, 1, 4): datetime(2009, 1, 1),
  1942. datetime(2009, 1, 1): datetime(2008, 1, 1),
  1943. datetime(2008, 6, 30): datetime(2008, 1, 1),
  1944. datetime(2008, 12, 31): datetime(2008, 1, 1),
  1945. datetime(2006, 12, 29): datetime(2006, 1, 2),
  1946. datetime(2006, 12, 30): datetime(2006, 1, 2),
  1947. datetime(2006, 1, 1): datetime(2005, 1, 3), }))
  1948. tests.append((BYearBegin(-2),
  1949. {datetime(2007, 1, 1): datetime(2005, 1, 3),
  1950. datetime(2007, 6, 30): datetime(2006, 1, 2),
  1951. datetime(2008, 12, 31): datetime(2007, 1, 1), }))
  1952. for offset, cases in tests:
  1953. for base, expected in compat.iteritems(cases):
  1954. assertEq(offset, base, expected)
  1955. class TestYearBegin(Base):
  1956. _offset = YearBegin
  1957. def test_misspecified(self):
  1958. self.assertRaises(ValueError, YearBegin, month=13)
  1959. def test_offset(self):
  1960. tests = []
  1961. tests.append((YearBegin(),
  1962. {datetime(2008, 1, 1): datetime(2009, 1, 1),
  1963. datetime(2008, 6, 30): datetime(2009, 1, 1),
  1964. datetime(2008, 12, 31): datetime(2009, 1, 1),
  1965. datetime(2005, 12, 30): datetime(2006, 1, 1),
  1966. datetime(2005, 12, 31): datetime(2006, 1, 1), }))
  1967. tests.append((YearBegin(0),
  1968. {datetime(2008, 1, 1): datetime(2008, 1, 1),
  1969. datetime(2008, 6, 30): datetime(2009, 1, 1),
  1970. datetime(2008, 12, 31): datetime(2009, 1, 1),
  1971. datetime(2005, 12, 30): datetime(2006, 1, 1),
  1972. datetime(2005, 12, 31): datetime(2006, 1, 1), }))
  1973. tests.append((YearBegin(-1),
  1974. {datetime(2007, 1, 1): datetime(2006, 1, 1),
  1975. datetime(2007, 1, 15): datetime(2007, 1, 1),
  1976. datetime(2008, 6, 30): datetime(2008, 1, 1),
  1977. datetime(2008, 12, 31): datetime(2008, 1, 1),
  1978. datetime(2006, 12, 29): datetime(2006, 1, 1),
  1979. datetime(2006, 12, 30): datetime(2006, 1, 1),
  1980. datetime(2007, 1, 1): datetime(2006, 1, 1), }))
  1981. tests.append((YearBegin(-2),
  1982. {datetime(2007, 1, 1): datetime(2005, 1, 1),
  1983. datetime(2008, 6, 30): datetime(2007, 1, 1),
  1984. datetime(2008, 12, 31): datetime(2007, 1, 1), }))
  1985. tests.append((YearBegin(month=4),
  1986. {datetime(2007, 4, 1): datetime(2008, 4, 1),
  1987. datetime(2007, 4, 15): datetime(2008, 4, 1),
  1988. datetime(2007, 3, 1): datetime(2007, 4, 1),
  1989. datetime(2007, 12, 15): datetime(2008, 4, 1),
  1990. datetime(2012, 1, 31): datetime(2012, 4, 1), }))
  1991. tests.append((YearBegin(0, month=4),
  1992. {datetime(2007, 4, 1): datetime(2007, 4, 1),
  1993. datetime(2007, 3, 1): datetime(2007, 4, 1),
  1994. datetime(2007, 12, 15): datetime(2008, 4, 1),
  1995. datetime(2012, 1, 31): datetime(2012, 4, 1), }))
  1996. tests.append((YearBegin(-1, month=4),
  1997. {datetime(2007, 4, 1): datetime(2006, 4, 1),
  1998. datetime(2007, 3, 1): datetime(2006, 4, 1),
  1999. datetime(2007, 12, 15): datetime(2007, 4, 1),
  2000. datetime(2012, 1, 31): datetime(2011, 4, 1), }))
  2001. for offset, cases in tests:
  2002. for base, expected in compat.iteritems(cases):
  2003. assertEq(offset, base, expected)
  2004. def test_onOffset(self):
  2005. tests = [
  2006. (YearBegin(), datetime(2007, 1, 3), False),
  2007. (YearBegin(), datetime(2008, 1, 1), True),
  2008. (YearBegin(), datetime(2006, 12, 31), False),
  2009. (YearBegin(), datetime(2006, 1, 2), False),
  2010. ]
  2011. for offset, date, expected in tests:
  2012. assertOnOffset(offset, date, expected)
  2013. class TestBYearEndLagged(Base):
  2014. def test_bad_month_fail(self):
  2015. self.assertRaises(Exception, BYearEnd, month=13)
  2016. self.assertRaises(Exception, BYearEnd, month=0)
  2017. def test_offset(self):
  2018. tests = []
  2019. tests.append((BYearEnd(month=6),
  2020. {datetime(2008, 1, 1): datetime(2008, 6, 30),
  2021. datetime(2007, 6, 30): datetime(2008, 6, 30)},
  2022. ))
  2023. tests.append((BYearEnd(n=-1, month=6),
  2024. {datetime(2008, 1, 1): datetime(2007, 6, 29),
  2025. datetime(2007, 6, 30): datetime(2007, 6, 29)},
  2026. ))
  2027. for offset, cases in tests:
  2028. for base, expected in compat.iteritems(cases):
  2029. self.assertEqual(base + offset, expected)
  2030. def test_roll(self):
  2031. offset = BYearEnd(month=6)
  2032. date = datetime(2009, 11, 30)
  2033. self.assertEqual(offset.rollforward(date), datetime(2010, 6, 30))
  2034. self.assertEqual(offset.rollback(date), datetime(2009, 6, 30))
  2035. def test_onOffset(self):
  2036. tests = [
  2037. (BYearEnd(month=2), datetime(2007, 2, 28), True),
  2038. (BYearEnd(month=6), datetime(2007, 6, 30), False),
  2039. ]
  2040. for offset, date, expected in tests:
  2041. assertOnOffset(offset, date, expected)
  2042. class TestBYearEnd(Base):
  2043. _offset = BYearEnd
  2044. def test_offset(self):
  2045. tests = []
  2046. tests.append((BYearEnd(),
  2047. {datetime(2008, 1, 1): datetime(2008, 12, 31),
  2048. datetime(2008, 6, 30): datetime(2008, 12, 31),
  2049. datetime(2008, 12, 31): datetime(2009, 12, 31),
  2050. datetime(2005, 12, 30): datetime(2006, 12, 29),
  2051. datetime(2005, 12, 31): datetime(2006, 12, 29), }))
  2052. tests.append((BYearEnd(0),
  2053. {datetime(2008, 1, 1): datetime(2008, 12, 31),
  2054. datetime(2008, 6, 30): datetime(2008, 12, 31),
  2055. datetime(2008, 12, 31): datetime(2008, 12, 31),
  2056. datetime(2005, 12, 31): datetime(2006, 12, 29), }))
  2057. tests.append((BYearEnd(-1),
  2058. {datetime(2007, 1, 1): datetime(2006, 12, 29),
  2059. datetime(2008, 6, 30): datetime(2007, 12, 31),
  2060. datetime(2008, 12, 31): datetime(2007, 12, 31),
  2061. datetime(2006, 12, 29): datetime(2005, 12, 30),
  2062. datetime(2006, 12, 30): datetime(2006, 12, 29),
  2063. datetime(2007, 1, 1): datetime(2006, 12, 29), }))
  2064. tests.append((BYearEnd(-2),
  2065. {datetime(2007, 1, 1): datetime(2005, 12, 30),
  2066. datetime(2008, 6, 30): datetime(2006, 12, 29),
  2067. datetime(2008, 12, 31): datetime(2006, 12, 29), }))
  2068. for offset, cases in tests:
  2069. for base, expected in compat.iteritems(cases):
  2070. assertEq(offset, base, expected)
  2071. def test_onOffset(self):
  2072. tests = [
  2073. (BYearEnd(), datetime(2007, 12, 31), True),
  2074. (BYearEnd(), datetime(2008, 1, 1), False),
  2075. (BYearEnd(), datetime(2006, 12, 31), False),
  2076. (BYearEnd(), datetime(2006, 12, 29), True),
  2077. ]
  2078. for offset, date, expected in tests:
  2079. assertOnOffset(offset, date, expected)
  2080. class TestYearEnd(Base):
  2081. _offset = YearEnd
  2082. def test_misspecified(self):
  2083. self.assertRaises(ValueError, YearEnd, month=13)
  2084. def test_offset(self):
  2085. tests = []
  2086. tests.append((YearEnd(),
  2087. {datetime(2008, 1, 1): datetime(2008, 12, 31),
  2088. datetime(2008, 6, 30): datetime(2008, 12, 31),
  2089. datetime(2008, 12, 31): datetime(2009, 12, 31),
  2090. datetime(2005, 12, 30): datetime(2005, 12, 31),
  2091. datetime(2005, 12, 31): datetime(2006, 12, 31), }))
  2092. tests.append((YearEnd(0),
  2093. {datetime(2008, 1, 1): datetime(2008, 12, 31),
  2094. datetime(2008, 6, 30): datetime(2008, 12, 31),
  2095. datetime(2008, 12, 31): datetime(2008, 12, 31),
  2096. datetime(2005, 12, 30): datetime(2005, 12, 31), }))
  2097. tests.append((YearEnd(-1),
  2098. {datetime(2007, 1, 1): datetime(2006, 12, 31),
  2099. datetime(2008, 6, 30): datetime(2007, 12, 31),
  2100. datetime(2008, 12, 31): datetime(2007, 12, 31),
  2101. datetime(2006, 12, 29): datetime(2005, 12, 31),
  2102. datetime(2006, 12, 30): datetime(2005, 12, 31),
  2103. datetime(2007, 1, 1): datetime(2006, 12, 31), }))
  2104. tests.append((YearEnd(-2),
  2105. {datetime(2007, 1, 1): datetime(2005, 12, 31),
  2106. datetime(2008, 6, 30): datetime(2006, 12, 31),
  2107. datetime(2008, 12, 31): datetime(2006, 12, 31), }))
  2108. for offset, cases in tests:
  2109. for base, expected in compat.iteritems(cases):
  2110. assertEq(offset, base, expected)
  2111. def test_onOffset(self):
  2112. tests = [
  2113. (YearEnd(), datetime(2007, 12, 31), True),
  2114. (YearEnd(), datetime(2008, 1, 1), False),
  2115. (YearEnd(), datetime(2006, 12, 31), True),
  2116. (YearEnd(), datetime(2006, 12, 29), False),
  2117. ]
  2118. for offset, date, expected in tests:
  2119. assertOnOffset(offset, date, expected)
  2120. class TestYearEndDiffMonth(Base):
  2121. def test_offset(self):
  2122. tests = []
  2123. tests.append((YearEnd(month=3),
  2124. {datetime(2008, 1, 1): datetime(2008, 3, 31),
  2125. datetime(2008, 2, 15): datetime(2008, 3, 31),
  2126. datetime(2008, 3, 31): datetime(2009, 3, 31),
  2127. datetime(2008, 3, 30): datetime(2008, 3, 31),
  2128. datetime(2005, 3, 31): datetime(2006, 3, 31),
  2129. datetime(2006, 7, 30): datetime(2007, 3, 31)}))
  2130. tests.append((YearEnd(0, month=3),
  2131. {datetime(2008, 1, 1): datetime(2008, 3, 31),
  2132. datetime(2008, 2, 28): datetime(2008, 3, 31),
  2133. datetime(2008, 3, 31): datetime(2008, 3, 31),
  2134. datetime(2005, 3, 30): datetime(2005, 3, 31), }))
  2135. tests.append((YearEnd(-1, month=3),
  2136. {datetime(2007, 1, 1): datetime(2006, 3, 31),
  2137. datetime(2008, 2, 28): datetime(2007, 3, 31),
  2138. datetime(2008, 3, 31): datetime(2007, 3, 31),
  2139. datetime(2006, 3, 29): datetime(2005, 3, 31),
  2140. datetime(2006, 3, 30): datetime(2005, 3, 31),
  2141. datetime(2007, 3, 1): datetime(2006, 3, 31), }))
  2142. tests.append((YearEnd(-2, month=3),
  2143. {datetime(2007, 1, 1): datetime(2005, 3, 31),
  2144. datetime(2008, 6, 30): datetime(2007, 3, 31),
  2145. datetime(2008, 3, 31): datetime(2006, 3, 31), }))
  2146. for offset, cases in tests:
  2147. for base, expected in compat.iteritems(cases):
  2148. assertEq(offset, base, expected)
  2149. def test_onOffset(self):
  2150. tests = [
  2151. (YearEnd(month=3), datetime(2007, 3, 31), True),
  2152. (YearEnd(month=3), datetime(2008, 1, 1), False),
  2153. (YearEnd(month=3), datetime(2006, 3, 31), True),
  2154. (YearEnd(month=3), datetime(2006, 3, 29), False),
  2155. ]
  2156. for offset, date, expected in tests:
  2157. assertOnOffset(offset, date, expected)
  2158. def assertEq(offset, base, expected):
  2159. actual = offset + base
  2160. actual_swapped = base + offset
  2161. actual_apply = offset.apply(base)
  2162. try:
  2163. assert actual == expected
  2164. assert actual_swapped == expected
  2165. assert actual_apply == expected
  2166. except AssertionError:
  2167. raise AssertionError("\nExpected: %s\nActual: %s\nFor Offset: %s)"
  2168. "\nAt Date: %s" %
  2169. (expected, actual, offset, base))
  2170. def test_Easter():
  2171. assertEq(Easter(), datetime(2010, 1, 1), datetime(2010, 4, 4))
  2172. assertEq(Easter(), datetime(2010, 4, 5), datetime(2011, 4, 24))
  2173. assertEq(Easter(2), datetime(2010, 1, 1), datetime(2011, 4, 24))
  2174. assertEq(Easter(), datetime(2010, 4, 4), datetime(2011, 4, 24))
  2175. assertEq(Easter(2), datetime(2010, 4, 4), datetime(2012, 4, 8))
  2176. assertEq(-Easter(), datetime(2011, 1, 1), datetime(2010, 4, 4))
  2177. assertEq(-Easter(), datetime(2010, 4, 5), datetime(2010, 4, 4))
  2178. assertEq(-Easter(2), datetime(2011, 1, 1), datetime(2009, 4, 12))
  2179. assertEq(-Easter(), datetime(2010, 4, 4), datetime(2009, 4, 12))
  2180. assertEq(-Easter(2), datetime(2010, 4, 4), datetime(2008, 3, 23))
  2181. def test_Hour():
  2182. assertEq(Hour(), datetime(2010, 1, 1), datetime(2010, 1, 1, 1))
  2183. assertEq(Hour(-1), datetime(2010, 1, 1, 1), datetime(2010, 1, 1))
  2184. assertEq(2 * Hour(), datetime(2010, 1, 1), datetime(2010, 1, 1, 2))
  2185. assertEq(-1 * Hour(), datetime(2010, 1, 1, 1), datetime(2010, 1, 1))
  2186. assert (Hour(3) + Hour(2)) == Hour(5)
  2187. assert (Hour(3) - Hour(2)) == Hour()
  2188. assert(Hour(4) != Hour(1))
  2189. assert not Hour().isAnchored()
  2190. def test_Minute():
  2191. assertEq(Minute(), datetime(2010, 1, 1), datetime(2010, 1, 1, 0, 1))
  2192. assertEq(Minute(-1), datetime(2010, 1, 1, 0, 1), datetime(2010, 1, 1))
  2193. assertEq(2 * Minute(), datetime(2010, 1, 1), datetime(2010, 1, 1, 0, 2))
  2194. assertEq(-1 * Minute(), datetime(2010, 1, 1, 0, 1), datetime(2010, 1, 1))
  2195. assert (Minute(3) + Minute(2)) == Minute(5)
  2196. assert (Minute(3) - Minute(2)) == Minute()
  2197. assert(Minute(5) != Minute())
  2198. assert not Minute().isAnchored()
  2199. def test_Second():
  2200. assertEq(Second(), datetime(2010, 1, 1), datetime(2010, 1, 1, 0, 0, 1))
  2201. assertEq(Second(-1), datetime(2010, 1, 1, 0, 0, 1), datetime(2010, 1, 1))
  2202. assertEq(2 * Second(), datetime(2010, 1, 1), datetime(2010, 1, 1, 0, 0, 2))
  2203. assertEq(
  2204. -1 * Second(), datetime(2010, 1, 1, 0, 0, 1), datetime(2010, 1, 1))
  2205. assert (Second(3) + Second(2)) == Second(5)
  2206. assert (Second(3) - Second(2)) == Second()
  2207. assert not Second().isAnchored()
  2208. def test_Millisecond():
  2209. assertEq(Milli(), datetime(2010, 1, 1), datetime(2010, 1, 1, 0, 0, 0, 1000))
  2210. assertEq(Milli(-1), datetime(2010, 1, 1, 0, 0, 0, 1000), datetime(2010, 1, 1))
  2211. assertEq(Milli(2), datetime(2010, 1, 1), datetime(2010, 1, 1, 0, 0, 0, 2000))
  2212. assertEq(2 * Milli(), datetime(2010, 1, 1), datetime(2010, 1, 1, 0, 0, 0, 2000))
  2213. assertEq(-1 * Milli(), datetime(2010, 1, 1, 0, 0, 0, 1000), datetime(2010, 1, 1))
  2214. assert (Milli(3) + Milli(2)) == Milli(5)
  2215. assert (Milli(3) - Milli(2)) == Milli()
  2216. def test_MillisecondTimestampArithmetic():
  2217. assertEq(Milli(), Timestamp('2010-01-01'), Timestamp('2010-01-01 00:00:00.001'))
  2218. assertEq(Milli(-1), Timestamp('2010-01-01 00:00:00.001'), Timestamp('2010-01-01'))
  2219. def test_Microsecond():
  2220. assertEq(Micro(), datetime(2010, 1, 1), datetime(2010, 1, 1, 0, 0, 0, 1))
  2221. assertEq(Micro(-1), datetime(2010, 1, 1, 0, 0, 0, 1), datetime(2010, 1, 1))
  2222. assertEq(2 * Micro(), datetime(2010, 1, 1), datetime(2010, 1, 1, 0, 0, 0, 2))
  2223. assertEq(-1 * Micro(), datetime(2010, 1, 1, 0, 0, 0, 1), datetime(2010, 1, 1))
  2224. assert (Micro(3) + Micro(2)) == Micro(5)
  2225. assert (Micro(3) - Micro(2)) == Micro()
  2226. def test_NanosecondGeneric():
  2227. tm._skip_if_not_numpy17_friendly()
  2228. timestamp = Timestamp(datetime(2010, 1, 1))
  2229. assert timestamp.nanosecond == 0
  2230. result = timestamp + Nano(10)
  2231. assert result.nanosecond == 10
  2232. reverse_result = Nano(10) + timestamp
  2233. assert reverse_result.nanosecond == 10
  2234. def test_Nanosecond():
  2235. tm._skip_if_not_numpy17_friendly()
  2236. timestamp = Timestamp(datetime(2010, 1, 1))
  2237. assertEq(Nano(), timestamp, timestamp + np.timedelta64(1, 'ns'))
  2238. assertEq(Nano(-1), timestamp + np.timedelta64(1, 'ns'), timestamp)
  2239. assertEq(2 * Nano(), timestamp, timestamp + np.timedelta64(2, 'ns'))
  2240. assertEq(-1 * Nano(), timestamp + np.timedelta64(1, 'ns'), timestamp)
  2241. assert (Nano(3) + Nano(2)) == Nano(5)
  2242. assert (Nano(3) - Nano(2)) == Nano()
  2243. def test_tick_offset():
  2244. assert not Day().isAnchored()
  2245. assert not Milli().isAnchored()
  2246. assert not Micro().isAnchored()
  2247. assert not Nano().isAnchored()
  2248. def test_compare_ticks():
  2249. offsets = [Hour, Minute, Second, Milli, Micro]
  2250. for kls in offsets:
  2251. three = kls(3)
  2252. four = kls(4)
  2253. for _ in range(10):
  2254. assert(three < kls(4))
  2255. assert(kls(3) < four)
  2256. assert(four > kls(3))
  2257. assert(kls(4) > three)
  2258. assert(kls(3) == kls(3))
  2259. assert(kls(3) != kls(4))
  2260. class TestOffsetNames(tm.TestCase):
  2261. def test_get_offset_name(self):
  2262. assertRaisesRegexp(ValueError, 'Bad rule.*BusinessDays', get_offset_name, BDay(2))
  2263. assert get_offset_name(BDay()) == 'B'
  2264. assert get_offset_name(BMonthEnd()) == 'BM'
  2265. assert get_offset_name(Week(weekday=0)) == 'W-MON'
  2266. assert get_offset_name(Week(weekday=1)) == 'W-TUE'
  2267. assert get_offset_name(Week(weekday=2)) == 'W-WED'
  2268. assert get_offset_name(Week(weekday=3)) == 'W-THU'
  2269. assert get_offset_name(Week(weekday=4)) == 'W-FRI'
  2270. self.assertEqual(get_offset_name(LastWeekOfMonth(weekday=WeekDay.SUN)), "LWOM-SUN")
  2271. self.assertEqual(get_offset_name(makeFY5253LastOfMonthQuarter(weekday=1, startingMonth=3, qtr_with_extra_week=4)),"REQ-L-MAR-TUE-4")
  2272. self.assertEqual(get_offset_name(makeFY5253NearestEndMonthQuarter(weekday=1, startingMonth=3, qtr_with_extra_week=3)), "REQ-N-MAR-TUE-3")
  2273. def test_get_offset():
  2274. assertRaisesRegexp(ValueError, "rule.*GIBBERISH", get_offset, 'gibberish')
  2275. assertRaisesRegexp(ValueError, "rule.*QS-JAN-B", get_offset, 'QS-JAN-B')
  2276. pairs = [
  2277. ('B', BDay()), ('b', BDay()), ('bm', BMonthEnd()),
  2278. ('Bm', BMonthEnd()), ('W-MON', Week(weekday=0)),
  2279. ('W-TUE', Week(weekday=1)), ('W-WED', Week(weekday=2)),
  2280. ('W-THU', Week(weekday=3)), ('W-FRI', Week(weekday=4)),
  2281. ('w@Sat', Week(weekday=5)),
  2282. ("RE-N-DEC-MON", makeFY5253NearestEndMonth(weekday=0, startingMonth=12)),
  2283. ("RE-L-DEC-TUE", makeFY5253LastOfMonth(weekday=1, startingMonth=12)),
  2284. ("REQ-L-MAR-TUE-4", makeFY5253LastOfMonthQuarter(weekday=1, startingMonth=3, qtr_with_extra_week=4)),
  2285. ("REQ-L-DEC-MON-3", makeFY5253LastOfMonthQuarter(weekday=0, startingMonth=12, qtr_with_extra_week=3)),
  2286. ("REQ-N-DEC-MON-3", makeFY5253NearestEndMonthQuarter(weekday=0, startingMonth=12, qtr_with_extra_week=3)),
  2287. ]
  2288. for name, expected in pairs:
  2289. offset = get_offset(name)
  2290. assert offset == expected, ("Expected %r to yield %r (actual: %r)" %
  2291. (name, expected, offset))
  2292. def test_parse_time_string():
  2293. (date, parsed, reso) = parse_time_string('4Q1984')
  2294. (date_lower, parsed_lower, reso_lower) = parse_time_string('4q1984')
  2295. assert date == date_lower
  2296. assert parsed == parsed_lower
  2297. assert reso == reso_lower
  2298. def test_get_standard_freq():
  2299. fstr = get_standard_freq('W')
  2300. assert fstr == get_standard_freq('w')
  2301. assert fstr == get_standard_freq('1w')
  2302. assert fstr == get_standard_freq(('W', 1))
  2303. assert fstr == get_standard_freq('WeEk')
  2304. fstr = get_standard_freq('5Q')
  2305. assert fstr == get_standard_freq('5q')
  2306. assert fstr == get_standard_freq('5QuarTer')
  2307. assert fstr == get_standard_freq(('q', 5))
  2308. def test_quarterly_dont_normalize():
  2309. date = datetime(2012, 3, 31, 5, 30)
  2310. offsets = (QuarterBegin, QuarterEnd, BQuarterEnd, BQuarterBegin)
  2311. for klass in offsets:
  2312. result = date + klass()
  2313. assert(result.time() == date.time())
  2314. class TestOffsetAliases(tm.TestCase):
  2315. def setUp(self):
  2316. _offset_map.clear()
  2317. def test_alias_equality(self):
  2318. for k, v in compat.iteritems(_offset_map):
  2319. if v is None:
  2320. continue
  2321. self.assertEqual(k, v.copy())
  2322. def test_rule_code(self):
  2323. lst = ['M', 'MS', 'BM', 'BMS', 'D', 'B', 'H', 'T', 'S', 'L', 'U']
  2324. for k in lst:
  2325. self.assertEqual(k, get_offset(k).rule_code)
  2326. # should be cached - this is kind of an internals test...
  2327. assert k in _offset_map
  2328. self.assertEqual(k, (get_offset(k) * 3).rule_code)
  2329. suffix_lst = ['MON', 'TUE', 'WED', 'THU', 'FRI', 'SAT', 'SUN']
  2330. base = 'W'
  2331. for v in suffix_lst:
  2332. alias = '-'.join([base, v])
  2333. self.assertEqual(alias, get_offset(alias).rule_code)
  2334. self.assertEqual(alias, (get_offset(alias) * 5).rule_code)
  2335. suffix_lst = ['JAN', 'FEB', 'MAR', 'APR', 'MAY', 'JUN', 'JUL', 'AUG',
  2336. 'SEP', 'OCT', 'NOV', 'DEC']
  2337. base_lst = ['A', 'AS', 'BA', 'BAS', 'Q', 'QS', 'BQ', 'BQS']
  2338. for base in base_lst:
  2339. for v in suffix_lst:
  2340. alias = '-'.join([base, v])
  2341. self.assertEqual(alias, get_offset(alias).rule_code)
  2342. self.assertEqual(alias, (get_offset(alias) * 5).rule_code)
  2343. def test_apply_ticks():
  2344. result = offsets.Hour(3).apply(offsets.Hour(4))
  2345. exp = offsets.Hour(7)
  2346. assert(result == exp)
  2347. def test_delta_to_tick():
  2348. delta = timedelta(3)
  2349. tick = offsets._delta_to_tick(delta)
  2350. assert(tick == offsets.Day(3))
  2351. def test_dateoffset_misc():
  2352. oset = offsets.DateOffset(months=2, days=4)
  2353. # it works
  2354. result = oset.freqstr
  2355. assert(not offsets.DateOffset(months=2) == 2)
  2356. def test_freq_offsets():
  2357. off = BDay(1, offset=timedelta(0, 1800))
  2358. assert(off.freqstr == 'B+30Min')
  2359. off = BDay(1, offset=timedelta(0, -1800))
  2360. assert(off.freqstr == 'B-30Min')
  2361. def get_all_subclasses(cls):
  2362. ret = set()
  2363. this_subclasses = cls.__subclasses__()
  2364. ret = ret | set(this_subclasses)
  2365. for this_subclass in this_subclasses:
  2366. ret | get_all_subclasses(this_subclass)
  2367. return ret
  2368. class TestCaching(tm.TestCase):
  2369. # as of GH 6479 (in 0.14.0), offset caching is turned off
  2370. # as of v0.12.0 only BusinessMonth/Quarter were actually caching
  2371. def setUp(self):
  2372. _daterange_cache.clear()
  2373. _offset_map.clear()
  2374. def run_X_index_creation(self, cls):
  2375. inst1 = cls()
  2376. if not inst1.isAnchored():
  2377. self.assertFalse(inst1._should_cache(), cls)
  2378. return
  2379. self.assertTrue(inst1._should_cache(), cls)
  2380. DatetimeIndex(start=datetime(2013,1,31), end=datetime(2013,3,31), freq=inst1, normalize=True)
  2381. self.assertTrue(cls() in _daterange_cache, cls)
  2382. def test_should_cache_month_end(self):
  2383. self.assertFalse(MonthEnd()._should_cache())
  2384. def test_should_cache_bmonth_end(self):
  2385. self.assertFalse(BusinessMonthEnd()._should_cache())
  2386. def test_should_cache_week_month(self):
  2387. self.assertFalse(WeekOfMonth(weekday=1, week=2)._should_cache())
  2388. def test_all_cacheableoffsets(self):
  2389. for subclass in get_all_subclasses(CacheableOffset):
  2390. if subclass.__name__[0] == "_" \
  2391. or subclass in TestCaching.no_simple_ctr:
  2392. continue
  2393. self.run_X_index_creation(subclass)
  2394. def test_month_end_index_creation(self):
  2395. DatetimeIndex(start=datetime(2013,1,31), end=datetime(2013,3,31), freq=MonthEnd(), normalize=True)
  2396. self.assertFalse(MonthEnd() in _daterange_cache)
  2397. def test_bmonth_end_index_creation(self):
  2398. DatetimeIndex(start=datetime(2013,1,31), end=datetime(2013,3,29), freq=BusinessMonthEnd(), normalize=True)
  2399. self.assertFalse(BusinessMonthEnd() in _daterange_cache)
  2400. def test_week_of_month_index_creation(self):
  2401. inst1 = WeekOfMonth(weekday=1, week=2)
  2402. DatetimeIndex(start=datetime(2013,1,31), end=datetime(2013,3,29), freq=inst1, normalize=True)
  2403. inst2 = WeekOfMonth(weekday=1, week=2)
  2404. self.assertFalse(inst2 in _daterange_cache)
  2405. class TestReprNames(tm.TestCase):
  2406. def test_str_for_named_is_name(self):
  2407. # look at all the amazing combinations!
  2408. month_prefixes = ['A', 'AS', 'BA', 'BAS', 'Q', 'BQ', 'BQS', 'QS']
  2409. names = [prefix + '-' + month for prefix in month_prefixes
  2410. for month in ['JAN', 'FEB', 'MAR', 'APR', 'MAY', 'JUN',
  2411. 'JUL', 'AUG', 'SEP', 'OCT', 'NOV', 'DEC']]
  2412. days = ['MON', 'TUE', 'WED', 'THU', 'FRI', 'SAT', 'SUN']
  2413. names += ['W-' + day for day in days]
  2414. names += ['WOM-' + week + day for week in ('1', '2', '3', '4')
  2415. for day in days]
  2416. #singletons
  2417. names += ['S', 'T', 'U', 'BM', 'BMS', 'BQ', 'QS'] # No 'Q'
  2418. _offset_map.clear()
  2419. for name in names:
  2420. offset = get_offset(name)
  2421. self.assertEqual(repr(offset), name)
  2422. self.assertEqual(str(offset), name)
  2423. if __name__ == '__main__':
  2424. nose.runmodule(argv=[__file__, '-vvs', '-x', '--pdb', '--pdb-failure'],
  2425. exit=False)