PageRenderTime 60ms CodeModel.GetById 17ms RepoModel.GetById 1ms app.codeStats 1ms

/pandas/tseries/tests/test_timeseries.py

http://github.com/pydata/pandas
Python | 4212 lines | 3261 code | 793 blank | 158 comment | 152 complexity | a41322788c317267557679b46486866f 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. # pylint: disable-msg=E1101,W0612
  2. from datetime import datetime, time, timedelta
  3. import sys
  4. import operator
  5. import nose
  6. import numpy as np
  7. randn = np.random.randn
  8. from pandas import (Index, Series, TimeSeries, DataFrame,
  9. isnull, date_range, Timestamp, Period, DatetimeIndex,
  10. Int64Index, to_datetime, bdate_range, Float64Index)
  11. import pandas.core.datetools as datetools
  12. import pandas.tseries.offsets as offsets
  13. import pandas.tseries.tools as tools
  14. import pandas.tseries.frequencies as fmod
  15. import pandas as pd
  16. from pandas.util.testing import assert_series_equal, assert_almost_equal
  17. import pandas.util.testing as tm
  18. from pandas.tslib import NaT, iNaT
  19. import pandas.lib as lib
  20. import pandas.tslib as tslib
  21. import pandas.index as _index
  22. from pandas.compat import range, long, StringIO, lrange, lmap, zip, product
  23. import pandas.core.datetools as dt
  24. from numpy.random import rand
  25. from numpy.testing import assert_array_equal
  26. from pandas.util.testing import assert_frame_equal
  27. import pandas.compat as compat
  28. import pandas.core.common as com
  29. from pandas import concat
  30. from pandas import _np_version_under1p7
  31. from numpy.testing.decorators import slow
  32. def _skip_if_has_locale():
  33. import locale
  34. lang, _ = locale.getlocale()
  35. if lang is not None:
  36. raise nose.SkipTest("Specific locale is set {0}".format(lang))
  37. def _skip_if_windows_python_3():
  38. if sys.version_info > (3,) and sys.platform == 'win32':
  39. raise nose.SkipTest("not used on python 3/win32")
  40. def _skip_if_not_windows_python_3():
  41. if sys.version_info < (3,) or sys.platform != 'win32':
  42. raise nose.SkipTest("only run on python 3/win32")
  43. class TestTimeSeriesDuplicates(tm.TestCase):
  44. _multiprocess_can_split_ = True
  45. def setUp(self):
  46. dates = [datetime(2000, 1, 2), datetime(2000, 1, 2),
  47. datetime(2000, 1, 2), datetime(2000, 1, 3),
  48. datetime(2000, 1, 3), datetime(2000, 1, 3),
  49. datetime(2000, 1, 4), datetime(2000, 1, 4),
  50. datetime(2000, 1, 4), datetime(2000, 1, 5)]
  51. self.dups = Series(np.random.randn(len(dates)), index=dates)
  52. def test_constructor(self):
  53. tm.assert_isinstance(self.dups, TimeSeries)
  54. tm.assert_isinstance(self.dups.index, DatetimeIndex)
  55. def test_is_unique_monotonic(self):
  56. self.assertFalse(self.dups.index.is_unique)
  57. def test_index_unique(self):
  58. uniques = self.dups.index.unique()
  59. expected = DatetimeIndex([datetime(2000, 1, 2), datetime(2000, 1, 3),
  60. datetime(2000, 1, 4), datetime(2000, 1, 5)])
  61. self.assertEqual(uniques.dtype, 'M8[ns]') # sanity
  62. self.assertTrue(uniques.equals(expected))
  63. self.assertEqual(self.dups.index.nunique(), 4)
  64. # #2563
  65. self.assertTrue(isinstance(uniques, DatetimeIndex))
  66. dups_local = self.dups.index.tz_localize('US/Eastern')
  67. dups_local.name = 'foo'
  68. result = dups_local.unique()
  69. expected = DatetimeIndex(expected, tz='US/Eastern')
  70. self.assertTrue(result.tz is not None)
  71. self.assertEqual(result.name, 'foo')
  72. self.assertTrue(result.equals(expected))
  73. # NaT, note this is excluded
  74. arr = [ 1370745748 + t for t in range(20) ] + [iNaT]
  75. idx = DatetimeIndex(arr * 3)
  76. self.assertTrue(idx.unique().equals(DatetimeIndex(arr)))
  77. self.assertEqual(idx.nunique(), 20)
  78. self.assertEqual(idx.nunique(dropna=False), 21)
  79. arr = [ Timestamp('2013-06-09 02:42:28') + timedelta(seconds=t) for t in range(20) ] + [NaT]
  80. idx = DatetimeIndex(arr * 3)
  81. self.assertTrue(idx.unique().equals(DatetimeIndex(arr)))
  82. self.assertEqual(idx.nunique(), 20)
  83. self.assertEqual(idx.nunique(dropna=False), 21)
  84. def test_index_dupes_contains(self):
  85. d = datetime(2011, 12, 5, 20, 30)
  86. ix = DatetimeIndex([d, d])
  87. self.assertTrue(d in ix)
  88. def test_duplicate_dates_indexing(self):
  89. ts = self.dups
  90. uniques = ts.index.unique()
  91. for date in uniques:
  92. result = ts[date]
  93. mask = ts.index == date
  94. total = (ts.index == date).sum()
  95. expected = ts[mask]
  96. if total > 1:
  97. assert_series_equal(result, expected)
  98. else:
  99. assert_almost_equal(result, expected[0])
  100. cp = ts.copy()
  101. cp[date] = 0
  102. expected = Series(np.where(mask, 0, ts), index=ts.index)
  103. assert_series_equal(cp, expected)
  104. self.assertRaises(KeyError, ts.__getitem__, datetime(2000, 1, 6))
  105. # new index
  106. ts[datetime(2000,1,6)] = 0
  107. self.assertEqual(ts[datetime(2000,1,6)], 0)
  108. def test_range_slice(self):
  109. idx = DatetimeIndex(['1/1/2000', '1/2/2000', '1/2/2000', '1/3/2000',
  110. '1/4/2000'])
  111. ts = Series(np.random.randn(len(idx)), index=idx)
  112. result = ts['1/2/2000':]
  113. expected = ts[1:]
  114. assert_series_equal(result, expected)
  115. result = ts['1/2/2000':'1/3/2000']
  116. expected = ts[1:4]
  117. assert_series_equal(result, expected)
  118. def test_groupby_average_dup_values(self):
  119. result = self.dups.groupby(level=0).mean()
  120. expected = self.dups.groupby(self.dups.index).mean()
  121. assert_series_equal(result, expected)
  122. def test_indexing_over_size_cutoff(self):
  123. import datetime
  124. # #1821
  125. old_cutoff = _index._SIZE_CUTOFF
  126. try:
  127. _index._SIZE_CUTOFF = 1000
  128. # create large list of non periodic datetime
  129. dates = []
  130. sec = datetime.timedelta(seconds=1)
  131. half_sec = datetime.timedelta(microseconds=500000)
  132. d = datetime.datetime(2011, 12, 5, 20, 30)
  133. n = 1100
  134. for i in range(n):
  135. dates.append(d)
  136. dates.append(d + sec)
  137. dates.append(d + sec + half_sec)
  138. dates.append(d + sec + sec + half_sec)
  139. d += 3 * sec
  140. # duplicate some values in the list
  141. duplicate_positions = np.random.randint(0, len(dates) - 1, 20)
  142. for p in duplicate_positions:
  143. dates[p + 1] = dates[p]
  144. df = DataFrame(np.random.randn(len(dates), 4),
  145. index=dates,
  146. columns=list('ABCD'))
  147. pos = n * 3
  148. timestamp = df.index[pos]
  149. self.assertIn(timestamp, df.index)
  150. # it works!
  151. df.ix[timestamp]
  152. self.assertTrue(len(df.ix[[timestamp]]) > 0)
  153. finally:
  154. _index._SIZE_CUTOFF = old_cutoff
  155. def test_indexing_unordered(self):
  156. # GH 2437
  157. rng = date_range(start='2011-01-01', end='2011-01-15')
  158. ts = Series(randn(len(rng)), index=rng)
  159. ts2 = concat([ts[0:4],ts[-4:],ts[4:-4]])
  160. for t in ts.index:
  161. s = str(t)
  162. expected = ts[t]
  163. result = ts2[t]
  164. self.assertTrue(expected == result)
  165. # GH 3448 (ranges)
  166. def compare(slobj):
  167. result = ts2[slobj].copy()
  168. result = result.sort_index()
  169. expected = ts[slobj]
  170. assert_series_equal(result,expected)
  171. compare(slice('2011-01-01','2011-01-15'))
  172. compare(slice('2010-12-30','2011-01-15'))
  173. compare(slice('2011-01-01','2011-01-16'))
  174. # partial ranges
  175. compare(slice('2011-01-01','2011-01-6'))
  176. compare(slice('2011-01-06','2011-01-8'))
  177. compare(slice('2011-01-06','2011-01-12'))
  178. # single values
  179. result = ts2['2011'].sort_index()
  180. expected = ts['2011']
  181. assert_series_equal(result,expected)
  182. # diff freq
  183. rng = date_range(datetime(2005, 1, 1), periods=20, freq='M')
  184. ts = Series(np.arange(len(rng)), index=rng)
  185. ts = ts.take(np.random.permutation(20))
  186. result = ts['2005']
  187. for t in result.index:
  188. self.assertTrue(t.year == 2005)
  189. def test_indexing(self):
  190. idx = date_range("2001-1-1", periods=20, freq='M')
  191. ts = Series(np.random.rand(len(idx)),index=idx)
  192. # getting
  193. # GH 3070, make sure semantics work on Series/Frame
  194. expected = ts['2001']
  195. df = DataFrame(dict(A = ts))
  196. result = df['2001']['A']
  197. assert_series_equal(expected,result)
  198. # setting
  199. ts['2001'] = 1
  200. expected = ts['2001']
  201. df.loc['2001','A'] = 1
  202. result = df['2001']['A']
  203. assert_series_equal(expected,result)
  204. # GH3546 (not including times on the last day)
  205. idx = date_range(start='2013-05-31 00:00', end='2013-05-31 23:00', freq='H')
  206. ts = Series(lrange(len(idx)), index=idx)
  207. expected = ts['2013-05']
  208. assert_series_equal(expected,ts)
  209. idx = date_range(start='2013-05-31 00:00', end='2013-05-31 23:59', freq='S')
  210. ts = Series(lrange(len(idx)), index=idx)
  211. expected = ts['2013-05']
  212. assert_series_equal(expected,ts)
  213. idx = [ Timestamp('2013-05-31 00:00'), Timestamp(datetime(2013,5,31,23,59,59,999999))]
  214. ts = Series(lrange(len(idx)), index=idx)
  215. expected = ts['2013']
  216. assert_series_equal(expected,ts)
  217. # GH 3925, indexing with a seconds resolution string / datetime object
  218. df = DataFrame(randn(5,5),columns=['open','high','low','close','volume'],index=date_range('2012-01-02 18:01:00',periods=5,tz='US/Central',freq='s'))
  219. expected = df.loc[[df.index[2]]]
  220. result = df['2012-01-02 18:01:02']
  221. assert_frame_equal(result,expected)
  222. # this is a single date, so will raise
  223. self.assertRaises(KeyError, df.__getitem__, df.index[2],)
  224. def test_recreate_from_data(self):
  225. if _np_version_under1p7:
  226. freqs = ['M', 'Q', 'A', 'D', 'B', 'T', 'S', 'L', 'U', 'H']
  227. else:
  228. freqs = ['M', 'Q', 'A', 'D', 'B', 'T', 'S', 'L', 'U', 'H', 'N', 'C']
  229. for f in freqs:
  230. org = DatetimeIndex(start='2001/02/01 09:00', freq=f, periods=1)
  231. idx = DatetimeIndex(org, freq=f)
  232. self.assertTrue(idx.equals(org))
  233. org = DatetimeIndex(start='2001/02/01 09:00', freq=f, tz='US/Pacific', periods=1)
  234. idx = DatetimeIndex(org, freq=f, tz='US/Pacific')
  235. self.assertTrue(idx.equals(org))
  236. def assert_range_equal(left, right):
  237. assert(left.equals(right))
  238. assert(left.freq == right.freq)
  239. assert(left.tz == right.tz)
  240. class TestTimeSeries(tm.TestCase):
  241. _multiprocess_can_split_ = True
  242. def test_is_(self):
  243. dti = DatetimeIndex(start='1/1/2005', end='12/1/2005', freq='M')
  244. self.assertTrue(dti.is_(dti))
  245. self.assertTrue(dti.is_(dti.view()))
  246. self.assertFalse(dti.is_(dti.copy()))
  247. def test_dti_slicing(self):
  248. dti = DatetimeIndex(start='1/1/2005', end='12/1/2005', freq='M')
  249. dti2 = dti[[1, 3, 5]]
  250. v1 = dti2[0]
  251. v2 = dti2[1]
  252. v3 = dti2[2]
  253. self.assertEqual(v1, Timestamp('2/28/2005'))
  254. self.assertEqual(v2, Timestamp('4/30/2005'))
  255. self.assertEqual(v3, Timestamp('6/30/2005'))
  256. # don't carry freq through irregular slicing
  257. self.assertIsNone(dti2.freq)
  258. def test_pass_datetimeindex_to_index(self):
  259. # Bugs in #1396
  260. rng = date_range('1/1/2000', '3/1/2000')
  261. idx = Index(rng, dtype=object)
  262. expected = Index(rng.to_pydatetime(), dtype=object)
  263. self.assert_numpy_array_equal(idx.values, expected.values)
  264. def test_contiguous_boolean_preserve_freq(self):
  265. rng = date_range('1/1/2000', '3/1/2000', freq='B')
  266. mask = np.zeros(len(rng), dtype=bool)
  267. mask[10:20] = True
  268. masked = rng[mask]
  269. expected = rng[10:20]
  270. self.assertIsNotNone(expected.freq)
  271. assert_range_equal(masked, expected)
  272. mask[22] = True
  273. masked = rng[mask]
  274. self.assertIsNone(masked.freq)
  275. def test_getitem_median_slice_bug(self):
  276. index = date_range('20090415', '20090519', freq='2B')
  277. s = Series(np.random.randn(13), index=index)
  278. indexer = [slice(6, 7, None)]
  279. result = s[indexer]
  280. expected = s[indexer[0]]
  281. assert_series_equal(result, expected)
  282. def test_series_box_timestamp(self):
  283. rng = date_range('20090415', '20090519', freq='B')
  284. s = Series(rng)
  285. tm.assert_isinstance(s[5], Timestamp)
  286. rng = date_range('20090415', '20090519', freq='B')
  287. s = Series(rng, index=rng)
  288. tm.assert_isinstance(s[5], Timestamp)
  289. tm.assert_isinstance(s.iget_value(5), Timestamp)
  290. def test_date_range_ambiguous_arguments(self):
  291. # #2538
  292. start = datetime(2011, 1, 1, 5, 3, 40)
  293. end = datetime(2011, 1, 1, 8, 9, 40)
  294. self.assertRaises(ValueError, date_range, start, end,
  295. freq='s', periods=10)
  296. def test_timestamp_to_datetime(self):
  297. tm._skip_if_no_pytz()
  298. rng = date_range('20090415', '20090519',
  299. tz='US/Eastern')
  300. stamp = rng[0]
  301. dtval = stamp.to_pydatetime()
  302. self.assertEqual(stamp, dtval)
  303. self.assertEqual(stamp.tzinfo, dtval.tzinfo)
  304. def test_timestamp_to_datetime_dateutil(self):
  305. tm._skip_if_no_pytz()
  306. rng = date_range('20090415', '20090519',
  307. tz='dateutil/US/Eastern')
  308. stamp = rng[0]
  309. dtval = stamp.to_pydatetime()
  310. self.assertEqual(stamp, dtval)
  311. self.assertEqual(stamp.tzinfo, dtval.tzinfo)
  312. def test_timestamp_to_datetime_explicit_pytz(self):
  313. tm._skip_if_no_pytz()
  314. import pytz
  315. rng = date_range('20090415', '20090519',
  316. tz=pytz.timezone('US/Eastern'))
  317. stamp = rng[0]
  318. dtval = stamp.to_pydatetime()
  319. self.assertEquals(stamp, dtval)
  320. self.assertEquals(stamp.tzinfo, dtval.tzinfo)
  321. def test_timestamp_to_datetime_explicit_dateutil(self):
  322. _skip_if_windows_python_3()
  323. tm._skip_if_no_dateutil()
  324. import dateutil
  325. rng = date_range('20090415', '20090519',
  326. tz=dateutil.tz.gettz('US/Eastern'))
  327. stamp = rng[0]
  328. dtval = stamp.to_pydatetime()
  329. self.assertEquals(stamp, dtval)
  330. self.assertEquals(stamp.tzinfo, dtval.tzinfo)
  331. def test_index_convert_to_datetime_array(self):
  332. tm._skip_if_no_pytz()
  333. def _check_rng(rng):
  334. converted = rng.to_pydatetime()
  335. tm.assert_isinstance(converted, np.ndarray)
  336. for x, stamp in zip(converted, rng):
  337. tm.assert_isinstance(x, datetime)
  338. self.assertEqual(x, stamp.to_pydatetime())
  339. self.assertEqual(x.tzinfo, stamp.tzinfo)
  340. rng = date_range('20090415', '20090519')
  341. rng_eastern = date_range('20090415', '20090519', tz='US/Eastern')
  342. rng_utc = date_range('20090415', '20090519', tz='utc')
  343. _check_rng(rng)
  344. _check_rng(rng_eastern)
  345. _check_rng(rng_utc)
  346. def test_index_convert_to_datetime_array_explicit_pytz(self):
  347. tm._skip_if_no_pytz()
  348. import pytz
  349. def _check_rng(rng):
  350. converted = rng.to_pydatetime()
  351. tm.assert_isinstance(converted, np.ndarray)
  352. for x, stamp in zip(converted, rng):
  353. tm.assert_isinstance(x, datetime)
  354. self.assertEquals(x, stamp.to_pydatetime())
  355. self.assertEquals(x.tzinfo, stamp.tzinfo)
  356. rng = date_range('20090415', '20090519')
  357. rng_eastern = date_range('20090415', '20090519', tz=pytz.timezone('US/Eastern'))
  358. rng_utc = date_range('20090415', '20090519', tz=pytz.utc)
  359. _check_rng(rng)
  360. _check_rng(rng_eastern)
  361. _check_rng(rng_utc)
  362. def test_index_convert_to_datetime_array_dateutil(self):
  363. tm._skip_if_no_dateutil()
  364. import dateutil
  365. def _check_rng(rng):
  366. converted = rng.to_pydatetime()
  367. tm.assert_isinstance(converted, np.ndarray)
  368. for x, stamp in zip(converted, rng):
  369. tm.assert_isinstance(x, datetime)
  370. self.assertEquals(x, stamp.to_pydatetime())
  371. self.assertEquals(x.tzinfo, stamp.tzinfo)
  372. rng = date_range('20090415', '20090519')
  373. rng_eastern = date_range('20090415', '20090519', tz='dateutil/US/Eastern')
  374. rng_utc = date_range('20090415', '20090519', tz=dateutil.tz.tzutc())
  375. _check_rng(rng)
  376. _check_rng(rng_eastern)
  377. _check_rng(rng_utc)
  378. def test_ctor_str_intraday(self):
  379. rng = DatetimeIndex(['1-1-2000 00:00:01'])
  380. self.assertEqual(rng[0].second, 1)
  381. def test_series_ctor_plus_datetimeindex(self):
  382. rng = date_range('20090415', '20090519', freq='B')
  383. data = dict((k, 1) for k in rng)
  384. result = Series(data, index=rng)
  385. self.assertIs(result.index, rng)
  386. def test_series_pad_backfill_limit(self):
  387. index = np.arange(10)
  388. s = Series(np.random.randn(10), index=index)
  389. result = s[:2].reindex(index, method='pad', limit=5)
  390. expected = s[:2].reindex(index).fillna(method='pad')
  391. expected[-3:] = np.nan
  392. assert_series_equal(result, expected)
  393. result = s[-2:].reindex(index, method='backfill', limit=5)
  394. expected = s[-2:].reindex(index).fillna(method='backfill')
  395. expected[:3] = np.nan
  396. assert_series_equal(result, expected)
  397. def test_series_fillna_limit(self):
  398. index = np.arange(10)
  399. s = Series(np.random.randn(10), index=index)
  400. result = s[:2].reindex(index)
  401. result = result.fillna(method='pad', limit=5)
  402. expected = s[:2].reindex(index).fillna(method='pad')
  403. expected[-3:] = np.nan
  404. assert_series_equal(result, expected)
  405. result = s[-2:].reindex(index)
  406. result = result.fillna(method='bfill', limit=5)
  407. expected = s[-2:].reindex(index).fillna(method='backfill')
  408. expected[:3] = np.nan
  409. assert_series_equal(result, expected)
  410. def test_frame_pad_backfill_limit(self):
  411. index = np.arange(10)
  412. df = DataFrame(np.random.randn(10, 4), index=index)
  413. result = df[:2].reindex(index, method='pad', limit=5)
  414. expected = df[:2].reindex(index).fillna(method='pad')
  415. expected.values[-3:] = np.nan
  416. tm.assert_frame_equal(result, expected)
  417. result = df[-2:].reindex(index, method='backfill', limit=5)
  418. expected = df[-2:].reindex(index).fillna(method='backfill')
  419. expected.values[:3] = np.nan
  420. tm.assert_frame_equal(result, expected)
  421. def test_frame_fillna_limit(self):
  422. index = np.arange(10)
  423. df = DataFrame(np.random.randn(10, 4), index=index)
  424. result = df[:2].reindex(index)
  425. result = result.fillna(method='pad', limit=5)
  426. expected = df[:2].reindex(index).fillna(method='pad')
  427. expected.values[-3:] = np.nan
  428. tm.assert_frame_equal(result, expected)
  429. result = df[-2:].reindex(index)
  430. result = result.fillna(method='backfill', limit=5)
  431. expected = df[-2:].reindex(index).fillna(method='backfill')
  432. expected.values[:3] = np.nan
  433. tm.assert_frame_equal(result, expected)
  434. def test_frame_setitem_timestamp(self):
  435. # 2155
  436. columns = DatetimeIndex(start='1/1/2012', end='2/1/2012',
  437. freq=datetools.bday)
  438. index = lrange(10)
  439. data = DataFrame(columns=columns, index=index)
  440. t = datetime(2012, 11, 1)
  441. ts = Timestamp(t)
  442. data[ts] = np.nan # works
  443. def test_sparse_series_fillna_limit(self):
  444. index = np.arange(10)
  445. s = Series(np.random.randn(10), index=index)
  446. ss = s[:2].reindex(index).to_sparse()
  447. result = ss.fillna(method='pad', limit=5)
  448. expected = ss.fillna(method='pad', limit=5)
  449. expected = expected.to_dense()
  450. expected[-3:] = np.nan
  451. expected = expected.to_sparse()
  452. assert_series_equal(result, expected)
  453. ss = s[-2:].reindex(index).to_sparse()
  454. result = ss.fillna(method='backfill', limit=5)
  455. expected = ss.fillna(method='backfill')
  456. expected = expected.to_dense()
  457. expected[:3] = np.nan
  458. expected = expected.to_sparse()
  459. assert_series_equal(result, expected)
  460. def test_sparse_series_pad_backfill_limit(self):
  461. index = np.arange(10)
  462. s = Series(np.random.randn(10), index=index)
  463. s = s.to_sparse()
  464. result = s[:2].reindex(index, method='pad', limit=5)
  465. expected = s[:2].reindex(index).fillna(method='pad')
  466. expected = expected.to_dense()
  467. expected[-3:] = np.nan
  468. expected = expected.to_sparse()
  469. assert_series_equal(result, expected)
  470. result = s[-2:].reindex(index, method='backfill', limit=5)
  471. expected = s[-2:].reindex(index).fillna(method='backfill')
  472. expected = expected.to_dense()
  473. expected[:3] = np.nan
  474. expected = expected.to_sparse()
  475. assert_series_equal(result, expected)
  476. def test_sparse_frame_pad_backfill_limit(self):
  477. index = np.arange(10)
  478. df = DataFrame(np.random.randn(10, 4), index=index)
  479. sdf = df.to_sparse()
  480. result = sdf[:2].reindex(index, method='pad', limit=5)
  481. expected = sdf[:2].reindex(index).fillna(method='pad')
  482. expected = expected.to_dense()
  483. expected.values[-3:] = np.nan
  484. expected = expected.to_sparse()
  485. tm.assert_frame_equal(result, expected)
  486. result = sdf[-2:].reindex(index, method='backfill', limit=5)
  487. expected = sdf[-2:].reindex(index).fillna(method='backfill')
  488. expected = expected.to_dense()
  489. expected.values[:3] = np.nan
  490. expected = expected.to_sparse()
  491. tm.assert_frame_equal(result, expected)
  492. def test_sparse_frame_fillna_limit(self):
  493. index = np.arange(10)
  494. df = DataFrame(np.random.randn(10, 4), index=index)
  495. sdf = df.to_sparse()
  496. result = sdf[:2].reindex(index)
  497. result = result.fillna(method='pad', limit=5)
  498. expected = sdf[:2].reindex(index).fillna(method='pad')
  499. expected = expected.to_dense()
  500. expected.values[-3:] = np.nan
  501. expected = expected.to_sparse()
  502. tm.assert_frame_equal(result, expected)
  503. result = sdf[-2:].reindex(index)
  504. result = result.fillna(method='backfill', limit=5)
  505. expected = sdf[-2:].reindex(index).fillna(method='backfill')
  506. expected = expected.to_dense()
  507. expected.values[:3] = np.nan
  508. expected = expected.to_sparse()
  509. tm.assert_frame_equal(result, expected)
  510. def test_pad_require_monotonicity(self):
  511. rng = date_range('1/1/2000', '3/1/2000', freq='B')
  512. rng2 = rng[::2][::-1]
  513. self.assertRaises(ValueError, rng2.get_indexer, rng,
  514. method='pad')
  515. def test_frame_ctor_datetime64_column(self):
  516. rng = date_range('1/1/2000 00:00:00', '1/1/2000 1:59:50',
  517. freq='10s')
  518. dates = np.asarray(rng)
  519. df = DataFrame({'A': np.random.randn(len(rng)), 'B': dates})
  520. self.assertTrue(np.issubdtype(df['B'].dtype, np.dtype('M8[ns]')))
  521. def test_frame_add_datetime64_column(self):
  522. rng = date_range('1/1/2000 00:00:00', '1/1/2000 1:59:50',
  523. freq='10s')
  524. df = DataFrame(index=np.arange(len(rng)))
  525. df['A'] = rng
  526. self.assertTrue(np.issubdtype(df['A'].dtype, np.dtype('M8[ns]')))
  527. def test_frame_datetime64_pre1900_repr(self):
  528. df = DataFrame({'year': date_range('1/1/1700', periods=50,
  529. freq='A-DEC')})
  530. # it works!
  531. repr(df)
  532. def test_frame_add_datetime64_col_other_units(self):
  533. n = 100
  534. units = ['h', 'm', 's', 'ms', 'D', 'M', 'Y']
  535. ns_dtype = np.dtype('M8[ns]')
  536. for unit in units:
  537. dtype = np.dtype('M8[%s]' % unit)
  538. vals = np.arange(n, dtype=np.int64).view(dtype)
  539. df = DataFrame({'ints': np.arange(n)}, index=np.arange(n))
  540. df[unit] = vals
  541. ex_vals = to_datetime(vals.astype('O'))
  542. self.assertEqual(df[unit].dtype, ns_dtype)
  543. self.assertTrue((df[unit].values == ex_vals).all())
  544. # Test insertion into existing datetime64 column
  545. df = DataFrame({'ints': np.arange(n)}, index=np.arange(n))
  546. df['dates'] = np.arange(n, dtype=np.int64).view(ns_dtype)
  547. for unit in units:
  548. dtype = np.dtype('M8[%s]' % unit)
  549. vals = np.arange(n, dtype=np.int64).view(dtype)
  550. tmp = df.copy()
  551. tmp['dates'] = vals
  552. ex_vals = to_datetime(vals.astype('O'))
  553. self.assertTrue((tmp['dates'].values == ex_vals).all())
  554. def test_to_datetime_unit(self):
  555. epoch = 1370745748
  556. s = Series([ epoch + t for t in range(20) ])
  557. result = to_datetime(s,unit='s')
  558. expected = Series([ Timestamp('2013-06-09 02:42:28') + timedelta(seconds=t) for t in range(20) ])
  559. assert_series_equal(result,expected)
  560. s = Series([ epoch + t for t in range(20) ]).astype(float)
  561. result = to_datetime(s,unit='s')
  562. expected = Series([ Timestamp('2013-06-09 02:42:28') + timedelta(seconds=t) for t in range(20) ])
  563. assert_series_equal(result,expected)
  564. s = Series([ epoch + t for t in range(20) ] + [iNaT])
  565. result = to_datetime(s,unit='s')
  566. expected = Series([ Timestamp('2013-06-09 02:42:28') + timedelta(seconds=t) for t in range(20) ] + [NaT])
  567. assert_series_equal(result,expected)
  568. s = Series([ epoch + t for t in range(20) ] + [iNaT]).astype(float)
  569. result = to_datetime(s,unit='s')
  570. expected = Series([ Timestamp('2013-06-09 02:42:28') + timedelta(seconds=t) for t in range(20) ] + [NaT])
  571. assert_series_equal(result,expected)
  572. s = concat([Series([ epoch + t for t in range(20) ]).astype(float),Series([np.nan])],ignore_index=True)
  573. result = to_datetime(s,unit='s')
  574. expected = Series([ Timestamp('2013-06-09 02:42:28') + timedelta(seconds=t) for t in range(20) ] + [NaT])
  575. assert_series_equal(result,expected)
  576. def test_series_ctor_datetime64(self):
  577. rng = date_range('1/1/2000 00:00:00', '1/1/2000 1:59:50',
  578. freq='10s')
  579. dates = np.asarray(rng)
  580. series = Series(dates)
  581. self.assertTrue(np.issubdtype(series.dtype, np.dtype('M8[ns]')))
  582. def test_index_cast_datetime64_other_units(self):
  583. arr = np.arange(0, 100, 10, dtype=np.int64).view('M8[D]')
  584. idx = Index(arr)
  585. self.assertTrue((idx.values == tslib.cast_to_nanoseconds(arr)).all())
  586. def test_index_astype_datetime64(self):
  587. # valid only under 1.7!
  588. if not _np_version_under1p7:
  589. raise nose.SkipTest("test only valid in numpy < 1.7")
  590. idx = Index([datetime(2012, 1, 1)], dtype=object)
  591. casted = idx.astype(np.dtype('M8[D]'))
  592. casted = idx.astype(np.dtype('M8[D]'))
  593. expected = DatetimeIndex(idx.values)
  594. tm.assert_isinstance(casted, DatetimeIndex)
  595. self.assertTrue(casted.equals(expected))
  596. def test_reindex_series_add_nat(self):
  597. rng = date_range('1/1/2000 00:00:00', periods=10, freq='10s')
  598. series = Series(rng)
  599. result = series.reindex(lrange(15))
  600. self.assertTrue(np.issubdtype(result.dtype, np.dtype('M8[ns]')))
  601. mask = result.isnull()
  602. self.assertTrue(mask[-5:].all())
  603. self.assertFalse(mask[:-5].any())
  604. def test_reindex_frame_add_nat(self):
  605. rng = date_range('1/1/2000 00:00:00', periods=10, freq='10s')
  606. df = DataFrame({'A': np.random.randn(len(rng)), 'B': rng})
  607. result = df.reindex(lrange(15))
  608. self.assertTrue(np.issubdtype(result['B'].dtype, np.dtype('M8[ns]')))
  609. mask = com.isnull(result)['B']
  610. self.assertTrue(mask[-5:].all())
  611. self.assertFalse(mask[:-5].any())
  612. def test_series_repr_nat(self):
  613. series = Series([0, 1000, 2000, iNaT], dtype='M8[ns]')
  614. result = repr(series)
  615. expected = ('0 1970-01-01 00:00:00\n'
  616. '1 1970-01-01 00:00:00.000001\n'
  617. '2 1970-01-01 00:00:00.000002\n'
  618. '3 NaT\n'
  619. 'dtype: datetime64[ns]')
  620. self.assertEqual(result, expected)
  621. def test_fillna_nat(self):
  622. series = Series([0, 1, 2, iNaT], dtype='M8[ns]')
  623. filled = series.fillna(method='pad')
  624. filled2 = series.fillna(value=series.values[2])
  625. expected = series.copy()
  626. expected.values[3] = expected.values[2]
  627. assert_series_equal(filled, expected)
  628. assert_series_equal(filled2, expected)
  629. df = DataFrame({'A': series})
  630. filled = df.fillna(method='pad')
  631. filled2 = df.fillna(value=series.values[2])
  632. expected = DataFrame({'A': expected})
  633. assert_frame_equal(filled, expected)
  634. assert_frame_equal(filled2, expected)
  635. series = Series([iNaT, 0, 1, 2], dtype='M8[ns]')
  636. filled = series.fillna(method='bfill')
  637. filled2 = series.fillna(value=series[1])
  638. expected = series.copy()
  639. expected[0] = expected[1]
  640. assert_series_equal(filled, expected)
  641. assert_series_equal(filled2, expected)
  642. df = DataFrame({'A': series})
  643. filled = df.fillna(method='bfill')
  644. filled2 = df.fillna(value=series[1])
  645. expected = DataFrame({'A': expected})
  646. assert_frame_equal(filled, expected)
  647. assert_frame_equal(filled2, expected)
  648. def test_string_na_nat_conversion(self):
  649. # GH #999, #858
  650. from pandas.compat import parse_date
  651. strings = np.array(['1/1/2000', '1/2/2000', np.nan,
  652. '1/4/2000, 12:34:56'], dtype=object)
  653. expected = np.empty(4, dtype='M8[ns]')
  654. for i, val in enumerate(strings):
  655. if com.isnull(val):
  656. expected[i] = iNaT
  657. else:
  658. expected[i] = parse_date(val)
  659. result = tslib.array_to_datetime(strings)
  660. assert_almost_equal(result, expected)
  661. result2 = to_datetime(strings)
  662. tm.assert_isinstance(result2, DatetimeIndex)
  663. assert_almost_equal(result, result2)
  664. malformed = np.array(['1/100/2000', np.nan], dtype=object)
  665. result = to_datetime(malformed)
  666. assert_almost_equal(result, malformed)
  667. self.assertRaises(ValueError, to_datetime, malformed,
  668. errors='raise')
  669. idx = ['a', 'b', 'c', 'd', 'e']
  670. series = Series(['1/1/2000', np.nan, '1/3/2000', np.nan,
  671. '1/5/2000'], index=idx, name='foo')
  672. dseries = Series([to_datetime('1/1/2000'), np.nan,
  673. to_datetime('1/3/2000'), np.nan,
  674. to_datetime('1/5/2000')], index=idx, name='foo')
  675. result = to_datetime(series)
  676. dresult = to_datetime(dseries)
  677. expected = Series(np.empty(5, dtype='M8[ns]'), index=idx)
  678. for i in range(5):
  679. x = series[i]
  680. if isnull(x):
  681. expected[i] = iNaT
  682. else:
  683. expected[i] = to_datetime(x)
  684. assert_series_equal(result, expected)
  685. self.assertEqual(result.name, 'foo')
  686. assert_series_equal(dresult, expected)
  687. self.assertEqual(dresult.name, 'foo')
  688. def test_to_datetime_iso8601(self):
  689. result = to_datetime(["2012-01-01 00:00:00"])
  690. exp = Timestamp("2012-01-01 00:00:00")
  691. self.assertEqual(result[0], exp)
  692. result = to_datetime(['20121001']) # bad iso 8601
  693. exp = Timestamp('2012-10-01')
  694. self.assertEqual(result[0], exp)
  695. def test_to_datetime_default(self):
  696. rs = to_datetime('2001')
  697. xp = datetime(2001, 1, 1)
  698. self.assertTrue(rs, xp)
  699. #### dayfirst is essentially broken
  700. #### to_datetime('01-13-2012', dayfirst=True)
  701. #### self.assertRaises(ValueError, to_datetime('01-13-2012', dayfirst=True))
  702. def test_to_datetime_on_datetime64_series(self):
  703. # #2699
  704. s = Series(date_range('1/1/2000', periods=10))
  705. result = to_datetime(s)
  706. self.assertEqual(result[0], s[0])
  707. def test_to_datetime_with_apply(self):
  708. # this is only locale tested with US/None locales
  709. _skip_if_has_locale()
  710. # GH 5195
  711. # with a format and coerce a single item to_datetime fails
  712. td = Series(['May 04', 'Jun 02', 'Dec 11'], index=[1,2,3])
  713. expected = pd.to_datetime(td, format='%b %y')
  714. result = td.apply(pd.to_datetime, format='%b %y')
  715. assert_series_equal(result, expected)
  716. td = pd.Series(['May 04', 'Jun 02', ''], index=[1,2,3])
  717. self.assertRaises(ValueError, lambda : pd.to_datetime(td,format='%b %y'))
  718. self.assertRaises(ValueError, lambda : td.apply(pd.to_datetime, format='%b %y'))
  719. expected = pd.to_datetime(td, format='%b %y', coerce=True)
  720. result = td.apply(lambda x: pd.to_datetime(x, format='%b %y', coerce=True))
  721. assert_series_equal(result, expected)
  722. def test_nat_vector_field_access(self):
  723. idx = DatetimeIndex(['1/1/2000', None, None, '1/4/2000'])
  724. fields = ['year', 'quarter', 'month', 'day', 'hour',
  725. 'minute', 'second', 'microsecond', 'nanosecond',
  726. 'week', 'dayofyear']
  727. for field in fields:
  728. result = getattr(idx, field)
  729. expected = [getattr(x, field) if x is not NaT else -1
  730. for x in idx]
  731. self.assert_numpy_array_equal(result, expected)
  732. def test_nat_scalar_field_access(self):
  733. fields = ['year', 'quarter', 'month', 'day', 'hour',
  734. 'minute', 'second', 'microsecond', 'nanosecond',
  735. 'week', 'dayofyear']
  736. for field in fields:
  737. result = getattr(NaT, field)
  738. self.assertEqual(result, -1)
  739. self.assertEqual(NaT.weekday(), -1)
  740. def test_to_datetime_types(self):
  741. # empty string
  742. result = to_datetime('')
  743. self.assertIs(result, NaT)
  744. result = to_datetime(['', ''])
  745. self.assertTrue(isnull(result).all())
  746. # ints
  747. result = Timestamp(0)
  748. expected = to_datetime(0)
  749. self.assertEqual(result, expected)
  750. # GH 3888 (strings)
  751. expected = to_datetime(['2012'])[0]
  752. result = to_datetime('2012')
  753. self.assertEqual(result, expected)
  754. ### array = ['2012','20120101','20120101 12:01:01']
  755. array = ['20120101','20120101 12:01:01']
  756. expected = list(to_datetime(array))
  757. result = lmap(Timestamp,array)
  758. tm.assert_almost_equal(result,expected)
  759. ### currently fails ###
  760. ### result = Timestamp('2012')
  761. ### expected = to_datetime('2012')
  762. ### self.assertEqual(result, expected)
  763. def test_to_datetime_unprocessable_input(self):
  764. # GH 4928
  765. self.assert_numpy_array_equal(
  766. to_datetime([1, '1']),
  767. np.array([1, '1'], dtype='O')
  768. )
  769. self.assertRaises(TypeError, to_datetime, [1, '1'], errors='raise')
  770. def test_to_datetime_other_datetime64_units(self):
  771. # 5/25/2012
  772. scalar = np.int64(1337904000000000).view('M8[us]')
  773. as_obj = scalar.astype('O')
  774. index = DatetimeIndex([scalar])
  775. self.assertEqual(index[0], scalar.astype('O'))
  776. value = Timestamp(scalar)
  777. self.assertEqual(value, as_obj)
  778. def test_to_datetime_list_of_integers(self):
  779. rng = date_range('1/1/2000', periods=20)
  780. rng = DatetimeIndex(rng.values)
  781. ints = list(rng.asi8)
  782. result = DatetimeIndex(ints)
  783. self.assertTrue(rng.equals(result))
  784. def test_to_datetime_dt64s(self):
  785. in_bound_dts = [
  786. np.datetime64('2000-01-01'),
  787. np.datetime64('2000-01-02'),
  788. ]
  789. for dt in in_bound_dts:
  790. self.assertEqual(
  791. pd.to_datetime(dt),
  792. Timestamp(dt)
  793. )
  794. oob_dts = [
  795. np.datetime64('1000-01-01'),
  796. np.datetime64('5000-01-02'),
  797. ]
  798. for dt in oob_dts:
  799. self.assertRaises(ValueError, pd.to_datetime, dt, errors='raise')
  800. self.assertRaises(ValueError, tslib.Timestamp, dt)
  801. self.assertIs(pd.to_datetime(dt, coerce=True), NaT)
  802. def test_to_datetime_array_of_dt64s(self):
  803. dts = [
  804. np.datetime64('2000-01-01'),
  805. np.datetime64('2000-01-02'),
  806. ]
  807. # Assuming all datetimes are in bounds, to_datetime() returns
  808. # an array that is equal to Timestamp() parsing
  809. self.assert_numpy_array_equal(
  810. pd.to_datetime(dts, box=False),
  811. np.array([Timestamp(x).asm8 for x in dts])
  812. )
  813. # A list of datetimes where the last one is out of bounds
  814. dts_with_oob = dts + [np.datetime64('9999-01-01')]
  815. self.assertRaises(
  816. ValueError,
  817. pd.to_datetime,
  818. dts_with_oob,
  819. coerce=False,
  820. errors='raise'
  821. )
  822. self.assert_numpy_array_equal(
  823. pd.to_datetime(dts_with_oob, box=False, coerce=True),
  824. np.array(
  825. [
  826. Timestamp(dts_with_oob[0]).asm8,
  827. Timestamp(dts_with_oob[1]).asm8,
  828. iNaT,
  829. ],
  830. dtype='M8'
  831. )
  832. )
  833. # With coerce=False and errors='ignore', out of bounds datetime64s
  834. # are converted to their .item(), which depending on the version of
  835. # numpy is either a python datetime.datetime or datetime.date
  836. self.assert_numpy_array_equal(
  837. pd.to_datetime(dts_with_oob, box=False, coerce=False),
  838. np.array(
  839. [dt.item() for dt in dts_with_oob],
  840. dtype='O'
  841. )
  842. )
  843. def test_index_to_datetime(self):
  844. idx = Index(['1/1/2000', '1/2/2000', '1/3/2000'])
  845. result = idx.to_datetime()
  846. expected = DatetimeIndex(datetools.to_datetime(idx.values))
  847. self.assertTrue(result.equals(expected))
  848. today = datetime.today()
  849. idx = Index([today], dtype=object)
  850. result = idx.to_datetime()
  851. expected = DatetimeIndex([today])
  852. self.assertTrue(result.equals(expected))
  853. def test_to_datetime_freq(self):
  854. xp = bdate_range('2000-1-1', periods=10, tz='UTC')
  855. rs = xp.to_datetime()
  856. self.assertEqual(xp.freq, rs.freq)
  857. self.assertEqual(xp.tzinfo, rs.tzinfo)
  858. def test_range_misspecified(self):
  859. # GH #1095
  860. self.assertRaises(ValueError, date_range, '1/1/2000')
  861. self.assertRaises(ValueError, date_range, end='1/1/2000')
  862. self.assertRaises(ValueError, date_range, periods=10)
  863. self.assertRaises(ValueError, date_range, '1/1/2000', freq='H')
  864. self.assertRaises(ValueError, date_range, end='1/1/2000', freq='H')
  865. self.assertRaises(ValueError, date_range, periods=10, freq='H')
  866. def test_reasonable_keyerror(self):
  867. # GH #1062
  868. index = DatetimeIndex(['1/3/2000'])
  869. try:
  870. index.get_loc('1/1/2000')
  871. except KeyError as e:
  872. self.assertIn('2000', str(e))
  873. def test_reindex_with_datetimes(self):
  874. rng = date_range('1/1/2000', periods=20)
  875. ts = Series(np.random.randn(20), index=rng)
  876. result = ts.reindex(list(ts.index[5:10]))
  877. expected = ts[5:10]
  878. tm.assert_series_equal(result, expected)
  879. result = ts[list(ts.index[5:10])]
  880. tm.assert_series_equal(result, expected)
  881. def test_promote_datetime_date(self):
  882. rng = date_range('1/1/2000', periods=20)
  883. ts = Series(np.random.randn(20), index=rng)
  884. ts_slice = ts[5:]
  885. ts2 = ts_slice.copy()
  886. ts2.index = [x.date() for x in ts2.index]
  887. result = ts + ts2
  888. result2 = ts2 + ts
  889. expected = ts + ts[5:]
  890. assert_series_equal(result, expected)
  891. assert_series_equal(result2, expected)
  892. # test asfreq
  893. result = ts2.asfreq('4H', method='ffill')
  894. expected = ts[5:].asfreq('4H', method='ffill')
  895. assert_series_equal(result, expected)
  896. result = rng.get_indexer(ts2.index)
  897. expected = rng.get_indexer(ts_slice.index)
  898. self.assert_numpy_array_equal(result, expected)
  899. def test_asfreq_normalize(self):
  900. rng = date_range('1/1/2000 09:30', periods=20)
  901. norm = date_range('1/1/2000', periods=20)
  902. vals = np.random.randn(20)
  903. ts = Series(vals, index=rng)
  904. result = ts.asfreq('D', normalize=True)
  905. norm = date_range('1/1/2000', periods=20)
  906. expected = Series(vals, index=norm)
  907. assert_series_equal(result, expected)
  908. vals = np.random.randn(20, 3)
  909. ts = DataFrame(vals, index=rng)
  910. result = ts.asfreq('D', normalize=True)
  911. expected = DataFrame(vals, index=norm)
  912. assert_frame_equal(result, expected)
  913. def test_date_range_gen_error(self):
  914. rng = date_range('1/1/2000 00:00', '1/1/2000 00:18', freq='5min')
  915. self.assertEqual(len(rng), 4)
  916. def test_first_subset(self):
  917. ts = _simple_ts('1/1/2000', '1/1/2010', freq='12h')
  918. result = ts.first('10d')
  919. self.assertEqual(len(result), 20)
  920. ts = _simple_ts('1/1/2000', '1/1/2010')
  921. result = ts.first('10d')
  922. self.assertEqual(len(result), 10)
  923. result = ts.first('3M')
  924. expected = ts[:'3/31/2000']
  925. assert_series_equal(result, expected)
  926. result = ts.first('21D')
  927. expected = ts[:21]
  928. assert_series_equal(result, expected)
  929. result = ts[:0].first('3M')
  930. assert_series_equal(result, ts[:0])
  931. def test_last_subset(self):
  932. ts = _simple_ts('1/1/2000', '1/1/2010', freq='12h')
  933. result = ts.last('10d')
  934. self.assertEqual(len(result), 20)
  935. ts = _simple_ts('1/1/2000', '1/1/2010')
  936. result = ts.last('10d')
  937. self.assertEqual(len(result), 10)
  938. result = ts.last('21D')
  939. expected = ts['12/12/2009':]
  940. assert_series_equal(result, expected)
  941. result = ts.last('21D')
  942. expected = ts[-21:]
  943. assert_series_equal(result, expected)
  944. result = ts[:0].last('3M')
  945. assert_series_equal(result, ts[:0])
  946. def test_add_offset(self):
  947. rng = date_range('1/1/2000', '2/1/2000')
  948. result = rng + offsets.Hour(2)
  949. expected = date_range('1/1/2000 02:00', '2/1/2000 02:00')
  950. self.assertTrue(result.equals(expected))
  951. def test_format_pre_1900_dates(self):
  952. rng = date_range('1/1/1850', '1/1/1950', freq='A-DEC')
  953. rng.format()
  954. ts = Series(1, index=rng)
  955. repr(ts)
  956. def test_repeat(self):
  957. rng = date_range('1/1/2000', '1/1/2001')
  958. result = rng.repeat(5)
  959. self.assertIsNone(result.freq)
  960. self.assertEqual(len(result), 5 * len(rng))
  961. def test_at_time(self):
  962. rng = date_range('1/1/2000', '1/5/2000', freq='5min')
  963. ts = Series(np.random.randn(len(rng)), index=rng)
  964. rs = ts.at_time(rng[1])
  965. self.assertTrue((rs.index.hour == rng[1].hour).all())
  966. self.assertTrue((rs.index.minute == rng[1].minute).all())
  967. self.assertTrue((rs.index.second == rng[1].second).all())
  968. result = ts.at_time('9:30')
  969. expected = ts.at_time(time(9, 30))
  970. assert_series_equal(result, expected)
  971. df = DataFrame(np.random.randn(len(rng), 3), index=rng)
  972. result = ts[time(9, 30)]
  973. result_df = df.ix[time(9, 30)]
  974. expected = ts[(rng.hour == 9) & (rng.minute == 30)]
  975. exp_df = df[(rng.hour == 9) & (rng.minute == 30)]
  976. # expected.index = date_range('1/1/2000', '1/4/2000')
  977. assert_series_equal(result, expected)
  978. tm.assert_frame_equal(result_df, exp_df)
  979. chunk = df.ix['1/4/2000':]
  980. result = chunk.ix[time(9, 30)]
  981. expected = result_df[-1:]
  982. tm.assert_frame_equal(result, expected)
  983. # midnight, everything
  984. rng = date_range('1/1/2000', '1/31/2000')
  985. ts = Series(np.random.randn(len(rng)), index=rng)
  986. result = ts.at_time(time(0, 0))
  987. assert_series_equal(result, ts)
  988. # time doesn't exist
  989. rng = date_range('1/1/2012', freq='23Min', periods=384)
  990. ts = Series(np.random.randn(len(rng)), rng)
  991. rs = ts.at_time('16:00')
  992. self.assertEqual(len(rs), 0)
  993. def test_at_time_frame(self):
  994. rng = date_range('1/1/2000', '1/5/2000', freq='5min')
  995. ts = DataFrame(np.random.randn(len(rng), 2), index=rng)
  996. rs = ts.at_time(rng[1])
  997. self.assertTrue((rs.index.hour == rng[1].hour).all())
  998. self.assertTrue((rs.index.minute == rng[1].minute).all())
  999. self.assertTrue((rs.index.second == rng[1].second).all())
  1000. result = ts.at_time('9:30')
  1001. expected = ts.at_time(time(9, 30))
  1002. assert_frame_equal(result, expected)
  1003. result = ts.ix[time(9, 30)]
  1004. expected = ts.ix[(rng.hour == 9) & (rng.minute == 30)]
  1005. assert_frame_equal(result, expected)
  1006. # midnight, everything
  1007. rng = date_range('1/1/2000', '1/31/2000')
  1008. ts = DataFrame(np.random.randn(len(rng), 3), index=rng)
  1009. result = ts.at_time(time(0, 0))
  1010. assert_frame_equal(result, ts)
  1011. # time doesn't exist
  1012. rng = date_range('1/1/2012', freq='23Min', periods=384)
  1013. ts = DataFrame(np.random.randn(len(rng), 2), rng)
  1014. rs = ts.at_time('16:00')
  1015. self.assertEqual(len(rs), 0)
  1016. def test_between_time(self):
  1017. rng = date_range('1/1/2000', '1/5/2000', freq='5min')
  1018. ts = Series(np.random.randn(len(rng)), index=rng)
  1019. stime = time(0, 0)
  1020. etime = time(1, 0)
  1021. close_open = product([True, False], [True, False])
  1022. for inc_start, inc_end in close_open:
  1023. filtered = ts.between_time(stime, etime, inc_start, inc_end)
  1024. exp_len = 13 * 4 + 1
  1025. if not inc_start:
  1026. exp_len -= 5
  1027. if not inc_end:
  1028. exp_len -= 4
  1029. self.assertEqual(len(filtered), exp_len)
  1030. for rs in filtered.index:
  1031. t = rs.time()
  1032. if inc_start:
  1033. self.assertTrue(t >= stime)
  1034. else:
  1035. self.assertTrue(t > stime)
  1036. if inc_end:
  1037. self.assertTrue(t <= etime)
  1038. else:
  1039. self.assertTrue(t < etime)
  1040. result = ts.between_time('00:00', '01:00')
  1041. expected = ts.between_time(stime, etime)
  1042. assert_series_equal(result, expected)
  1043. # across midnight
  1044. rng = date_range('1/1/2000', '1/5/2000', freq='5min')
  1045. ts = Series(np.random.randn(len(rng)), index=rng)
  1046. stime = time(22, 0)
  1047. etime = time(9, 0)
  1048. close_open = product([True, False], [True, False])
  1049. for inc_start, inc_end in close_open:
  1050. filtered = ts.between_time(stime, etime, inc_start, inc_end)
  1051. exp_len = (12 * 11 + 1) * 4 + 1
  1052. if not inc_start:
  1053. exp_len -= 4
  1054. if not inc_end:
  1055. exp_len -= 4
  1056. self.assertEqual(len(filtered), exp_len)
  1057. for rs in filtered.index:
  1058. t = rs.time()
  1059. if inc_start:
  1060. self.assertTrue((t >= stime) or (t <= etime))
  1061. else:
  1062. self.assertTrue((t > stime) or (t <= etime))
  1063. if inc_end:
  1064. self.assertTrue((t <= etime) or (t >= stime))
  1065. else:
  1066. self.assertTrue((t < etime) or (t >= stime))
  1067. def test_between_time_frame(self):
  1068. rng = date_range('1/1/2000', '1/5/2000', freq='5min')
  1069. ts = DataFrame(np.random.randn(len(rng), 2), index=rng)
  1070. stime = time(0, 0)
  1071. etime = time(1, 0)
  1072. close_open = product([True, False], [True, False])
  1073. for inc_start, inc_end in close_open:
  1074. filtered = ts.between_time(stime, etime, inc_start, inc_end)
  1075. exp_len = 13 * 4 + 1
  1076. if not inc_start:
  1077. exp_len -= 5
  1078. if not inc_end:
  1079. exp_len -= 4
  1080. self.assertEqual(len(filtered), exp_len)
  1081. for rs in filtered.index:
  1082. t = rs.time()
  1083. if inc_start:
  1084. self.assertTrue(t >= stime)
  1085. else:
  1086. self.assertTrue(t > stime)
  1087. if inc_end:
  1088. self.assertTrue(t <= etime)
  1089. else:
  1090. self.assertTrue(t < etime)
  1091. result = ts.between_time('00:00', '01:00')
  1092. expected = ts.between_time(stime, etime)
  1093. assert_frame_equal(result, expected)
  1094. # across midnight
  1095. rng = date_range('1/1/2000', '1/5/2000', freq='5min')
  1096. ts = DataFrame(np.random.randn(len(rng), 2), index=rng)
  1097. stime = time(22, 0)
  1098. etime = time(9, 0)
  1099. close_open = product([True, False], [True, False])
  1100. for inc_start, inc_end in close_open:
  1101. filtered = ts.between_time(stime, etime, inc_start, inc_end)
  1102. exp_len = (12 * 11 + 1) * 4 + 1
  1103. if not inc_start:
  1104. exp_len -= 4
  1105. if not inc_end:
  1106. exp_len -= 4
  1107. self.assertEqual(len(filtered), exp_len)
  1108. for rs in filtered.index:
  1109. t = rs.time()
  1110. if inc_start:
  1111. self.assertTrue((t >= stime) or (t <= etime))
  1112. else:
  1113. self.assertTrue((t > stime) or (t <= etime))
  1114. if inc_end:

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