PageRenderTime 59ms CodeModel.GetById 17ms RepoModel.GetById 1ms app.codeStats 0ms

/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

Large files files are truncated, but you can click here to view the full file

  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(20

Large files files are truncated, but you can click here to view the full file