PageRenderTime 83ms CodeModel.GetById 19ms RepoModel.GetById 0ms app.codeStats 2ms

/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
  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:
  1115. self.assertTrue((t <= etime) or (t >= stime))
  1116. else:
  1117. self.assertTrue((t < etime) or (t >= stime))
  1118. def test_dti_constructor_preserve_dti_freq(self):
  1119. rng = date_range('1/1/2000', '1/2/2000', freq='5min')
  1120. rng2 = DatetimeIndex(rng)
  1121. self.assertEqual(rng.freq, rng2.freq)
  1122. def test_normalize(self):
  1123. rng = date_range('1/1/2000 9:30', periods=10, freq='D')
  1124. result = rng.normalize()
  1125. expected = date_range('1/1/2000', periods=10, freq='D')
  1126. self.assertTrue(result.equals(expected))
  1127. rng_ns = pd.DatetimeIndex(np.array([1380585623454345752, 1380585612343234312]).astype("datetime64[ns]"))
  1128. rng_ns_normalized = rng_ns.normalize()
  1129. expected = pd.DatetimeIndex(np.array([1380585600000000000, 1380585600000000000]).astype("datetime64[ns]"))
  1130. self.assertTrue(rng_ns_normalized.equals(expected))
  1131. self.assertTrue(result.is_normalized)
  1132. self.assertFalse(rng.is_normalized)
  1133. def test_to_period(self):
  1134. from pandas.tseries.period import period_range
  1135. ts = _simple_ts('1/1/2000', '1/1/2001')
  1136. pts = ts.to_period()
  1137. exp = ts.copy()
  1138. exp.index = period_range('1/1/2000', '1/1/2001')
  1139. assert_series_equal(pts, exp)
  1140. pts = ts.to_period('M')
  1141. exp.index = exp.index.asfreq('M')
  1142. self.assertTrue(pts.index.equals(exp.index.asfreq('M')))
  1143. assert_series_equal(pts, exp)
  1144. # GH 7606 without freq
  1145. idx = DatetimeIndex(['2011-01-01', '2011-01-02', '2011-01-03', '2011-01-04'])
  1146. exp_idx = pd.PeriodIndex(['2011-01-01', '2011-01-02', '2011-01-03',
  1147. '2011-01-04'], freq='D')
  1148. s = Series(np.random.randn(4), index=idx)
  1149. expected = s.copy()
  1150. expected.index = exp_idx
  1151. assert_series_equal(s.to_period(), expected)
  1152. df = DataFrame(np.random.randn(4, 4), index=idx, columns=idx)
  1153. expected = df.copy()
  1154. expected.index = exp_idx
  1155. assert_frame_equal(df.to_period(), expected)
  1156. expected = df.copy()
  1157. expected.columns = exp_idx
  1158. assert_frame_equal(df.to_period(axis=1), expected)
  1159. def create_dt64_based_index(self):
  1160. data = [Timestamp('2007-01-01 10:11:12.123456Z'),
  1161. Timestamp('2007-01-01 10:11:13.789123Z')]
  1162. index = DatetimeIndex(data)
  1163. return index
  1164. def test_to_period_millisecond(self):
  1165. index = self.create_dt64_based_index()
  1166. period = index.to_period(freq='L')
  1167. self.assertEqual(2, len(period))
  1168. self.assertEqual(period[0], Period('2007-01-01 10:11:12.123Z', 'L'))
  1169. self.assertEqual(period[1], Period('2007-01-01 10:11:13.789Z', 'L'))
  1170. def test_to_period_microsecond(self):
  1171. index = self.create_dt64_based_index()
  1172. period = index.to_period(freq='U')
  1173. self.assertEqual(2, len(period))
  1174. self.assertEqual(period[0], Period('2007-01-01 10:11:12.123456Z', 'U'))
  1175. self.assertEqual(period[1], Period('2007-01-01 10:11:13.789123Z', 'U'))
  1176. def test_to_period_tz_pytz(self):
  1177. tm._skip_if_no_pytz()
  1178. from dateutil.tz import tzlocal
  1179. from pytz import utc as UTC
  1180. xp = date_range('1/1/2000', '4/1/2000').to_period()
  1181. ts = date_range('1/1/2000', '4/1/2000', tz='US/Eastern')
  1182. result = ts.to_period()[0]
  1183. expected = ts[0].to_period()
  1184. self.assertEqual(result, expected)
  1185. self.assertTrue(ts.to_period().equals(xp))
  1186. ts = date_range('1/1/2000', '4/1/2000', tz=UTC)
  1187. result = ts.to_period()[0]
  1188. expected = ts[0].to_period()
  1189. self.assertEqual(result, expected)
  1190. self.assertTrue(ts.to_period().equals(xp))
  1191. ts = date_range('1/1/2000', '4/1/2000', tz=tzlocal())
  1192. result = ts.to_period()[0]
  1193. expected = ts[0].to_period()
  1194. self.assertEqual(result, expected)
  1195. self.assertTrue(ts.to_period().equals(xp))
  1196. def test_to_period_tz_explicit_pytz(self):
  1197. tm._skip_if_no_pytz()
  1198. import pytz
  1199. from dateutil.tz import tzlocal
  1200. xp = date_range('1/1/2000', '4/1/2000').to_period()
  1201. ts = date_range('1/1/2000', '4/1/2000', tz=pytz.timezone('US/Eastern'))
  1202. result = ts.to_period()[0]
  1203. expected = ts[0].to_period()
  1204. self.assert_(result == expected)
  1205. self.assert_(ts.to_period().equals(xp))
  1206. ts = date_range('1/1/2000', '4/1/2000', tz=pytz.utc)
  1207. result = ts.to_period()[0]
  1208. expected = ts[0].to_period()
  1209. self.assert_(result == expected)
  1210. self.assert_(ts.to_period().equals(xp))
  1211. ts = date_range('1/1/2000', '4/1/2000', tz=tzlocal())
  1212. result = ts.to_period()[0]
  1213. expected = ts[0].to_period()
  1214. self.assert_(result == expected)
  1215. self.assert_(ts.to_period().equals(xp))
  1216. def test_to_period_tz_dateutil(self):
  1217. tm._skip_if_no_dateutil()
  1218. import dateutil
  1219. from dateutil.tz import tzlocal
  1220. xp = date_range('1/1/2000', '4/1/2000').to_period()
  1221. ts = date_range('1/1/2000', '4/1/2000', tz='dateutil/US/Eastern')
  1222. result = ts.to_period()[0]
  1223. expected = ts[0].to_period()
  1224. self.assert_(result == expected)
  1225. self.assert_(ts.to_period().equals(xp))
  1226. ts = date_range('1/1/2000', '4/1/2000', tz=dateutil.tz.tzutc())
  1227. result = ts.to_period()[0]
  1228. expected = ts[0].to_period()
  1229. self.assert_(result == expected)
  1230. self.assert_(ts.to_period().equals(xp))
  1231. ts = date_range('1/1/2000', '4/1/2000', tz=tzlocal())
  1232. result = ts.to_period()[0]
  1233. expected = ts[0].to_period()
  1234. self.assert_(result == expected)
  1235. self.assert_(ts.to_period().equals(xp))
  1236. def test_frame_to_period(self):
  1237. K = 5
  1238. from pandas.tseries.period import period_range
  1239. dr = date_range('1/1/2000', '1/1/2001')
  1240. pr = period_range('1/1/2000', '1/1/2001')
  1241. df = DataFrame(randn(len(dr), K), index=dr)
  1242. df['mix'] = 'a'
  1243. pts = df.to_period()
  1244. exp = df.copy()
  1245. exp.index = pr
  1246. assert_frame_equal(pts, exp)
  1247. pts = df.to_period('M')
  1248. self.assertTrue(pts.index.equals(exp.index.asfreq('M')))
  1249. df = df.T
  1250. pts = df.to_period(axis=1)
  1251. exp = df.copy()
  1252. exp.columns = pr
  1253. assert_frame_equal(pts, exp)
  1254. pts = df.to_period('M', axis=1)
  1255. self.assertTrue(pts.columns.equals(exp.columns.asfreq('M')))
  1256. self.assertRaises(ValueError, df.to_period, axis=2)
  1257. def test_timestamp_fields(self):
  1258. # extra fields from DatetimeIndex like quarter and week
  1259. idx = tm.makeDateIndex(100)
  1260. fields = ['dayofweek', 'dayofyear', 'week', 'weekofyear', 'quarter', 'is_month_start', 'is_month_end', 'is_quarter_start', 'is_quarter_end', 'is_year_start', 'is_year_end']
  1261. for f in fields:
  1262. expected = getattr(idx, f)[-1]
  1263. result = getattr(Timestamp(idx[-1]), f)
  1264. self.assertEqual(result, expected)
  1265. self.assertEqual(idx.freq, Timestamp(idx[-1], idx.freq).freq)
  1266. self.assertEqual(idx.freqstr, Timestamp(idx[-1], idx.freq).freqstr)
  1267. def test_woy_boundary(self):
  1268. # make sure weeks at year boundaries are correct
  1269. d = datetime(2013,12,31)
  1270. result = Timestamp(d).week
  1271. expected = 1 # ISO standard
  1272. self.assertEqual(result, expected)
  1273. d = datetime(2008,12,28)
  1274. result = Timestamp(d).week
  1275. expected = 52 # ISO standard
  1276. self.assertEqual(result, expected)
  1277. d = datetime(2009,12,31)
  1278. result = Timestamp(d).week
  1279. expected = 53 # ISO standard
  1280. self.assertEqual(result, expected)
  1281. d = datetime(2010,1,1)
  1282. result = Timestamp(d).week
  1283. expected = 53 # ISO standard
  1284. self.assertEqual(result, expected)
  1285. d = datetime(2010,1,3)
  1286. result = Timestamp(d).week
  1287. expected = 53 # ISO standard
  1288. self.assertEqual(result, expected)
  1289. result = np.array([Timestamp(datetime(*args)).week for args in
  1290. [(2000,1,1),(2000,1,2),(2005,1,1),(2005,1,2)]])
  1291. self.assertTrue((result == [52, 52, 53, 53]).all())
  1292. def test_timestamp_date_out_of_range(self):
  1293. self.assertRaises(ValueError, Timestamp, '1676-01-01')
  1294. self.assertRaises(ValueError, Timestamp, '2263-01-01')
  1295. # 1475
  1296. self.assertRaises(ValueError, DatetimeIndex, ['1400-01-01'])
  1297. self.assertRaises(ValueError, DatetimeIndex, [datetime(1400, 1, 1)])
  1298. def test_timestamp_repr(self):
  1299. # pre-1900
  1300. stamp = Timestamp('1850-01-01', tz='US/Eastern')
  1301. repr(stamp)
  1302. iso8601 = '1850-01-01 01:23:45.012345'
  1303. stamp = Timestamp(iso8601, tz='US/Eastern')
  1304. result = repr(stamp)
  1305. self.assertIn(iso8601, result)
  1306. def test_timestamp_from_ordinal(self):
  1307. # GH 3042
  1308. dt = datetime(2011, 4, 16, 0, 0)
  1309. ts = Timestamp.fromordinal(dt.toordinal())
  1310. self.assertEqual(ts.to_pydatetime(), dt)
  1311. # with a tzinfo
  1312. stamp = Timestamp('2011-4-16', tz='US/Eastern')
  1313. dt_tz = stamp.to_pydatetime()
  1314. ts = Timestamp.fromordinal(dt_tz.toordinal(),tz='US/Eastern')
  1315. self.assertEqual(ts.to_pydatetime(), dt_tz)
  1316. def test_datetimeindex_integers_shift(self):
  1317. rng = date_range('1/1/2000', periods=20)
  1318. result = rng + 5
  1319. expected = rng.shift(5)
  1320. self.assertTrue(result.equals(expected))
  1321. result = rng - 5
  1322. expected = rng.shift(-5)
  1323. self.assertTrue(result.equals(expected))
  1324. def test_astype_object(self):
  1325. # NumPy 1.6.1 weak ns support
  1326. rng = date_range('1/1/2000', periods=20)
  1327. casted = rng.astype('O')
  1328. exp_values = list(rng)
  1329. self.assert_numpy_array_equal(casted, exp_values)
  1330. def test_catch_infinite_loop(self):
  1331. offset = datetools.DateOffset(minute=5)
  1332. # blow up, don't loop forever
  1333. self.assertRaises(Exception, date_range, datetime(2011, 11, 11),
  1334. datetime(2011, 11, 12), freq=offset)
  1335. def test_append_concat(self):
  1336. rng = date_range('5/8/2012 1:45', periods=10, freq='5T')
  1337. ts = Series(np.random.randn(len(rng)), rng)
  1338. df = DataFrame(np.random.randn(len(rng), 4), index=rng)
  1339. result = ts.append(ts)
  1340. result_df = df.append(df)
  1341. ex_index = DatetimeIndex(np.tile(rng.values, 2))
  1342. self.assertTrue(result.index.equals(ex_index))
  1343. self.assertTrue(result_df.index.equals(ex_index))
  1344. appended = rng.append(rng)
  1345. self.assertTrue(appended.equals(ex_index))
  1346. appended = rng.append([rng, rng])
  1347. ex_index = DatetimeIndex(np.tile(rng.values, 3))
  1348. self.assertTrue(appended.equals(ex_index))
  1349. # different index names
  1350. rng1 = rng.copy()
  1351. rng2 = rng.copy()
  1352. rng1.name = 'foo'
  1353. rng2.name = 'bar'
  1354. self.assertEqual(rng1.append(rng1).name, 'foo')
  1355. self.assertIsNone(rng1.append(rng2).name)
  1356. def test_append_concat_tz(self):
  1357. #GH 2938
  1358. tm._skip_if_no_pytz()
  1359. rng = date_range('5/8/2012 1:45', periods=10, freq='5T',
  1360. tz='US/Eastern')
  1361. rng2 = date_range('5/8/2012 2:35', periods=10, freq='5T',
  1362. tz='US/Eastern')
  1363. rng3 = date_range('5/8/2012 1:45', periods=20, freq='5T',
  1364. tz='US/Eastern')
  1365. ts = Series(np.random.randn(len(rng)), rng)
  1366. df = DataFrame(np.random.randn(len(rng), 4), index=rng)
  1367. ts2 = Series(np.random.randn(len(rng2)), rng2)
  1368. df2 = DataFrame(np.random.randn(len(rng2), 4), index=rng2)
  1369. result = ts.append(ts2)
  1370. result_df = df.append(df2)
  1371. self.assertTrue(result.index.equals(rng3))
  1372. self.assertTrue(result_df.index.equals(rng3))
  1373. appended = rng.append(rng2)
  1374. self.assertTrue(appended.equals(rng3))
  1375. def test_append_concat_tz_explicit_pytz(self):
  1376. # GH 2938
  1377. tm._skip_if_no_pytz()
  1378. from pytz import timezone as timezone
  1379. rng = date_range('5/8/2012 1:45', periods=10, freq='5T',
  1380. tz=timezone('US/Eastern'))
  1381. rng2 = date_range('5/8/2012 2:35', periods=10, freq='5T',
  1382. tz=timezone('US/Eastern'))
  1383. rng3 = date_range('5/8/2012 1:45', periods=20, freq='5T',
  1384. tz=timezone('US/Eastern'))
  1385. ts = Series(np.random.randn(len(rng)), rng)
  1386. df = DataFrame(np.random.randn(len(rng), 4), index=rng)
  1387. ts2 = Series(np.random.randn(len(rng2)), rng2)
  1388. df2 = DataFrame(np.random.randn(len(rng2), 4), index=rng2)
  1389. result = ts.append(ts2)
  1390. result_df = df.append(df2)
  1391. self.assert_(result.index.equals(rng3))
  1392. self.assert_(result_df.index.equals(rng3))
  1393. appended = rng.append(rng2)
  1394. self.assert_(appended.equals(rng3))
  1395. def test_append_concat_tz_dateutil(self):
  1396. # GH 2938
  1397. tm._skip_if_no_dateutil()
  1398. from dateutil.tz import gettz as timezone
  1399. rng = date_range('5/8/2012 1:45', periods=10, freq='5T',
  1400. tz='dateutil/US/Eastern')
  1401. rng2 = date_range('5/8/2012 2:35', periods=10, freq='5T',
  1402. tz='dateutil/US/Eastern')
  1403. rng3 = date_range('5/8/2012 1:45', periods=20, freq='5T',
  1404. tz='dateutil/US/Eastern')
  1405. ts = Series(np.random.randn(len(rng)), rng)
  1406. df = DataFrame(np.random.randn(len(rng), 4), index=rng)
  1407. ts2 = Series(np.random.randn(len(rng2)), rng2)
  1408. df2 = DataFrame(np.random.randn(len(rng2), 4), index=rng2)
  1409. result = ts.append(ts2)
  1410. result_df = df.append(df2)
  1411. self.assert_(result.index.equals(rng3))
  1412. self.assert_(result_df.index.equals(rng3))
  1413. appended = rng.append(rng2)
  1414. self.assert_(appended.equals(rng3))
  1415. def test_set_dataframe_column_ns_dtype(self):
  1416. x = DataFrame([datetime.now(), datetime.now()])
  1417. self.assertEqual(x[0].dtype, np.dtype('M8[ns]'))
  1418. def test_groupby_count_dateparseerror(self):
  1419. dr = date_range(start='1/1/2012', freq='5min', periods=10)
  1420. # BAD Example, datetimes first
  1421. s = Series(np.arange(10), index=[dr, lrange(10)])
  1422. grouped = s.groupby(lambda x: x[1] % 2 == 0)
  1423. result = grouped.count()
  1424. s = Series(np.arange(10), index=[lrange(10), dr])
  1425. grouped = s.groupby(lambda x: x[0] % 2 == 0)
  1426. expected = grouped.count()
  1427. assert_series_equal(result, expected)
  1428. def test_datetimeindex_repr_short(self):
  1429. dr = date_range(start='1/1/2012', periods=1)
  1430. repr(dr)
  1431. dr = date_range(start='1/1/2012', periods=2)
  1432. repr(dr)
  1433. dr = date_range(start='1/1/2012', periods=3)
  1434. repr(dr)
  1435. def test_constructor_int64_nocopy(self):
  1436. # #1624
  1437. arr = np.arange(1000, dtype=np.int64)
  1438. index = DatetimeIndex(arr)
  1439. arr[50:100] = -1
  1440. self.assertTrue((index.asi8[50:100] == -1).all())
  1441. arr = np.arange(1000, dtype=np.int64)
  1442. index = DatetimeIndex(arr, copy=True)
  1443. arr[50:100] = -1
  1444. self.assertTrue((index.asi8[50:100] != -1).all())
  1445. def test_series_interpolate_method_values(self):
  1446. # #1646
  1447. ts = _simple_ts('1/1/2000', '1/20/2000')
  1448. ts[::2] = np.nan
  1449. result = ts.interpolate(method='values')
  1450. exp = ts.interpolate()
  1451. assert_series_equal(result, exp)
  1452. def test_frame_datetime64_handling_groupby(self):
  1453. # it works!
  1454. df = DataFrame([(3, np.datetime64('2012-07-03')),
  1455. (3, np.datetime64('2012-07-04'))],
  1456. columns=['a', 'date'])
  1457. result = df.groupby('a').first()
  1458. self.assertEqual(result['date'][3], Timestamp('2012-07-03'))
  1459. def test_series_interpolate_intraday(self):
  1460. # #1698
  1461. index = pd.date_range('1/1/2012', periods=4, freq='12D')
  1462. ts = pd.Series([0, 12, 24, 36], index)
  1463. new_index = index.append(index + pd.DateOffset(days=1)).order()
  1464. exp = ts.reindex(new_index).interpolate(method='time')
  1465. index = pd.date_range('1/1/2012', periods=4, freq='12H')
  1466. ts = pd.Series([0, 12, 24, 36], index)
  1467. new_index = index.append(index + pd.DateOffset(hours=1)).order()
  1468. result = ts.reindex(new_index).interpolate(method='time')
  1469. self.assert_numpy_array_equal(result.values, exp.values)
  1470. def test_frame_dict_constructor_datetime64_1680(self):
  1471. dr = date_range('1/1/2012', periods=10)
  1472. s = Series(dr, index=dr)
  1473. # it works!
  1474. DataFrame({'a': 'foo', 'b': s}, index=dr)
  1475. DataFrame({'a': 'foo', 'b': s.values}, index=dr)
  1476. def test_frame_datetime64_mixed_index_ctor_1681(self):
  1477. dr = date_range('2011/1/1', '2012/1/1', freq='W-FRI')
  1478. ts = Series(dr)
  1479. # it works!
  1480. d = DataFrame({'A': 'foo', 'B': ts}, index=dr)
  1481. self.assertTrue(d['B'].isnull().all())
  1482. def test_frame_timeseries_to_records(self):
  1483. index = date_range('1/1/2000', periods=10)
  1484. df = DataFrame(np.random.randn(10, 3), index=index,
  1485. columns=['a', 'b', 'c'])
  1486. result = df.to_records()
  1487. result['index'].dtype == 'M8[ns]'
  1488. result = df.to_records(index=False)
  1489. def test_frame_datetime64_duplicated(self):
  1490. dates = date_range('2010-07-01', end='2010-08-05')
  1491. tst = DataFrame({'symbol': 'AAA', 'date': dates})
  1492. result = tst.duplicated(['date', 'symbol'])
  1493. self.assertTrue((-result).all())
  1494. tst = DataFrame({'date': dates})
  1495. result = tst.duplicated()
  1496. self.assertTrue((-result).all())
  1497. def test_timestamp_compare_with_early_datetime(self):
  1498. # e.g. datetime.min
  1499. stamp = Timestamp('2012-01-01')
  1500. self.assertFalse(stamp == datetime.min)
  1501. self.assertFalse(stamp == datetime(1600, 1, 1))
  1502. self.assertFalse(stamp == datetime(2700, 1, 1))
  1503. self.assertNotEqual(stamp, datetime.min)
  1504. self.assertNotEqual(stamp, datetime(1600, 1, 1))
  1505. self.assertNotEqual(stamp, datetime(2700, 1, 1))
  1506. self.assertTrue(stamp > datetime(1600, 1, 1))
  1507. self.assertTrue(stamp >= datetime(1600, 1, 1))
  1508. self.assertTrue(stamp < datetime(2700, 1, 1))
  1509. self.assertTrue(stamp <= datetime(2700, 1, 1))
  1510. def test_to_html_timestamp(self):
  1511. rng = date_range('2000-01-01', periods=10)
  1512. df = DataFrame(np.random.randn(10, 4), index=rng)
  1513. result = df.to_html()
  1514. self.assertIn('2000-01-01', result)
  1515. def test_to_csv_numpy_16_bug(self):
  1516. frame = DataFrame({'a': date_range('1/1/2000', periods=10)})
  1517. buf = StringIO()
  1518. frame.to_csv(buf)
  1519. result = buf.getvalue()
  1520. self.assertIn('2000-01-01', result)
  1521. def test_series_map_box_timestamps(self):
  1522. # #2689, #2627
  1523. s = Series(date_range('1/1/2000', periods=10))
  1524. def f(x):
  1525. return (x.hour, x.day, x.month)
  1526. # it works!
  1527. s.map(f)
  1528. s.apply(f)
  1529. DataFrame(s).applymap(f)
  1530. def test_concat_datetime_datetime64_frame(self):
  1531. # #2624
  1532. rows = []
  1533. rows.append([datetime(2010, 1, 1), 1])
  1534. rows.append([datetime(2010, 1, 2), 'hi'])
  1535. df2_obj = DataFrame.from_records(rows, columns=['date', 'test'])
  1536. ind = date_range(start="2000/1/1", freq="D", periods=10)
  1537. df1 = DataFrame({'date': ind, 'test':lrange(10)})
  1538. # it works!
  1539. pd.concat([df1, df2_obj])
  1540. def test_period_resample(self):
  1541. # GH3609
  1542. s = Series(range(100),index=date_range('20130101', freq='s', periods=100), dtype='float')
  1543. s[10:30] = np.nan
  1544. expected = Series([34.5, 79.5], index=[Period('2013-01-01 00:00', 'T'), Period('2013-01-01 00:01', 'T')])
  1545. result = s.to_period().resample('T', kind='period')
  1546. assert_series_equal(result, expected)
  1547. result2 = s.resample('T', kind='period')
  1548. assert_series_equal(result2, expected)
  1549. def test_period_resample_with_local_timezone_pytz(self):
  1550. # GH5430
  1551. tm._skip_if_no_pytz()
  1552. import pytz
  1553. local_timezone = pytz.timezone('America/Los_Angeles')
  1554. start = datetime(year=2013, month=11, day=1, hour=0, minute=0, tzinfo=pytz.utc)
  1555. # 1 day later
  1556. end = datetime(year=2013, month=11, day=2, hour=0, minute=0, tzinfo=pytz.utc)
  1557. index = pd.date_range(start, end, freq='H')
  1558. series = pd.Series(1, index=index)
  1559. series = series.tz_convert(local_timezone)
  1560. result = series.resample('D', kind='period')
  1561. # Create the expected series
  1562. expected_index = (pd.period_range(start=start, end=end, freq='D') - 1) # Index is moved back a day with the timezone conversion from UTC to Pacific
  1563. expected = pd.Series(1, index=expected_index)
  1564. assert_series_equal(result, expected)
  1565. def test_period_resample_with_local_timezone_dateutil(self):
  1566. # GH5430
  1567. tm._skip_if_no_dateutil()
  1568. import dateutil
  1569. local_timezone = 'dateutil/America/Los_Angeles'
  1570. start = datetime(year=2013, month=11, day=1, hour=0, minute=0, tzinfo=dateutil.tz.tzutc())
  1571. # 1 day later
  1572. end = datetime(year=2013, month=11, day=2, hour=0, minute=0, tzinfo=dateutil.tz.tzutc())
  1573. index = pd.date_range(start, end, freq='H')
  1574. series = pd.Series(1, index=index)
  1575. series = series.tz_convert(local_timezone)
  1576. result = series.resample('D', kind='period')
  1577. # Create the expected series
  1578. expected_index = (pd.period_range(start=start, end=end, freq='D') - 1) # Index is moved back a day with the timezone conversion from UTC to Pacific
  1579. expected = pd.Series(1, index=expected_index)
  1580. assert_series_equal(result, expected)
  1581. def test_pickle(self):
  1582. #GH4606
  1583. from pandas.compat import cPickle
  1584. import pickle
  1585. for pick in [pickle, cPickle]:
  1586. p = pick.loads(pick.dumps(NaT))
  1587. self.assertTrue(p is NaT)
  1588. idx = pd.to_datetime(['2013-01-01', NaT, '2014-01-06'])
  1589. idx_p = pick.loads(pick.dumps(idx))
  1590. self.assertTrue(idx_p[0] == idx[0])
  1591. self.assertTrue(idx_p[1] is NaT)
  1592. self.assertTrue(idx_p[2] == idx[2])
  1593. def _simple_ts(start, end, freq='D'):
  1594. rng = date_range(start, end, freq=freq)
  1595. return Series(np.random.randn(len(rng)), index=rng)
  1596. class TestDatetimeIndex(tm.TestCase):
  1597. _multiprocess_can_split_ = True
  1598. def test_hash_error(self):
  1599. index = date_range('20010101', periods=10)
  1600. with tm.assertRaisesRegexp(TypeError,
  1601. "unhashable type: %r" %
  1602. type(index).__name__):
  1603. hash(index)
  1604. def test_stringified_slice_with_tz(self):
  1605. #GH2658
  1606. import datetime
  1607. start=datetime.datetime.now()
  1608. idx=DatetimeIndex(start=start,freq="1d",periods=10)
  1609. df=DataFrame(lrange(10),index=idx)
  1610. df["2013-01-14 23:44:34.437768-05:00":] # no exception here
  1611. def test_append_join_nondatetimeindex(self):
  1612. rng = date_range('1/1/2000', periods=10)
  1613. idx = Index(['a', 'b', 'c', 'd'])
  1614. result = rng.append(idx)
  1615. tm.assert_isinstance(result[0], Timestamp)
  1616. # it works
  1617. rng.join(idx, how='outer')
  1618. def test_astype(self):
  1619. rng = date_range('1/1/2000', periods=10)
  1620. result = rng.astype('i8')
  1621. self.assert_numpy_array_equal(result, rng.asi8)
  1622. def test_to_period_nofreq(self):
  1623. idx = DatetimeIndex(['2000-01-01', '2000-01-02', '2000-01-04'])
  1624. self.assertRaises(ValueError, idx.to_period)
  1625. idx = DatetimeIndex(['2000-01-01', '2000-01-02', '2000-01-03'],
  1626. freq='infer')
  1627. self.assertEqual(idx.freqstr, 'D')
  1628. expected = pd.PeriodIndex(['2000-01-01', '2000-01-02', '2000-01-03'], freq='D')
  1629. self.assertTrue(idx.to_period().equals(expected))
  1630. # GH 7606
  1631. idx = DatetimeIndex(['2000-01-01', '2000-01-02', '2000-01-03'])
  1632. self.assertEqual(idx.freqstr, None)
  1633. self.assertTrue(idx.to_period().equals(expected))
  1634. def test_000constructor_resolution(self):
  1635. # 2252
  1636. t1 = Timestamp((1352934390 * 1000000000) + 1000000 + 1000 + 1)
  1637. idx = DatetimeIndex([t1])
  1638. self.assertEqual(idx.nanosecond[0], t1.nanosecond)
  1639. def test_constructor_coverage(self):
  1640. rng = date_range('1/1/2000', periods=10.5)
  1641. exp = date_range('1/1/2000', periods=10)
  1642. self.assertTrue(rng.equals(exp))
  1643. self.assertRaises(ValueError, DatetimeIndex, start='1/1/2000',
  1644. periods='foo', freq='D')
  1645. self.assertRaises(ValueError, DatetimeIndex, start='1/1/2000',
  1646. end='1/10/2000')
  1647. self.assertRaises(ValueError, DatetimeIndex, '1/1/2000')
  1648. # generator expression
  1649. gen = (datetime(2000, 1, 1) + timedelta(i) for i in range(10))
  1650. result = DatetimeIndex(gen)
  1651. expected = DatetimeIndex([datetime(2000, 1, 1) + timedelta(i)
  1652. for i in range(10)])
  1653. self.assertTrue(result.equals(expected))
  1654. # NumPy string array
  1655. strings = np.array(['2000-01-01', '2000-01-02', '2000-01-03'])
  1656. result = DatetimeIndex(strings)
  1657. expected = DatetimeIndex(strings.astype('O'))
  1658. self.assertTrue(result.equals(expected))
  1659. from_ints = DatetimeIndex(expected.asi8)
  1660. self.assertTrue(from_ints.equals(expected))
  1661. # non-conforming
  1662. self.assertRaises(ValueError, DatetimeIndex,
  1663. ['2000-01-01', '2000-01-02', '2000-01-04'],
  1664. freq='D')
  1665. self.assertRaises(ValueError, DatetimeIndex,
  1666. start='2011-01-01', freq='b')
  1667. self.assertRaises(ValueError, DatetimeIndex,
  1668. end='2011-01-01', freq='B')
  1669. self.assertRaises(ValueError, DatetimeIndex, periods=10, freq='D')
  1670. def test_constructor_name(self):
  1671. idx = DatetimeIndex(start='2000-01-01', periods=1, freq='A',
  1672. name='TEST')
  1673. self.assertEqual(idx.name, 'TEST')
  1674. def test_comparisons_coverage(self):
  1675. rng = date_range('1/1/2000', periods=10)
  1676. # raise TypeError for now
  1677. self.assertRaises(TypeError, rng.__lt__, rng[3].value)
  1678. result = rng == list(rng)
  1679. exp = rng == rng
  1680. self.assert_numpy_array_equal(result, exp)
  1681. def test_comparisons_nat(self):
  1682. fidx1 = pd.Index([1.0, np.nan, 3.0, np.nan, 5.0, 7.0])
  1683. fidx2 = pd.Index([2.0, 3.0, np.nan, np.nan, 6.0, 7.0])
  1684. didx1 = pd.DatetimeIndex(['2014-01-01', pd.NaT, '2014-03-01', pd.NaT,
  1685. '2014-05-01', '2014-07-01'])
  1686. didx2 = pd.DatetimeIndex(['2014-02-01', '2014-03-01', pd.NaT, pd.NaT,
  1687. '2014-06-01', '2014-07-01'])
  1688. darr = np.array([np.datetime64('2014-02-01 00:00Z'),
  1689. np.datetime64('2014-03-01 00:00Z'),
  1690. np.datetime64('nat'), np.datetime64('nat'),
  1691. np.datetime64('2014-06-01 00:00Z'),
  1692. np.datetime64('2014-07-01 00:00Z')])
  1693. if _np_version_under1p7:
  1694. # cannot test array because np.datetime('nat') returns today's date
  1695. cases = [(fidx1, fidx2), (didx1, didx2)]
  1696. else:
  1697. cases = [(fidx1, fidx2), (didx1, didx2), (didx1, darr)]
  1698. # Check pd.NaT is handles as the same as np.nan
  1699. for idx1, idx2 in cases:
  1700. result = idx1 < idx2
  1701. expected = np.array([True, False, False, False, True, False])
  1702. self.assert_numpy_array_equal(result, expected)
  1703. result = idx2 > idx1
  1704. expected = np.array([True, False, False, False, True, False])
  1705. self.assert_numpy_array_equal(result, expected)
  1706. result = idx1 <= idx2
  1707. expected = np.array([True, False, False, False, True, True])
  1708. self.assert_numpy_array_equal(result, expected)
  1709. result = idx2 >= idx1
  1710. expected = np.array([True, False, False, False, True, True])
  1711. self.assert_numpy_array_equal(result, expected)
  1712. result = idx1 == idx2
  1713. expected = np.array([False, False, False, False, False, True])
  1714. self.assert_numpy_array_equal(result, expected)
  1715. result = idx1 != idx2
  1716. expected = np.array([True, True, True, True, True, False])
  1717. self.assert_numpy_array_equal(result, expected)
  1718. for idx1, val in [(fidx1, np.nan), (didx1, pd.NaT)]:
  1719. result = idx1 < val
  1720. expected = np.array([False, False, False, False, False, False])
  1721. self.assert_numpy_array_equal(result, expected)
  1722. result = idx1 > val
  1723. self.assert_numpy_array_equal(result, expected)
  1724. result = idx1 <= val
  1725. self.assert_numpy_array_equal(result, expected)
  1726. result = idx1 >= val
  1727. self.assert_numpy_array_equal(result, expected)
  1728. result = idx1 == val
  1729. self.assert_numpy_array_equal(result, expected)
  1730. result = idx1 != val
  1731. expected = np.array([True, True, True, True, True, True])
  1732. self.assert_numpy_array_equal(result, expected)
  1733. # Check pd.NaT is handles as the same as np.nan
  1734. for idx1, val in [(fidx1, 3), (didx1, datetime(2014, 3, 1))]:
  1735. result = idx1 < val
  1736. expected = np.array([True, False, False, False, False, False])
  1737. self.assert_numpy_array_equal(result, expected)
  1738. result = idx1 > val
  1739. expected = np.array([False, False, False, False, True, True])
  1740. self.assert_numpy_array_equal(result, expected)
  1741. result = idx1 <= val
  1742. expected = np.array([True, False, True, False, False, False])
  1743. self.assert_numpy_array_equal(result, expected)
  1744. result = idx1 >= val
  1745. expected = np.array([False, False, True, False, True, True])
  1746. self.assert_numpy_array_equal(result, expected)
  1747. result = idx1 == val
  1748. expected = np.array([False, False, True, False, False, False])
  1749. self.assert_numpy_array_equal(result, expected)
  1750. result = idx1 != val
  1751. expected = np.array([True, True, False, True, True, True])
  1752. self.assert_numpy_array_equal(result, expected)
  1753. def test_map(self):
  1754. rng = date_range('1/1/2000', periods=10)
  1755. f = lambda x: x.strftime('%Y%m%d')
  1756. result = rng.map(f)
  1757. exp = [f(x) for x in rng]
  1758. self.assert_numpy_array_equal(result, exp)
  1759. def test_add_union(self):
  1760. rng = date_range('1/1/2000', periods=5)
  1761. rng2 = date_range('1/6/2000', periods=5)
  1762. result = rng + rng2
  1763. expected = rng.union(rng2)
  1764. self.assertTrue(result.equals(expected))
  1765. def test_misc_coverage(self):
  1766. rng = date_range('1/1/2000', periods=5)
  1767. result = rng.groupby(rng.day)
  1768. tm.assert_isinstance(list(result.values())[0][0], Timestamp)
  1769. idx = DatetimeIndex(['2000-01-03', '2000-01-01', '2000-01-02'])
  1770. self.assertTrue(idx.equals(list(idx)))
  1771. non_datetime = Index(list('abc'))
  1772. self.assertFalse(idx.equals(list(non_datetime)))
  1773. def test_union_coverage(self):
  1774. idx = DatetimeIndex(['2000-01-03', '2000-01-01', '2000-01-02'])
  1775. ordered = DatetimeIndex(idx.order(), freq='infer')
  1776. result = ordered.union(idx)
  1777. self.assertTrue(result.equals(ordered))
  1778. result = ordered[:0].union(ordered)
  1779. self.assertTrue(result.equals(ordered))
  1780. self.assertEqual(result.freq, ordered.freq)
  1781. def test_union_bug_1730(self):
  1782. rng_a = date_range('1/1/2012', periods=4, freq='3H')
  1783. rng_b = date_range('1/1/2012', periods=4, freq='4H')
  1784. result = rng_a.union(rng_b)
  1785. exp = DatetimeIndex(sorted(set(list(rng_a)) | set(list(rng_b))))
  1786. self.assertTrue(result.equals(exp))
  1787. def test_union_bug_1745(self):
  1788. left = DatetimeIndex(['2012-05-11 15:19:49.695000'])
  1789. right = DatetimeIndex(['2012-05-29 13:04:21.322000',
  1790. '2012-05-11 15:27:24.873000',
  1791. '2012-05-11 15:31:05.350000'])
  1792. result = left.union(right)
  1793. exp = DatetimeIndex(sorted(set(list(left)) | set(list(right))))
  1794. self.assertTrue(result.equals(exp))
  1795. def test_union_bug_4564(self):
  1796. from pandas import DateOffset
  1797. left = date_range("2013-01-01", "2013-02-01")
  1798. right = left + DateOffset(minutes=15)
  1799. result = left.union(right)
  1800. exp = DatetimeIndex(sorted(set(list(left)) | set(list(right))))
  1801. self.assertTrue(result.equals(exp))
  1802. def test_intersection_bug_1708(self):
  1803. from pandas import DateOffset
  1804. index_1 = date_range('1/1/2012', periods=4, freq='12H')
  1805. index_2 = index_1 + DateOffset(hours=1)
  1806. result = index_1 & index_2
  1807. self.assertEqual(len(result), 0)
  1808. # def test_add_timedelta64(self):
  1809. # rng = date_range('1/1/2000', periods=5)
  1810. # delta = rng.values[3] - rng.values[1]
  1811. # result = rng + delta
  1812. # expected = rng + timedelta(2)
  1813. # self.assertTrue(result.equals(expected))
  1814. def test_get_duplicates(self):
  1815. idx = DatetimeIndex(['2000-01-01', '2000-01-02', '2000-01-02',
  1816. '2000-01-03', '2000-01-03', '2000-01-04'])
  1817. result = idx.get_duplicates()
  1818. ex = DatetimeIndex(['2000-01-02', '2000-01-03'])
  1819. self.assertTrue(result.equals(ex))
  1820. def test_argmin_argmax(self):
  1821. idx = DatetimeIndex(['2000-01-04', '2000-01-01', '2000-01-02'])
  1822. self.assertEqual(idx.argmin(), 1)
  1823. self.assertEqual(idx.argmax(), 0)
  1824. def test_order(self):
  1825. idx = DatetimeIndex(['2000-01-04', '2000-01-01', '2000-01-02'])
  1826. ordered = idx.order()
  1827. self.assertTrue(ordered.is_monotonic)
  1828. ordered = idx.order(ascending=False)
  1829. self.assertTrue(ordered[::-1].is_monotonic)
  1830. ordered, dexer = idx.order(return_indexer=True)
  1831. self.assertTrue(ordered.is_monotonic)
  1832. self.assert_numpy_array_equal(dexer, [1, 2, 0])
  1833. ordered, dexer = idx.order(return_indexer=True, ascending=False)
  1834. self.assertTrue(ordered[::-1].is_monotonic)
  1835. self.assert_numpy_array_equal(dexer, [0, 2, 1])
  1836. def test_insert(self):
  1837. idx = DatetimeIndex(['2000-01-04', '2000-01-01', '2000-01-02'], name='idx')
  1838. result = idx.insert(2, datetime(2000, 1, 5))
  1839. exp = DatetimeIndex(['2000-01-04', '2000-01-01', '2000-01-05',
  1840. '2000-01-02'], name='idx')
  1841. self.assertTrue(result.equals(exp))
  1842. # insertion of non-datetime should coerce to object index
  1843. result = idx.insert(1, 'inserted')
  1844. expected = Index([datetime(2000, 1, 4), 'inserted', datetime(2000, 1, 1),
  1845. datetime(2000, 1, 2)], name='idx')
  1846. self.assertNotIsInstance(result, DatetimeIndex)
  1847. tm.assert_index_equal(result, expected)
  1848. self.assertEqual(result.name, expected.name)
  1849. idx = date_range('1/1/2000', periods=3, freq='M', name='idx')
  1850. # preserve freq
  1851. expected_0 = DatetimeIndex(['1999-12-31', '2000-01-31', '2000-02-29',
  1852. '2000-03-31'], name='idx', freq='M')
  1853. expected_3 = DatetimeIndex(['2000-01-31', '2000-02-29', '2000-03-31',
  1854. '2000-04-30'], name='idx', freq='M')
  1855. # reset freq to None
  1856. expected_1_nofreq = DatetimeIndex(['2000-01-31', '2000-01-31', '2000-02-29',
  1857. '2000-03-31'], name='idx', freq=None)
  1858. expected_3_nofreq = DatetimeIndex(['2000-01-31', '2000-02-29', '2000-03-31',
  1859. '2000-01-02'], name='idx', freq=None)
  1860. cases = [(0, datetime(1999, 12, 31), expected_0),
  1861. (-3, datetime(1999, 12, 31), expected_0),
  1862. (3, datetime(2000, 4, 30), expected_3),
  1863. (1, datetime(2000, 1, 31), expected_1_nofreq),
  1864. (3, datetime(2000, 1, 2), expected_3_nofreq)]
  1865. for n, d, expected in cases:
  1866. result = idx.insert(n, d)
  1867. self.assertTrue(result.equals(expected))
  1868. self.assertEqual(result.name, expected.name)
  1869. self.assertEqual(result.freq, expected.freq)
  1870. # reset freq to None
  1871. result = idx.insert(3, datetime(2000, 1, 2))
  1872. expected = DatetimeIndex(['2000-01-31', '2000-02-29', '2000-03-31',
  1873. '2000-01-02'], name='idx', freq=None)
  1874. self.assertTrue(result.equals(expected))
  1875. self.assertEqual(result.name, expected.name)
  1876. self.assertTrue(result.freq is None)
  1877. # GH 7299
  1878. tm._skip_if_no_pytz()
  1879. import pytz
  1880. idx = date_range('1/1/2000', periods=3, freq='D', tz='Asia/Tokyo', name='idx')
  1881. with tm.assertRaises(ValueError):
  1882. result = idx.insert(3, pd.Timestamp('2000-01-04'))
  1883. with tm.assertRaises(ValueError):
  1884. result = idx.insert(3, datetime(2000, 1, 4))
  1885. with tm.assertRaises(ValueError):
  1886. result = idx.insert(3, pd.Timestamp('2000-01-04', tz='US/Eastern'))
  1887. with tm.assertRaises(ValueError):
  1888. result = idx.insert(3, datetime(2000, 1, 4, tzinfo=pytz.timezone('US/Eastern')))
  1889. for tz in ['US/Pacific', 'Asia/Singapore']:
  1890. idx = date_range('1/1/2000 09:00', periods=6, freq='H', tz=tz, name='idx')
  1891. # preserve freq
  1892. expected = date_range('1/1/2000 09:00', periods=7, freq='H', tz=tz, name='idx')
  1893. for d in [pd.Timestamp('2000-01-01 15:00', tz=tz),
  1894. pytz.timezone(tz).localize(datetime(2000, 1, 1, 15))]:
  1895. result = idx.insert(6, d)
  1896. self.assertTrue(result.equals(expected))
  1897. self.assertEqual(result.name, expected.name)
  1898. self.assertEqual(result.freq, expected.freq)
  1899. self.assertEqual(result.tz, expected.tz)
  1900. expected = DatetimeIndex(['2000-01-01 09:00', '2000-01-01 10:00', '2000-01-01 11:00',
  1901. '2000-01-01 12:00', '2000-01-01 13:00', '2000-01-01 14:00',
  1902. '2000-01-01 10:00'], name='idx',
  1903. tz=tz, freq=None)
  1904. # reset freq to None
  1905. for d in [pd.Timestamp('2000-01-01 10:00', tz=tz),
  1906. pytz.timezone(tz).localize(datetime(2000, 1, 1, 10))]:
  1907. result = idx.insert(6, d)
  1908. self.assertTrue(result.equals(expected))
  1909. self.assertEqual(result.name, expected.name)
  1910. self.assertTrue(result.freq is None)
  1911. self.assertEqual(result.tz, expected.tz)
  1912. def test_delete(self):
  1913. idx = date_range(start='2000-01-01', periods=5, freq='M', name='idx')
  1914. # prserve freq
  1915. expected_0 = date_range(start='2000-02-01', periods=4, freq='M', name='idx')
  1916. expected_4 = date_range(start='2000-01-01', periods=4, freq='M', name='idx')
  1917. # reset freq to None
  1918. expected_1 = DatetimeIndex(['2000-01-31', '2000-03-31', '2000-04-30',
  1919. '2000-05-31'], freq=None, name='idx')
  1920. cases ={0: expected_0, -5: expected_0,
  1921. -1: expected_4, 4: expected_4,
  1922. 1: expected_1}
  1923. for n, expected in compat.iteritems(cases):
  1924. result = idx.delete(n)
  1925. self.assertTrue(result.equals(expected))
  1926. self.assertEqual(result.name, expected.name)
  1927. self.assertEqual(result.freq, expected.freq)
  1928. with tm.assertRaises((IndexError, ValueError)):
  1929. # either depeidnig on numpy version
  1930. result = idx.delete(5)
  1931. for tz in [None, 'Asia/Tokyo', 'US/Pacific']:
  1932. idx = date_range(start='2000-01-01 09:00', periods=10,
  1933. freq='H', name='idx', tz=tz)
  1934. expected = date_range(start='2000-01-01 10:00', periods=9,
  1935. freq='H', name='idx', tz=tz)
  1936. result = idx.delete(0)
  1937. self.assertTrue(result.equals(expected))
  1938. self.assertEqual(result.name, expected.name)
  1939. self.assertEqual(result.freqstr, 'H')
  1940. self.assertEqual(result.tz, expected.tz)
  1941. expected = date_range(start='2000-01-01 09:00', periods=9,
  1942. freq='H', name='idx', tz=tz)
  1943. result = idx.delete(-1)
  1944. self.assertTrue(result.equals(expected))
  1945. self.assertEqual(result.name, expected.name)
  1946. self.assertEqual(result.freqstr, 'H')
  1947. self.assertEqual(result.tz, expected.tz)
  1948. def test_delete_slice(self):
  1949. idx = date_range(start='2000-01-01', periods=10, freq='D', name='idx')
  1950. # prserve freq
  1951. expected_0_2 = date_range(start='2000-01-04', periods=7, freq='D', name='idx')
  1952. expected_7_9 = date_range(start='2000-01-01', periods=7, freq='D', name='idx')
  1953. # reset freq to None
  1954. expected_3_5 = DatetimeIndex(['2000-01-01', '2000-01-02', '2000-01-03',
  1955. '2000-01-07', '2000-01-08', '2000-01-09',
  1956. '2000-01-10'], freq=None, name='idx')
  1957. cases ={(0, 1, 2): expected_0_2,
  1958. (7, 8, 9): expected_7_9,
  1959. (3, 4, 5): expected_3_5}
  1960. for n, expected in compat.iteritems(cases):
  1961. result = idx.delete(n)
  1962. self.assertTrue(result.equals(expected))
  1963. self.assertEqual(result.name, expected.name)
  1964. self.assertEqual(result.freq, expected.freq)
  1965. result = idx.delete(slice(n[0], n[-1] + 1))
  1966. self.assertTrue(result.equals(expected))
  1967. self.assertEqual(result.name, expected.name)
  1968. self.assertEqual(result.freq, expected.freq)
  1969. for tz in [None, 'Asia/Tokyo', 'US/Pacific']:
  1970. ts = pd.Series(1, index=pd.date_range('2000-01-01 09:00', periods=10,
  1971. freq='H', name='idx', tz=tz))
  1972. # preserve freq
  1973. result = ts.drop(ts.index[:5]).index
  1974. expected = pd.date_range('2000-01-01 14:00', periods=5, freq='H', name='idx', tz=tz)
  1975. self.assertTrue(result.equals(expected))
  1976. self.assertEqual(result.name, expected.name)
  1977. self.assertEqual(result.freq, expected.freq)
  1978. self.assertEqual(result.tz, expected.tz)
  1979. # reset freq to None
  1980. result = ts.drop(ts.index[[1, 3, 5, 7, 9]]).index
  1981. expected = DatetimeIndex(['2000-01-01 09:00', '2000-01-01 11:00', '2000-01-01 13:00',
  1982. '2000-01-01 15:00', '2000-01-01 17:00'],
  1983. freq=None, name='idx', tz=tz)
  1984. self.assertTrue(result.equals(expected))
  1985. self.assertEqual(result.name, expected.name)
  1986. self.assertEqual(result.freq, expected.freq)
  1987. self.assertEqual(result.tz, expected.tz)
  1988. def test_take(self):
  1989. dates = [datetime(2010, 1, 1, 14), datetime(2010, 1, 1, 15),
  1990. datetime(2010, 1, 1, 17), datetime(2010, 1, 1, 21)]
  1991. for tz in [None, 'US/Eastern', 'Asia/Tokyo']:
  1992. idx = DatetimeIndex(start='2010-01-01 09:00', end='2010-02-01 09:00',
  1993. freq='H', tz=tz, name='idx')
  1994. expected = DatetimeIndex(dates, freq=None, name='idx', tz=tz)
  1995. taken1 = idx.take([5, 6, 8, 12])
  1996. taken2 = idx[[5, 6, 8, 12]]
  1997. for taken in [taken1, taken2]:
  1998. self.assertTrue(taken.equals(expected))
  1999. tm.assert_isinstance(taken, DatetimeIndex)
  2000. self.assertIsNone(taken.freq)
  2001. self.assertEqual(taken.tz, expected.tz)
  2002. self.assertEqual(taken.name, expected.name)
  2003. def test_map_bug_1677(self):
  2004. index = DatetimeIndex(['2012-04-25 09:30:00.393000'])
  2005. f = index.asof
  2006. result = index.map(f)
  2007. expected = np.array([f(index[0])])
  2008. self.assert_numpy_array_equal(result, expected)
  2009. def test_groupby_function_tuple_1677(self):
  2010. df = DataFrame(np.random.rand(100),
  2011. index=date_range("1/1/2000", periods=100))
  2012. monthly_group = df.groupby(lambda x: (x.year, x.month))
  2013. result = monthly_group.mean()
  2014. tm.assert_isinstance(result.index[0], tuple)
  2015. def test_append_numpy_bug_1681(self):
  2016. # another datetime64 bug
  2017. dr = date_range('2011/1/1', '2012/1/1', freq='W-FRI')
  2018. a = DataFrame()
  2019. c = DataFrame({'A': 'foo', 'B': dr}, index=dr)
  2020. result = a.append(c)
  2021. self.assertTrue((result['B'] == dr).all())
  2022. def test_isin(self):
  2023. index = tm.makeDateIndex(4)
  2024. result = index.isin(index)
  2025. self.assertTrue(result.all())
  2026. result = index.isin(list(index))
  2027. self.assertTrue(result.all())
  2028. assert_almost_equal(index.isin([index[2], 5]),
  2029. [False, False, True, False])
  2030. def test_union(self):
  2031. i1 = Int64Index(np.arange(0, 20, 2))
  2032. i2 = Int64Index(np.arange(10, 30, 2))
  2033. result = i1.union(i2)
  2034. expected = Int64Index(np.arange(0, 30, 2))
  2035. self.assert_numpy_array_equal(result, expected)
  2036. def test_union_with_DatetimeIndex(self):
  2037. i1 = Int64Index(np.arange(0, 20, 2))
  2038. i2 = DatetimeIndex(start='2012-01-03 00:00:00', periods=10, freq='D')
  2039. i1.union(i2) # Works
  2040. i2.union(i1) # Fails with "AttributeError: can't set attribute"
  2041. def test_time(self):
  2042. rng = pd.date_range('1/1/2000', freq='12min', periods=10)
  2043. result = pd.Index(rng).time
  2044. expected = [t.time() for t in rng]
  2045. self.assertTrue((result == expected).all())
  2046. def test_date(self):
  2047. rng = pd.date_range('1/1/2000', freq='12H', periods=10)
  2048. result = pd.Index(rng).date
  2049. expected = [t.date() for t in rng]
  2050. self.assertTrue((result == expected).all())
  2051. def test_does_not_convert_mixed_integer(self):
  2052. df = tm.makeCustomDataframe(10, 10, data_gen_f=lambda *args, **kwargs:
  2053. randn(), r_idx_type='i', c_idx_type='dt')
  2054. cols = df.columns.join(df.index, how='outer')
  2055. joined = cols.join(df.columns)
  2056. self.assertEqual(cols.dtype, np.dtype('O'))
  2057. self.assertEqual(cols.dtype, joined.dtype)
  2058. assert_array_equal(cols.values, joined.values)
  2059. def test_slice_keeps_name(self):
  2060. # GH4226
  2061. st = pd.Timestamp('2013-07-01 00:00:00', tz='America/Los_Angeles')
  2062. et = pd.Timestamp('2013-07-02 00:00:00', tz='America/Los_Angeles')
  2063. dr = pd.date_range(st, et, freq='H', name='timebucket')
  2064. self.assertEqual(dr[1:].name, dr.name)
  2065. def test_join_self(self):
  2066. index = date_range('1/1/2000', periods=10)
  2067. kinds = 'outer', 'inner', 'left', 'right'
  2068. for kind in kinds:
  2069. joined = index.join(index, how=kind)
  2070. self.assertIs(index, joined)
  2071. def assert_index_parameters(self, index):
  2072. assert index.freq == '40960N'
  2073. assert index.inferred_freq == '40960N'
  2074. def test_ns_index(self):
  2075. tm._skip_if_not_numpy17_friendly()
  2076. nsamples = 400
  2077. ns = int(1e9 / 24414)
  2078. dtstart = np.datetime64('2012-09-20T00:00:00')
  2079. dt = dtstart + np.arange(nsamples) * np.timedelta64(ns, 'ns')
  2080. freq = ns * pd.datetools.Nano()
  2081. index = pd.DatetimeIndex(dt, freq=freq, name='time')
  2082. self.assert_index_parameters(index)
  2083. new_index = pd.DatetimeIndex(start=index[0], end=index[-1], freq=index.freq)
  2084. self.assert_index_parameters(new_index)
  2085. def test_join_with_period_index(self):
  2086. df = tm.makeCustomDataframe(10, 10, data_gen_f=lambda *args:
  2087. np.random.randint(2), c_idx_type='p',
  2088. r_idx_type='dt')
  2089. s = df.iloc[:5, 0]
  2090. joins = 'left', 'right', 'inner', 'outer'
  2091. for join in joins:
  2092. with tm.assertRaisesRegexp(ValueError, 'can only call with other '
  2093. 'PeriodIndex-ed objects'):
  2094. df.columns.join(s.index, how=join)
  2095. def test_factorize(self):
  2096. idx1 = DatetimeIndex(['2014-01', '2014-01', '2014-02',
  2097. '2014-02', '2014-03', '2014-03'])
  2098. exp_arr = np.array([0, 0, 1, 1, 2, 2])
  2099. exp_idx = DatetimeIndex(['2014-01', '2014-02', '2014-03'])
  2100. arr, idx = idx1.factorize()
  2101. self.assert_numpy_array_equal(arr, exp_arr)
  2102. self.assertTrue(idx.equals(exp_idx))
  2103. arr, idx = idx1.factorize(sort=True)
  2104. self.assert_numpy_array_equal(arr, exp_arr)
  2105. self.assertTrue(idx.equals(exp_idx))
  2106. # tz must be preserved
  2107. idx1 = idx1.tz_localize('Asia/Tokyo')
  2108. exp_idx = exp_idx.tz_localize('Asia/Tokyo')
  2109. arr, idx = idx1.factorize()
  2110. self.assert_numpy_array_equal(arr, exp_arr)
  2111. self.assertTrue(idx.equals(exp_idx))
  2112. idx2 = pd.DatetimeIndex(['2014-03', '2014-03', '2014-02', '2014-01',
  2113. '2014-03', '2014-01'])
  2114. exp_arr = np.array([2, 2, 1, 0, 2, 0])
  2115. exp_idx = DatetimeIndex(['2014-01', '2014-02', '2014-03'])
  2116. arr, idx = idx2.factorize(sort=True)
  2117. self.assert_numpy_array_equal(arr, exp_arr)
  2118. self.assertTrue(idx.equals(exp_idx))
  2119. exp_arr = np.array([0, 0, 1, 2, 0, 2])
  2120. exp_idx = DatetimeIndex(['2014-03', '2014-02', '2014-01'])
  2121. arr, idx = idx2.factorize()
  2122. self.assert_numpy_array_equal(arr, exp_arr)
  2123. self.assertTrue(idx.equals(exp_idx))
  2124. # freq must be preserved
  2125. idx3 = date_range('2000-01', periods=4, freq='M', tz='Asia/Tokyo')
  2126. exp_arr = np.array([0, 1, 2, 3])
  2127. arr, idx = idx3.factorize()
  2128. self.assert_numpy_array_equal(arr, exp_arr)
  2129. self.assertTrue(idx.equals(idx3))
  2130. class TestDatetime64(tm.TestCase):
  2131. """
  2132. Also test support for datetime64[ns] in Series / DataFrame
  2133. """
  2134. def setUp(self):
  2135. dti = DatetimeIndex(start=datetime(2005, 1, 1),
  2136. end=datetime(2005, 1, 10), freq='Min')
  2137. self.series = Series(rand(len(dti)), dti)
  2138. def test_datetimeindex_accessors(self):
  2139. dti = DatetimeIndex(
  2140. freq='D', start=datetime(1998, 1, 1), periods=365)
  2141. self.assertEqual(dti.year[0], 1998)
  2142. self.assertEqual(dti.month[0], 1)
  2143. self.assertEqual(dti.day[0], 1)
  2144. self.assertEqual(dti.hour[0], 0)
  2145. self.assertEqual(dti.minute[0], 0)
  2146. self.assertEqual(dti.second[0], 0)
  2147. self.assertEqual(dti.microsecond[0], 0)
  2148. self.assertEqual(dti.dayofweek[0], 3)
  2149. self.assertEqual(dti.dayofyear[0], 1)
  2150. self.assertEqual(dti.dayofyear[120], 121)
  2151. self.assertEqual(dti.weekofyear[0], 1)
  2152. self.assertEqual(dti.weekofyear[120], 18)
  2153. self.assertEqual(dti.quarter[0], 1)
  2154. self.assertEqual(dti.quarter[120], 2)
  2155. self.assertEqual(dti.is_month_start[0], True)
  2156. self.assertEqual(dti.is_month_start[1], False)
  2157. self.assertEqual(dti.is_month_start[31], True)
  2158. self.assertEqual(dti.is_quarter_start[0], True)
  2159. self.assertEqual(dti.is_quarter_start[90], True)
  2160. self.assertEqual(dti.is_year_start[0], True)
  2161. self.assertEqual(dti.is_year_start[364], False)
  2162. self.assertEqual(dti.is_month_end[0], False)
  2163. self.assertEqual(dti.is_month_end[30], True)
  2164. self.assertEqual(dti.is_month_end[31], False)
  2165. self.assertEqual(dti.is_month_end[364], True)
  2166. self.assertEqual(dti.is_quarter_end[0], False)
  2167. self.assertEqual(dti.is_quarter_end[30], False)
  2168. self.assertEqual(dti.is_quarter_end[89], True)
  2169. self.assertEqual(dti.is_quarter_end[364], True)
  2170. self.assertEqual(dti.is_year_end[0], False)
  2171. self.assertEqual(dti.is_year_end[364], True)
  2172. self.assertEqual(len(dti.year), 365)
  2173. self.assertEqual(len(dti.month), 365)
  2174. self.assertEqual(len(dti.day), 365)
  2175. self.assertEqual(len(dti.hour), 365)
  2176. self.assertEqual(len(dti.minute), 365)
  2177. self.assertEqual(len(dti.second), 365)
  2178. self.assertEqual(len(dti.microsecond), 365)
  2179. self.assertEqual(len(dti.dayofweek), 365)
  2180. self.assertEqual(len(dti.dayofyear), 365)
  2181. self.assertEqual(len(dti.weekofyear), 365)
  2182. self.assertEqual(len(dti.quarter), 365)
  2183. self.assertEqual(len(dti.is_month_start), 365)
  2184. self.assertEqual(len(dti.is_month_end), 365)
  2185. self.assertEqual(len(dti.is_quarter_start), 365)
  2186. self.assertEqual(len(dti.is_quarter_end), 365)
  2187. self.assertEqual(len(dti.is_year_start), 365)
  2188. self.assertEqual(len(dti.is_year_end), 365)
  2189. dti = DatetimeIndex(
  2190. freq='BQ-FEB', start=datetime(1998, 1, 1), periods=4)
  2191. self.assertEqual(sum(dti.is_quarter_start), 0)
  2192. self.assertEqual(sum(dti.is_quarter_end), 4)
  2193. self.assertEqual(sum(dti.is_year_start), 0)
  2194. self.assertEqual(sum(dti.is_year_end), 1)
  2195. # Ensure is_start/end accessors throw ValueError for CustomBusinessDay, CBD requires np >= 1.7
  2196. if not _np_version_under1p7:
  2197. bday_egypt = offsets.CustomBusinessDay(weekmask='Sun Mon Tue Wed Thu')
  2198. dti = date_range(datetime(2013, 4, 30), periods=5, freq=bday_egypt)
  2199. self.assertRaises(ValueError, lambda: dti.is_month_start)
  2200. dti = DatetimeIndex(['2000-01-01', '2000-01-02', '2000-01-03'])
  2201. self.assertEqual(dti.is_month_start[0], 1)
  2202. tests = [
  2203. (Timestamp('2013-06-01', offset='M').is_month_start, 1),
  2204. (Timestamp('2013-06-01', offset='BM').is_month_start, 0),
  2205. (Timestamp('2013-06-03', offset='M').is_month_start, 0),
  2206. (Timestamp('2013-06-03', offset='BM').is_month_start, 1),
  2207. (Timestamp('2013-02-28', offset='Q-FEB').is_month_end, 1),
  2208. (Timestamp('2013-02-28', offset='Q-FEB').is_quarter_end, 1),
  2209. (Timestamp('2013-02-28', offset='Q-FEB').is_year_end, 1),
  2210. (Timestamp('2013-03-01', offset='Q-FEB').is_month_start, 1),
  2211. (Timestamp('2013-03-01', offset='Q-FEB').is_quarter_start, 1),
  2212. (Timestamp('2013-03-01', offset='Q-FEB').is_year_start, 1),
  2213. (Timestamp('2013-03-31', offset='QS-FEB').is_month_end, 1),
  2214. (Timestamp('2013-03-31', offset='QS-FEB').is_quarter_end, 0),
  2215. (Timestamp('2013-03-31', offset='QS-FEB').is_year_end, 0),
  2216. (Timestamp('2013-02-01', offset='QS-FEB').is_month_start, 1),
  2217. (Timestamp('2013-02-01', offset='QS-FEB').is_quarter_start, 1),
  2218. (Timestamp('2013-02-01', offset='QS-FEB').is_year_start, 1),
  2219. (Timestamp('2013-06-30', offset='BQ').is_month_end, 0),
  2220. (Timestamp('2013-06-30', offset='BQ').is_quarter_end, 0),
  2221. (Timestamp('2013-06-30', offset='BQ').is_year_end, 0),
  2222. (Timestamp('2013-06-28', offset='BQ').is_month_end, 1),
  2223. (Timestamp('2013-06-28', offset='BQ').is_quarter_end, 1),
  2224. (Timestamp('2013-06-28', offset='BQ').is_year_end, 0),
  2225. (Timestamp('2013-06-30', offset='BQS-APR').is_month_end, 0),
  2226. (Timestamp('2013-06-30', offset='BQS-APR').is_quarter_end, 0),
  2227. (Timestamp('2013-06-30', offset='BQS-APR').is_year_end, 0),
  2228. (Timestamp('2013-06-28', offset='BQS-APR').is_month_end, 1),
  2229. (Timestamp('2013-06-28', offset='BQS-APR').is_quarter_end, 1),
  2230. (Timestamp('2013-03-29', offset='BQS-APR').is_year_end, 1),
  2231. (Timestamp('2013-11-01', offset='AS-NOV').is_year_start, 1),
  2232. (Timestamp('2013-10-31', offset='AS-NOV').is_year_end, 1)]
  2233. for ts, value in tests:
  2234. self.assertEqual(ts, value)
  2235. def test_nanosecond_field(self):
  2236. dti = DatetimeIndex(np.arange(10))
  2237. self.assert_numpy_array_equal(dti.nanosecond, np.arange(10))
  2238. def test_datetimeindex_diff(self):
  2239. dti1 = DatetimeIndex(freq='Q-JAN', start=datetime(1997, 12, 31),
  2240. periods=100)
  2241. dti2 = DatetimeIndex(freq='Q-JAN', start=datetime(1997, 12, 31),
  2242. periods=98)
  2243. self.assertEqual(len(dti1.diff(dti2)), 2)
  2244. def test_fancy_getitem(self):
  2245. dti = DatetimeIndex(freq='WOM-1FRI', start=datetime(2005, 1, 1),
  2246. end=datetime(2010, 1, 1))
  2247. s = Series(np.arange(len(dti)), index=dti)
  2248. self.assertEqual(s[48], 48)
  2249. self.assertEqual(s['1/2/2009'], 48)
  2250. self.assertEqual(s['2009-1-2'], 48)
  2251. self.assertEqual(s[datetime(2009, 1, 2)], 48)
  2252. self.assertEqual(s[lib.Timestamp(datetime(2009, 1, 2))], 48)
  2253. self.assertRaises(KeyError, s.__getitem__, '2009-1-3')
  2254. assert_series_equal(s['3/6/2009':'2009-06-05'],
  2255. s[datetime(2009, 3, 6):datetime(2009, 6, 5)])
  2256. def test_fancy_setitem(self):
  2257. dti = DatetimeIndex(freq='WOM-1FRI', start=datetime(2005, 1, 1),
  2258. end=datetime(2010, 1, 1))
  2259. s = Series(np.arange(len(dti)), index=dti)
  2260. s[48] = -1
  2261. self.assertEqual(s[48], -1)
  2262. s['1/2/2009'] = -2
  2263. self.assertEqual(s[48], -2)
  2264. s['1/2/2009':'2009-06-05'] = -3
  2265. self.assertTrue((s[48:54] == -3).all())
  2266. def test_datetimeindex_constructor(self):
  2267. arr = ['1/1/2005', '1/2/2005', 'Jn 3, 2005', '2005-01-04']
  2268. self.assertRaises(Exception, DatetimeIndex, arr)
  2269. arr = ['1/1/2005', '1/2/2005', '1/3/2005', '2005-01-04']
  2270. idx1 = DatetimeIndex(arr)
  2271. arr = [datetime(2005, 1, 1), '1/2/2005', '1/3/2005', '2005-01-04']
  2272. idx2 = DatetimeIndex(arr)
  2273. arr = [lib.Timestamp(datetime(2005, 1, 1)), '1/2/2005', '1/3/2005',
  2274. '2005-01-04']
  2275. idx3 = DatetimeIndex(arr)
  2276. arr = np.array(['1/1/2005', '1/2/2005', '1/3/2005',
  2277. '2005-01-04'], dtype='O')
  2278. idx4 = DatetimeIndex(arr)
  2279. arr = to_datetime(['1/1/2005', '1/2/2005', '1/3/2005', '2005-01-04'])
  2280. idx5 = DatetimeIndex(arr)
  2281. arr = to_datetime(
  2282. ['1/1/2005', '1/2/2005', 'Jan 3, 2005', '2005-01-04'])
  2283. idx6 = DatetimeIndex(arr)
  2284. idx7 = DatetimeIndex(['12/05/2007', '25/01/2008'], dayfirst=True)
  2285. idx8 = DatetimeIndex(['2007/05/12', '2008/01/25'], dayfirst=False,
  2286. yearfirst=True)
  2287. self.assertTrue(idx7.equals(idx8))
  2288. for other in [idx2, idx3, idx4, idx5, idx6]:
  2289. self.assertTrue((idx1.values == other.values).all())
  2290. sdate = datetime(1999, 12, 25)
  2291. edate = datetime(2000, 1, 1)
  2292. idx = DatetimeIndex(start=sdate, freq='1B', periods=20)
  2293. self.assertEqual(len(idx), 20)
  2294. self.assertEqual(idx[0], sdate + 0 * dt.bday)
  2295. self.assertEqual(idx.freq, 'B')
  2296. idx = DatetimeIndex(end=edate, freq=('D', 5), periods=20)
  2297. self.assertEqual(len(idx), 20)
  2298. self.assertEqual(idx[-1], edate)
  2299. self.assertEqual(idx.freq, '5D')
  2300. idx1 = DatetimeIndex(start=sdate, end=edate, freq='W-SUN')
  2301. idx2 = DatetimeIndex(start=sdate, end=edate,
  2302. freq=dt.Week(weekday=6))
  2303. self.assertEqual(len(idx1), len(idx2))
  2304. self.assertEqual(idx1.offset, idx2.offset)
  2305. idx1 = DatetimeIndex(start=sdate, end=edate, freq='QS')
  2306. idx2 = DatetimeIndex(start=sdate, end=edate,
  2307. freq=dt.QuarterBegin(startingMonth=1))
  2308. self.assertEqual(len(idx1), len(idx2))
  2309. self.assertEqual(idx1.offset, idx2.offset)
  2310. idx1 = DatetimeIndex(start=sdate, end=edate, freq='BQ')
  2311. idx2 = DatetimeIndex(start=sdate, end=edate,
  2312. freq=dt.BQuarterEnd(startingMonth=12))
  2313. self.assertEqual(len(idx1), len(idx2))
  2314. self.assertEqual(idx1.offset, idx2.offset)
  2315. def test_dayfirst(self):
  2316. # GH 5917
  2317. arr = ['10/02/2014', '11/02/2014', '12/02/2014']
  2318. expected = DatetimeIndex([datetime(2014, 2, 10),
  2319. datetime(2014, 2, 11),
  2320. datetime(2014, 2, 12)])
  2321. idx1 = DatetimeIndex(arr, dayfirst=True)
  2322. idx2 = DatetimeIndex(np.array(arr), dayfirst=True)
  2323. idx3 = to_datetime(arr, dayfirst=True)
  2324. idx4 = to_datetime(np.array(arr), dayfirst=True)
  2325. idx5 = DatetimeIndex(Index(arr), dayfirst=True)
  2326. idx6 = DatetimeIndex(Series(arr), dayfirst=True)
  2327. self.assertTrue(expected.equals(idx1))
  2328. self.assertTrue(expected.equals(idx2))
  2329. self.assertTrue(expected.equals(idx3))
  2330. self.assertTrue(expected.equals(idx4))
  2331. self.assertTrue(expected.equals(idx5))
  2332. self.assertTrue(expected.equals(idx6))
  2333. def test_dti_snap(self):
  2334. dti = DatetimeIndex(['1/1/2002', '1/2/2002', '1/3/2002', '1/4/2002',
  2335. '1/5/2002', '1/6/2002', '1/7/2002'], freq='D')
  2336. res = dti.snap(freq='W-MON')
  2337. exp = date_range('12/31/2001', '1/7/2002', freq='w-mon')
  2338. exp = exp.repeat([3, 4])
  2339. self.assertTrue((res == exp).all())
  2340. res = dti.snap(freq='B')
  2341. exp = date_range('1/1/2002', '1/7/2002', freq='b')
  2342. exp = exp.repeat([1, 1, 1, 2, 2])
  2343. self.assertTrue((res == exp).all())
  2344. def test_dti_reset_index_round_trip(self):
  2345. dti = DatetimeIndex(start='1/1/2001', end='6/1/2001', freq='D')
  2346. d1 = DataFrame({'v': np.random.rand(len(dti))}, index=dti)
  2347. d2 = d1.reset_index()
  2348. self.assertEqual(d2.dtypes[0], np.dtype('M8[ns]'))
  2349. d3 = d2.set_index('index')
  2350. assert_frame_equal(d1, d3, check_names=False)
  2351. # #2329
  2352. stamp = datetime(2012, 11, 22)
  2353. df = DataFrame([[stamp, 12.1]], columns=['Date', 'Value'])
  2354. df = df.set_index('Date')
  2355. self.assertEqual(df.index[0], stamp)
  2356. self.assertEqual(df.reset_index()['Date'][0], stamp)
  2357. def test_dti_set_index_reindex(self):
  2358. # GH 6631
  2359. df = DataFrame(np.random.random(6))
  2360. idx1 = date_range('2011/01/01', periods=6, freq='M', tz='US/Eastern')
  2361. idx2 = date_range('2013', periods=6, freq='A', tz='Asia/Tokyo')
  2362. df = df.set_index(idx1)
  2363. self.assertTrue(df.index.equals(idx1))
  2364. df = df.reindex(idx2)
  2365. self.assertTrue(df.index.equals(idx2))
  2366. def test_datetimeindex_union_join_empty(self):
  2367. dti = DatetimeIndex(start='1/1/2001', end='2/1/2001', freq='D')
  2368. empty = Index([])
  2369. result = dti.union(empty)
  2370. tm.assert_isinstance(result, DatetimeIndex)
  2371. self.assertIs(result, result)
  2372. result = dti.join(empty)
  2373. tm.assert_isinstance(result, DatetimeIndex)
  2374. def test_series_set_value(self):
  2375. # #1561
  2376. dates = [datetime(2001, 1, 1), datetime(2001, 1, 2)]
  2377. index = DatetimeIndex(dates)
  2378. s = Series().set_value(dates[0], 1.)
  2379. s2 = s.set_value(dates[1], np.nan)
  2380. exp = Series([1., np.nan], index=index)
  2381. assert_series_equal(s2, exp)
  2382. # s = Series(index[:1], index[:1])
  2383. # s2 = s.set_value(dates[1], index[1])
  2384. # self.assertEqual(s2.values.dtype, 'M8[ns]')
  2385. @slow
  2386. def test_slice_locs_indexerror(self):
  2387. times = [datetime(2000, 1, 1) + timedelta(minutes=i * 10)
  2388. for i in range(100000)]
  2389. s = Series(lrange(100000), times)
  2390. s.ix[datetime(1900, 1, 1):datetime(2100, 1, 1)]
  2391. def test_slicing_datetimes(self):
  2392. # GH 7523
  2393. # unique
  2394. df = DataFrame(np.arange(4.,dtype='float64'),
  2395. index=[datetime(2001, 1, i, 10, 00) for i in [1,2,3,4]])
  2396. result = df.ix[datetime(2001,1,1,10):]
  2397. assert_frame_equal(result,df)
  2398. result = df.ix[:datetime(2001,1,4,10)]
  2399. assert_frame_equal(result,df)
  2400. result = df.ix[datetime(2001,1,1,10):datetime(2001,1,4,10)]
  2401. assert_frame_equal(result,df)
  2402. result = df.ix[datetime(2001,1,1,11):]
  2403. expected = df.iloc[1:]
  2404. assert_frame_equal(result,expected)
  2405. result = df.ix['20010101 11':]
  2406. assert_frame_equal(result,expected)
  2407. # duplicates
  2408. df = pd.DataFrame(np.arange(5.,dtype='float64'),
  2409. index=[datetime(2001, 1, i, 10, 00) for i in [1,2,2,3,4]])
  2410. result = df.ix[datetime(2001,1,1,10):]
  2411. assert_frame_equal(result,df)
  2412. result = df.ix[:datetime(2001,1,4,10)]
  2413. assert_frame_equal(result,df)
  2414. result = df.ix[datetime(2001,1,1,10):datetime(2001,1,4,10)]
  2415. assert_frame_equal(result,df)
  2416. result = df.ix[datetime(2001,1,1,11):]
  2417. expected = df.iloc[1:]
  2418. assert_frame_equal(result,expected)
  2419. result = df.ix['20010101 11':]
  2420. assert_frame_equal(result,expected)
  2421. class TestSeriesDatetime64(tm.TestCase):
  2422. def setUp(self):
  2423. self.series = Series(date_range('1/1/2000', periods=10))
  2424. def test_auto_conversion(self):
  2425. series = Series(list(date_range('1/1/2000', periods=10)))
  2426. self.assertEqual(series.dtype, 'M8[ns]')
  2427. def test_constructor_cant_cast_datetime64(self):
  2428. self.assertRaises(TypeError, Series,
  2429. date_range('1/1/2000', periods=10), dtype=float)
  2430. def test_series_comparison_scalars(self):
  2431. val = datetime(2000, 1, 4)
  2432. result = self.series > val
  2433. expected = np.array([x > val for x in self.series])
  2434. self.assert_numpy_array_equal(result, expected)
  2435. val = self.series[5]
  2436. result = self.series > val
  2437. expected = np.array([x > val for x in self.series])
  2438. self.assert_numpy_array_equal(result, expected)
  2439. def test_between(self):
  2440. left, right = self.series[[2, 7]]
  2441. result = self.series.between(left, right)
  2442. expected = (self.series >= left) & (self.series <= right)
  2443. assert_series_equal(result, expected)
  2444. #----------------------------------------------------------------------
  2445. # NaT support
  2446. def test_NaT_scalar(self):
  2447. series = Series([0, 1000, 2000, iNaT], dtype='M8[ns]')
  2448. val = series[3]
  2449. self.assertTrue(com.isnull(val))
  2450. series[2] = val
  2451. self.assertTrue(com.isnull(series[2]))
  2452. def test_set_none_nan(self):
  2453. self.series[3] = None
  2454. self.assertIs(self.series[3], NaT)
  2455. self.series[3:5] = None
  2456. self.assertIs(self.series[4], NaT)
  2457. self.series[5] = np.nan
  2458. self.assertIs(self.series[5], NaT)
  2459. self.series[5:7] = np.nan
  2460. self.assertIs(self.series[6], NaT)
  2461. def test_intercept_astype_object(self):
  2462. # this test no longer makes sense as series is by default already M8[ns]
  2463. expected = self.series.astype('object')
  2464. df = DataFrame({'a': self.series,
  2465. 'b': np.random.randn(len(self.series))})
  2466. result = df.values.squeeze()
  2467. self.assertTrue((result[:, 0] == expected.values).all())
  2468. df = DataFrame({'a': self.series,
  2469. 'b': ['foo'] * len(self.series)})
  2470. result = df.values.squeeze()
  2471. self.assertTrue((result[:, 0] == expected.values).all())
  2472. def test_union(self):
  2473. rng1 = date_range('1/1/1999', '1/1/2012', freq='MS')
  2474. s1 = Series(np.random.randn(len(rng1)), rng1)
  2475. rng2 = date_range('1/1/1980', '12/1/2001', freq='MS')
  2476. s2 = Series(np.random.randn(len(rng2)), rng2)
  2477. df = DataFrame({'s1': s1, 's2': s2})
  2478. self.assertEqual(df.index.values.dtype, np.dtype('M8[ns]'))
  2479. def test_intersection(self):
  2480. # GH 4690 (with tz)
  2481. for tz in [None, 'Asia/Tokyo']:
  2482. rng = date_range('6/1/2000', '6/30/2000', freq='D', name='idx')
  2483. # if target has the same name, it is preserved
  2484. rng2 = date_range('5/15/2000', '6/20/2000', freq='D', name='idx')
  2485. expected2 = date_range('6/1/2000', '6/20/2000', freq='D', name='idx')
  2486. # if target name is different, it will be reset
  2487. rng3 = date_range('5/15/2000', '6/20/2000', freq='D', name='other')
  2488. expected3 = date_range('6/1/2000', '6/20/2000', freq='D', name=None)
  2489. result2 = rng.intersection(rng2)
  2490. result3 = rng.intersection(rng3)
  2491. for (result, expected) in [(result2, expected2), (result3, expected3)]:
  2492. self.assertTrue(result.equals(expected))
  2493. self.assertEqual(result.name, expected.name)
  2494. self.assertEqual(result.freq, expected.freq)
  2495. self.assertEqual(result.tz, expected.tz)
  2496. # non-monotonic
  2497. rng = DatetimeIndex(['2011-01-05', '2011-01-04', '2011-01-02', '2011-01-03'],
  2498. tz=tz, name='idx')
  2499. rng2 = DatetimeIndex(['2011-01-04', '2011-01-02', '2011-02-02', '2011-02-03'],
  2500. tz=tz, name='idx')
  2501. expected2 = DatetimeIndex(['2011-01-04', '2011-01-02'], tz=tz, name='idx')
  2502. rng3 = DatetimeIndex(['2011-01-04', '2011-01-02', '2011-02-02', '2011-02-03'],
  2503. tz=tz, name='other')
  2504. expected3 = DatetimeIndex(['2011-01-04', '2011-01-02'], tz=tz, name=None)
  2505. result2 = rng.intersection(rng2)
  2506. result3 = rng.intersection(rng3)
  2507. for (result, expected) in [(result2, expected2), (result3, expected3)]:
  2508. print(result, expected)
  2509. self.assertTrue(result.equals(expected))
  2510. self.assertEqual(result.name, expected.name)
  2511. self.assertIsNone(result.freq)
  2512. self.assertEqual(result.tz, expected.tz)
  2513. # empty same freq GH2129
  2514. rng = date_range('6/1/2000', '6/15/2000', freq='T')
  2515. result = rng[0:0].intersection(rng)
  2516. self.assertEqual(len(result), 0)
  2517. result = rng.intersection(rng[0:0])
  2518. self.assertEqual(len(result), 0)
  2519. def test_date_range_bms_bug(self):
  2520. # #1645
  2521. rng = date_range('1/1/2000', periods=10, freq='BMS')
  2522. ex_first = Timestamp('2000-01-03')
  2523. self.assertEqual(rng[0], ex_first)
  2524. def test_string_index_series_name_converted(self):
  2525. # #1644
  2526. df = DataFrame(np.random.randn(10, 4),
  2527. index=date_range('1/1/2000', periods=10))
  2528. result = df.ix['1/3/2000']
  2529. self.assertEqual(result.name, df.index[2])
  2530. result = df.T['1/3/2000']
  2531. self.assertEqual(result.name, df.index[2])
  2532. class TestTimestamp(tm.TestCase):
  2533. def test_class_ops_pytz(self):
  2534. tm._skip_if_no_pytz()
  2535. from pytz import timezone
  2536. def compare(x, y):
  2537. self.assertEqual(int(Timestamp(x).value / 1e9), int(Timestamp(y).value / 1e9))
  2538. compare(Timestamp.now(), datetime.now())
  2539. compare(Timestamp.now('UTC'), datetime.now(timezone('UTC')))
  2540. compare(Timestamp.utcnow(), datetime.utcnow())
  2541. compare(Timestamp.today(), datetime.today())
  2542. def test_class_ops_dateutil(self):
  2543. tm._skip_if_no_dateutil()
  2544. from dateutil.tz import tzutc
  2545. def compare(x,y):
  2546. self.assertEqual(int(np.round(Timestamp(x).value/1e9)), int(np.round(Timestamp(y).value/1e9)))
  2547. compare(Timestamp.now(),datetime.now())
  2548. compare(Timestamp.now('UTC'), datetime.now(tzutc()))
  2549. compare(Timestamp.utcnow(),datetime.utcnow())
  2550. compare(Timestamp.today(),datetime.today())
  2551. def test_basics_nanos(self):
  2552. val = np.int64(946684800000000000).view('M8[ns]')
  2553. stamp = Timestamp(val.view('i8') + 500)
  2554. self.assertEqual(stamp.year, 2000)
  2555. self.assertEqual(stamp.month, 1)
  2556. self.assertEqual(stamp.microsecond, 0)
  2557. self.assertEqual(stamp.nanosecond, 500)
  2558. def test_unit(self):
  2559. def check(val,unit=None,h=1,s=1,us=0):
  2560. stamp = Timestamp(val, unit=unit)
  2561. self.assertEqual(stamp.year, 2000)
  2562. self.assertEqual(stamp.month, 1)
  2563. self.assertEqual(stamp.day, 1)
  2564. self.assertEqual(stamp.hour, h)
  2565. if unit != 'D':
  2566. self.assertEqual(stamp.minute, 1)
  2567. self.assertEqual(stamp.second, s)
  2568. self.assertEqual(stamp.microsecond, us)
  2569. else:
  2570. self.assertEqual(stamp.minute, 0)
  2571. self.assertEqual(stamp.second, 0)
  2572. self.assertEqual(stamp.microsecond, 0)
  2573. self.assertEqual(stamp.nanosecond, 0)
  2574. ts = Timestamp('20000101 01:01:01')
  2575. val = ts.value
  2576. days = (ts - Timestamp('1970-01-01')).days
  2577. check(val)
  2578. check(val/long(1000),unit='us')
  2579. check(val/long(1000000),unit='ms')
  2580. check(val/long(1000000000),unit='s')
  2581. check(days,unit='D',h=0)
  2582. # using truediv, so these are like floats
  2583. if compat.PY3:
  2584. check((val+500000)/long(1000000000),unit='s',us=500)
  2585. check((val+500000000)/long(1000000000),unit='s',us=500000)
  2586. check((val+500000)/long(1000000),unit='ms',us=500)
  2587. # get chopped in py2
  2588. else:
  2589. check((val+500000)/long(1000000000),unit='s')
  2590. check((val+500000000)/long(1000000000),unit='s')
  2591. check((val+500000)/long(1000000),unit='ms')
  2592. # ok
  2593. check((val+500000)/long(1000),unit='us',us=500)
  2594. check((val+500000000)/long(1000000),unit='ms',us=500000)
  2595. # floats
  2596. check(val/1000.0 + 5,unit='us',us=5)
  2597. check(val/1000.0 + 5000,unit='us',us=5000)
  2598. check(val/1000000.0 + 0.5,unit='ms',us=500)
  2599. check(val/1000000.0 + 0.005,unit='ms',us=5)
  2600. check(val/1000000000.0 + 0.5,unit='s',us=500000)
  2601. check(days + 0.5,unit='D',h=12)
  2602. # nan
  2603. result = Timestamp(np.nan)
  2604. self.assertIs(result, NaT)
  2605. result = Timestamp(None)
  2606. self.assertIs(result, NaT)
  2607. result = Timestamp(iNaT)
  2608. self.assertIs(result, NaT)
  2609. result = Timestamp(NaT)
  2610. self.assertIs(result, NaT)
  2611. def test_comparison(self):
  2612. # 5-18-2012 00:00:00.000
  2613. stamp = long(1337299200000000000)
  2614. val = Timestamp(stamp)
  2615. self.assertEqual(val, val)
  2616. self.assertFalse(val != val)
  2617. self.assertFalse(val < val)
  2618. self.assertTrue(val <= val)
  2619. self.assertFalse(val > val)
  2620. self.assertTrue(val >= val)
  2621. other = datetime(2012, 5, 18)
  2622. self.assertEqual(val, other)
  2623. self.assertFalse(val != other)
  2624. self.assertFalse(val < other)
  2625. self.assertTrue(val <= other)
  2626. self.assertFalse(val > other)
  2627. self.assertTrue(val >= other)
  2628. other = Timestamp(stamp + 100)
  2629. self.assertNotEqual(val, other)
  2630. self.assertNotEqual(val, other)
  2631. self.assertTrue(val < other)
  2632. self.assertTrue(val <= other)
  2633. self.assertTrue(other > val)
  2634. self.assertTrue(other >= val)
  2635. def test_cant_compare_tz_naive_w_aware(self):
  2636. tm._skip_if_no_pytz()
  2637. # #1404
  2638. a = Timestamp('3/12/2012')
  2639. b = Timestamp('3/12/2012', tz='utc')
  2640. self.assertRaises(Exception, a.__eq__, b)
  2641. self.assertRaises(Exception, a.__ne__, b)
  2642. self.assertRaises(Exception, a.__lt__, b)
  2643. self.assertRaises(Exception, a.__gt__, b)
  2644. self.assertRaises(Exception, b.__eq__, a)
  2645. self.assertRaises(Exception, b.__ne__, a)
  2646. self.assertRaises(Exception, b.__lt__, a)
  2647. self.assertRaises(Exception, b.__gt__, a)
  2648. if sys.version_info < (3, 3):
  2649. self.assertRaises(Exception, a.__eq__, b.to_pydatetime())
  2650. self.assertRaises(Exception, a.to_pydatetime().__eq__, b)
  2651. else:
  2652. self.assertFalse(a == b.to_pydatetime())
  2653. self.assertFalse(a.to_pydatetime() == b)
  2654. def test_cant_compare_tz_naive_w_aware_explicit_pytz(self):
  2655. tm._skip_if_no_pytz()
  2656. from pytz import utc
  2657. # #1404
  2658. a = Timestamp('3/12/2012')
  2659. b = Timestamp('3/12/2012', tz=utc)
  2660. self.assertRaises(Exception, a.__eq__, b)
  2661. self.assertRaises(Exception, a.__ne__, b)
  2662. self.assertRaises(Exception, a.__lt__, b)
  2663. self.assertRaises(Exception, a.__gt__, b)
  2664. self.assertRaises(Exception, b.__eq__, a)
  2665. self.assertRaises(Exception, b.__ne__, a)
  2666. self.assertRaises(Exception, b.__lt__, a)
  2667. self.assertRaises(Exception, b.__gt__, a)
  2668. if sys.version_info < (3, 3):
  2669. self.assertRaises(Exception, a.__eq__, b.to_pydatetime())
  2670. self.assertRaises(Exception, a.to_pydatetime().__eq__, b)
  2671. else:
  2672. self.assertFalse(a == b.to_pydatetime())
  2673. self.assertFalse(a.to_pydatetime() == b)
  2674. def test_cant_compare_tz_naive_w_aware_dateutil(self):
  2675. tm._skip_if_no_dateutil()
  2676. from dateutil.tz import tzutc
  2677. utc = tzutc()
  2678. # #1404
  2679. a = Timestamp('3/12/2012')
  2680. b = Timestamp('3/12/2012', tz=utc)
  2681. self.assertRaises(Exception, a.__eq__, b)
  2682. self.assertRaises(Exception, a.__ne__, b)
  2683. self.assertRaises(Exception, a.__lt__, b)
  2684. self.assertRaises(Exception, a.__gt__, b)
  2685. self.assertRaises(Exception, b.__eq__, a)
  2686. self.assertRaises(Exception, b.__ne__, a)
  2687. self.assertRaises(Exception, b.__lt__, a)
  2688. self.assertRaises(Exception, b.__gt__, a)
  2689. if sys.version_info < (3, 3):
  2690. self.assertRaises(Exception, a.__eq__, b.to_pydatetime())
  2691. self.assertRaises(Exception, a.to_pydatetime().__eq__, b)
  2692. else:
  2693. self.assertFalse(a == b.to_pydatetime())
  2694. self.assertFalse(a.to_pydatetime() == b)
  2695. def test_delta_preserve_nanos(self):
  2696. val = Timestamp(long(1337299200000000123))
  2697. result = val + timedelta(1)
  2698. self.assertEqual(result.nanosecond, val.nanosecond)
  2699. def test_frequency_misc(self):
  2700. self.assertEqual(fmod.get_freq_group('T'),
  2701. fmod.FreqGroup.FR_MIN)
  2702. code, stride = fmod.get_freq_code(offsets.Hour())
  2703. self.assertEqual(code, fmod.FreqGroup.FR_HR)
  2704. code, stride = fmod.get_freq_code((5, 'T'))
  2705. self.assertEqual(code, fmod.FreqGroup.FR_MIN)
  2706. self.assertEqual(stride, 5)
  2707. offset = offsets.Hour()
  2708. result = fmod.to_offset(offset)
  2709. self.assertEqual(result, offset)
  2710. result = fmod.to_offset((5, 'T'))
  2711. expected = offsets.Minute(5)
  2712. self.assertEqual(result, expected)
  2713. self.assertRaises(ValueError, fmod.get_freq_code, (5, 'baz'))
  2714. self.assertRaises(ValueError, fmod.to_offset, '100foo')
  2715. self.assertRaises(ValueError, fmod.to_offset, ('', ''))
  2716. result = fmod.get_standard_freq(offsets.Hour())
  2717. self.assertEqual(result, 'H')
  2718. def test_hash_equivalent(self):
  2719. d = {datetime(2011, 1, 1): 5}
  2720. stamp = Timestamp(datetime(2011, 1, 1))
  2721. self.assertEqual(d[stamp], 5)
  2722. def test_timestamp_compare_scalars(self):
  2723. # case where ndim == 0
  2724. lhs = np.datetime64(datetime(2013, 12, 6))
  2725. rhs = Timestamp('now')
  2726. nat = Timestamp('nat')
  2727. ops = {'gt': 'lt', 'lt': 'gt', 'ge': 'le', 'le': 'ge', 'eq': 'eq',
  2728. 'ne': 'ne'}
  2729. for left, right in ops.items():
  2730. left_f = getattr(operator, left)
  2731. right_f = getattr(operator, right)
  2732. if pd._np_version_under1p7:
  2733. # you have to convert to timestamp for this to work with numpy
  2734. # scalars
  2735. expected = left_f(Timestamp(lhs), rhs)
  2736. # otherwise a TypeError is thrown
  2737. if left not in ('eq', 'ne'):
  2738. with tm.assertRaises(TypeError):
  2739. left_f(lhs, rhs)
  2740. else:
  2741. expected = left_f(lhs, rhs)
  2742. result = right_f(rhs, lhs)
  2743. self.assertEqual(result, expected)
  2744. expected = left_f(rhs, nat)
  2745. result = right_f(nat, rhs)
  2746. self.assertEqual(result, expected)
  2747. def test_timestamp_compare_series(self):
  2748. # make sure we can compare Timestamps on the right AND left hand side
  2749. # GH4982
  2750. s = Series(date_range('20010101', periods=10), name='dates')
  2751. s_nat = s.copy(deep=True)
  2752. s[0] = pd.Timestamp('nat')
  2753. s[3] = pd.Timestamp('nat')
  2754. ops = {'lt': 'gt', 'le': 'ge', 'eq': 'eq', 'ne': 'ne'}
  2755. for left, right in ops.items():
  2756. left_f = getattr(operator, left)
  2757. right_f = getattr(operator, right)
  2758. # no nats
  2759. expected = left_f(s, Timestamp('20010109'))
  2760. result = right_f(Timestamp('20010109'), s)
  2761. tm.assert_series_equal(result, expected)
  2762. # nats
  2763. expected = left_f(s, Timestamp('nat'))
  2764. result = right_f(Timestamp('nat'), s)
  2765. tm.assert_series_equal(result, expected)
  2766. # compare to timestamp with series containing nats
  2767. expected = left_f(s_nat, Timestamp('20010109'))
  2768. result = right_f(Timestamp('20010109'), s_nat)
  2769. tm.assert_series_equal(result, expected)
  2770. # compare to nat with series containing nats
  2771. expected = left_f(s_nat, Timestamp('nat'))
  2772. result = right_f(Timestamp('nat'), s_nat)
  2773. tm.assert_series_equal(result, expected)
  2774. class TestSlicing(tm.TestCase):
  2775. def test_slice_year(self):
  2776. dti = DatetimeIndex(freq='B', start=datetime(2005, 1, 1), periods=500)
  2777. s = Series(np.arange(len(dti)), index=dti)
  2778. result = s['2005']
  2779. expected = s[s.index.year == 2005]
  2780. assert_series_equal(result, expected)
  2781. df = DataFrame(np.random.rand(len(dti), 5), index=dti)
  2782. result = df.ix['2005']
  2783. expected = df[df.index.year == 2005]
  2784. assert_frame_equal(result, expected)
  2785. rng = date_range('1/1/2000', '1/1/2010')
  2786. result = rng.get_loc('2009')
  2787. expected = slice(3288, 3653)
  2788. self.assertEqual(result, expected)
  2789. def test_slice_quarter(self):
  2790. dti = DatetimeIndex(freq='D', start=datetime(2000, 6, 1), periods=500)
  2791. s = Series(np.arange(len(dti)), index=dti)
  2792. self.assertEqual(len(s['2001Q1']), 90)
  2793. df = DataFrame(np.random.rand(len(dti), 5), index=dti)
  2794. self.assertEqual(len(df.ix['1Q01']), 90)
  2795. def test_slice_month(self):
  2796. dti = DatetimeIndex(freq='D', start=datetime(2005, 1, 1), periods=500)
  2797. s = Series(np.arange(len(dti)), index=dti)
  2798. self.assertEqual(len(s['2005-11']), 30)
  2799. df = DataFrame(np.random.rand(len(dti), 5), index=dti)
  2800. self.assertEqual(len(df.ix['2005-11']), 30)
  2801. assert_series_equal(s['2005-11'], s['11-2005'])
  2802. def test_partial_slice(self):
  2803. rng = DatetimeIndex(freq='D', start=datetime(2005, 1, 1), periods=500)
  2804. s = Series(np.arange(len(rng)), index=rng)
  2805. result = s['2005-05':'2006-02']
  2806. expected = s['20050501':'20060228']
  2807. assert_series_equal(result, expected)
  2808. result = s['2005-05':]
  2809. expected = s['20050501':]
  2810. assert_series_equal(result, expected)
  2811. result = s[:'2006-02']
  2812. expected = s[:'20060228']
  2813. assert_series_equal(result, expected)
  2814. result = s['2005-1-1']
  2815. self.assertEqual(result, s.irow(0))
  2816. self.assertRaises(Exception, s.__getitem__, '2004-12-31')
  2817. def test_partial_slice_daily(self):
  2818. rng = DatetimeIndex(freq='H', start=datetime(2005, 1, 31), periods=500)
  2819. s = Series(np.arange(len(rng)), index=rng)
  2820. result = s['2005-1-31']
  2821. assert_series_equal(result, s.ix[:24])
  2822. self.assertRaises(Exception, s.__getitem__, '2004-12-31 00')
  2823. def test_partial_slice_hourly(self):
  2824. rng = DatetimeIndex(freq='T', start=datetime(2005, 1, 1, 20, 0, 0),
  2825. periods=500)
  2826. s = Series(np.arange(len(rng)), index=rng)
  2827. result = s['2005-1-1']
  2828. assert_series_equal(result, s.ix[:60 * 4])
  2829. result = s['2005-1-1 20']
  2830. assert_series_equal(result, s.ix[:60])
  2831. self.assertEqual(s['2005-1-1 20:00'], s.ix[0])
  2832. self.assertRaises(Exception, s.__getitem__, '2004-12-31 00:15')
  2833. def test_partial_slice_minutely(self):
  2834. rng = DatetimeIndex(freq='S', start=datetime(2005, 1, 1, 23, 59, 0),
  2835. periods=500)
  2836. s = Series(np.arange(len(rng)), index=rng)
  2837. result = s['2005-1-1 23:59']
  2838. assert_series_equal(result, s.ix[:60])
  2839. result = s['2005-1-1']
  2840. assert_series_equal(result, s.ix[:60])
  2841. self.assertEqual(s[Timestamp('2005-1-1 23:59:00')], s.ix[0])
  2842. self.assertRaises(Exception, s.__getitem__, '2004-12-31 00:00:00')
  2843. def test_partial_slicing_with_multiindex(self):
  2844. # GH 4758
  2845. # partial string indexing with a multi-index buggy
  2846. df = DataFrame({'ACCOUNT':["ACCT1", "ACCT1", "ACCT1", "ACCT2"],
  2847. 'TICKER':["ABC", "MNP", "XYZ", "XYZ"],
  2848. 'val':[1,2,3,4]},
  2849. index=date_range("2013-06-19 09:30:00", periods=4, freq='5T'))
  2850. df_multi = df.set_index(['ACCOUNT', 'TICKER'], append=True)
  2851. expected = DataFrame([[1]],index=Index(['ABC'],name='TICKER'),columns=['val'])
  2852. result = df_multi.loc[('2013-06-19 09:30:00', 'ACCT1')]
  2853. assert_frame_equal(result, expected)
  2854. expected = df_multi.loc[(pd.Timestamp('2013-06-19 09:30:00', tz=None), 'ACCT1', 'ABC')]
  2855. result = df_multi.loc[('2013-06-19 09:30:00', 'ACCT1', 'ABC')]
  2856. assert_series_equal(result, expected)
  2857. # this is a KeyError as we don't do partial string selection on multi-levels
  2858. def f():
  2859. df_multi.loc[('2013-06-19', 'ACCT1', 'ABC')]
  2860. self.assertRaises(KeyError, f)
  2861. # GH 4294
  2862. # partial slice on a series mi
  2863. s = pd.DataFrame(randn(1000, 1000), index=pd.date_range('2000-1-1', periods=1000)).stack()
  2864. s2 = s[:-1].copy()
  2865. expected = s2['2000-1-4']
  2866. result = s2[pd.Timestamp('2000-1-4')]
  2867. assert_series_equal(result, expected)
  2868. result = s[pd.Timestamp('2000-1-4')]
  2869. expected = s['2000-1-4']
  2870. assert_series_equal(result, expected)
  2871. df2 = pd.DataFrame(s)
  2872. expected = df2.ix['2000-1-4']
  2873. result = df2.ix[pd.Timestamp('2000-1-4')]
  2874. assert_frame_equal(result, expected)
  2875. def test_date_range_normalize(self):
  2876. snap = datetime.today()
  2877. n = 50
  2878. rng = date_range(snap, periods=n, normalize=False, freq='2D')
  2879. offset = timedelta(2)
  2880. values = np.array([snap + i * offset for i in range(n)],
  2881. dtype='M8[ns]')
  2882. self.assert_numpy_array_equal(rng, values)
  2883. rng = date_range(
  2884. '1/1/2000 08:15', periods=n, normalize=False, freq='B')
  2885. the_time = time(8, 15)
  2886. for val in rng:
  2887. self.assertEqual(val.time(), the_time)
  2888. def test_timedelta(self):
  2889. # this is valid too
  2890. index = date_range('1/1/2000', periods=50, freq='B')
  2891. shifted = index + timedelta(1)
  2892. back = shifted + timedelta(-1)
  2893. self.assertTrue(tm.equalContents(index, back))
  2894. self.assertEqual(shifted.freq, index.freq)
  2895. self.assertEqual(shifted.freq, back.freq)
  2896. result = index - timedelta(1)
  2897. expected = index + timedelta(-1)
  2898. self.assertTrue(result.equals(expected))
  2899. # GH4134, buggy with timedeltas
  2900. rng = date_range('2013', '2014')
  2901. s = Series(rng)
  2902. result1 = rng - pd.offsets.Hour(1)
  2903. result2 = DatetimeIndex(s - np.timedelta64(100000000))
  2904. result3 = rng - np.timedelta64(100000000)
  2905. result4 = DatetimeIndex(s - pd.offsets.Hour(1))
  2906. self.assertTrue(result1.equals(result4))
  2907. self.assertTrue(result2.equals(result3))
  2908. def test_shift(self):
  2909. ts = Series(np.random.randn(5),
  2910. index=date_range('1/1/2000', periods=5, freq='H'))
  2911. result = ts.shift(1, freq='5T')
  2912. exp_index = ts.index.shift(1, freq='5T')
  2913. self.assertTrue(result.index.equals(exp_index))
  2914. # GH #1063, multiple of same base
  2915. result = ts.shift(1, freq='4H')
  2916. exp_index = ts.index + datetools.Hour(4)
  2917. self.assertTrue(result.index.equals(exp_index))
  2918. idx = DatetimeIndex(['2000-01-01', '2000-01-02', '2000-01-04'])
  2919. self.assertRaises(ValueError, idx.shift, 1)
  2920. def test_setops_preserve_freq(self):
  2921. for tz in [None, 'Asia/Tokyo', 'US/Eastern']:
  2922. rng = date_range('1/1/2000', '1/1/2002', name='idx', tz=tz)
  2923. result = rng[:50].union(rng[50:100])
  2924. self.assertEqual(result.name, rng.name)
  2925. self.assertEqual(result.freq, rng.freq)
  2926. self.assertEqual(result.tz, rng.tz)
  2927. result = rng[:50].union(rng[30:100])
  2928. self.assertEqual(result.name, rng.name)
  2929. self.assertEqual(result.freq, rng.freq)
  2930. self.assertEqual(result.tz, rng.tz)
  2931. result = rng[:50].union(rng[60:100])
  2932. self.assertEqual(result.name, rng.name)
  2933. self.assertIsNone(result.freq)
  2934. self.assertEqual(result.tz, rng.tz)
  2935. result = rng[:50].intersection(rng[25:75])
  2936. self.assertEqual(result.name, rng.name)
  2937. self.assertEqual(result.freqstr, 'D')
  2938. self.assertEqual(result.tz, rng.tz)
  2939. nofreq = DatetimeIndex(list(rng[25:75]), name='other')
  2940. result = rng[:50].union(nofreq)
  2941. self.assertIsNone(result.name)
  2942. self.assertEqual(result.freq, rng.freq)
  2943. self.assertEqual(result.tz, rng.tz)
  2944. result = rng[:50].intersection(nofreq)
  2945. self.assertIsNone(result.name)
  2946. self.assertEqual(result.freq, rng.freq)
  2947. self.assertEqual(result.tz, rng.tz)
  2948. def test_min_max(self):
  2949. rng = date_range('1/1/2000', '12/31/2000')
  2950. rng2 = rng.take(np.random.permutation(len(rng)))
  2951. the_min = rng2.min()
  2952. the_max = rng2.max()
  2953. tm.assert_isinstance(the_min, Timestamp)
  2954. tm.assert_isinstance(the_max, Timestamp)
  2955. self.assertEqual(the_min, rng[0])
  2956. self.assertEqual(the_max, rng[-1])
  2957. self.assertEqual(rng.min(), rng[0])
  2958. self.assertEqual(rng.max(), rng[-1])
  2959. def test_min_max_series(self):
  2960. rng = date_range('1/1/2000', periods=10, freq='4h')
  2961. lvls = ['A', 'A', 'A', 'B', 'B', 'B', 'C', 'C', 'C', 'C']
  2962. df = DataFrame({'TS': rng, 'V': np.random.randn(len(rng)),
  2963. 'L': lvls})
  2964. result = df.TS.max()
  2965. exp = Timestamp(df.TS.iget(-1))
  2966. self.assertTrue(isinstance(result, Timestamp))
  2967. self.assertEqual(result, exp)
  2968. result = df.TS.min()
  2969. exp = Timestamp(df.TS.iget(0))
  2970. self.assertTrue(isinstance(result, Timestamp))
  2971. self.assertEqual(result, exp)
  2972. def test_from_M8_structured(self):
  2973. dates = [(datetime(2012, 9, 9, 0, 0),
  2974. datetime(2012, 9, 8, 15, 10))]
  2975. arr = np.array(dates,
  2976. dtype=[('Date', 'M8[us]'), ('Forecasting', 'M8[us]')])
  2977. df = DataFrame(arr)
  2978. self.assertEqual(df['Date'][0], dates[0][0])
  2979. self.assertEqual(df['Forecasting'][0], dates[0][1])
  2980. s = Series(arr['Date'])
  2981. self.assertTrue(s[0], Timestamp)
  2982. self.assertEqual(s[0], dates[0][0])
  2983. s = Series.from_array(arr['Date'], Index([0]))
  2984. self.assertEqual(s[0], dates[0][0])
  2985. def test_get_level_values_box(self):
  2986. from pandas import MultiIndex
  2987. dates = date_range('1/1/2000', periods=4)
  2988. levels = [dates, [0, 1]]
  2989. labels = [[0, 0, 1, 1, 2, 2, 3, 3],
  2990. [0, 1, 0, 1, 0, 1, 0, 1]]
  2991. index = MultiIndex(levels=levels, labels=labels)
  2992. self.assertTrue(isinstance(index.get_level_values(0)[0], Timestamp))
  2993. def test_frame_apply_dont_convert_datetime64(self):
  2994. from pandas.tseries.offsets import BDay
  2995. df = DataFrame({'x1': [datetime(1996, 1, 1)]})
  2996. df = df.applymap(lambda x: x + BDay())
  2997. df = df.applymap(lambda x: x + BDay())
  2998. self.assertTrue(df.x1.dtype == 'M8[ns]')
  2999. def test_date_range_fy5252(self):
  3000. dr = date_range(start="2013-01-01",
  3001. periods=2,
  3002. freq=offsets.FY5253(startingMonth=1,
  3003. weekday=3,
  3004. variation="nearest"))
  3005. self.assertEqual(dr[0], Timestamp('2013-01-31'))
  3006. self.assertEqual(dr[1], Timestamp('2014-01-30'))
  3007. class TimeConversionFormats(tm.TestCase):
  3008. def test_to_datetime_format(self):
  3009. values = ['1/1/2000', '1/2/2000', '1/3/2000']
  3010. results1 = [ Timestamp('20000101'), Timestamp('20000201'),
  3011. Timestamp('20000301') ]
  3012. results2 = [ Timestamp('20000101'), Timestamp('20000102'),
  3013. Timestamp('20000103') ]
  3014. for vals, expecteds in [ (values, (Index(results1), Index(results2))),
  3015. (Series(values),(Series(results1), Series(results2))),
  3016. (values[0], (results1[0], results2[0])),
  3017. (values[1], (results1[1], results2[1])),
  3018. (values[2], (results1[2], results2[2])) ]:
  3019. for i, fmt in enumerate(['%d/%m/%Y', '%m/%d/%Y']):
  3020. result = to_datetime(vals, format=fmt)
  3021. expected = expecteds[i]
  3022. if isinstance(expected, Series):
  3023. assert_series_equal(result, Series(expected))
  3024. elif isinstance(expected, Timestamp):
  3025. self.assertEqual(result, expected)
  3026. else:
  3027. self.assertTrue(result.equals(expected))
  3028. def test_to_datetime_format_YYYYMMDD(self):
  3029. s = Series([19801222,19801222] + [19810105]*5)
  3030. expected = Series([ Timestamp(x) for x in s.apply(str) ])
  3031. result = to_datetime(s,format='%Y%m%d')
  3032. assert_series_equal(result, expected)
  3033. result = to_datetime(s.apply(str),format='%Y%m%d')
  3034. assert_series_equal(result, expected)
  3035. # with NaT
  3036. expected = Series([Timestamp("19801222"),Timestamp("19801222")] + [Timestamp("19810105")]*5)
  3037. expected[2] = np.nan
  3038. s[2] = np.nan
  3039. result = to_datetime(s,format='%Y%m%d')
  3040. assert_series_equal(result, expected)
  3041. # string with NaT
  3042. s = s.apply(str)
  3043. s[2] = 'nat'
  3044. result = to_datetime(s,format='%Y%m%d')
  3045. assert_series_equal(result, expected)
  3046. def test_to_datetime_format_microsecond(self):
  3047. val = '01-Apr-2011 00:00:01.978'
  3048. format = '%d-%b-%Y %H:%M:%S.%f'
  3049. result = to_datetime(val, format=format)
  3050. exp = dt.datetime.strptime(val, format)
  3051. self.assertEqual(result, exp)
  3052. def test_to_datetime_format_time(self):
  3053. data = [
  3054. ['01/10/2010 15:20', '%m/%d/%Y %H:%M', Timestamp('2010-01-10 15:20')],
  3055. ['01/10/2010 05:43', '%m/%d/%Y %I:%M', Timestamp('2010-01-10 05:43')],
  3056. ['01/10/2010 13:56:01', '%m/%d/%Y %H:%M:%S', Timestamp('2010-01-10 13:56:01')]#,
  3057. #['01/10/2010 08:14 PM', '%m/%d/%Y %I:%M %p', Timestamp('2010-01-10 20:14')],
  3058. #['01/10/2010 07:40 AM', '%m/%d/%Y %I:%M %p', Timestamp('2010-01-10 07:40')],
  3059. #['01/10/2010 09:12:56 AM', '%m/%d/%Y %I:%M:%S %p', Timestamp('2010-01-10 09:12:56')]
  3060. ]
  3061. for s, format, dt in data:
  3062. self.assertEqual(to_datetime(s, format=format), dt)
  3063. def test_to_datetime_format_weeks(self):
  3064. data = [
  3065. ['2009324', '%Y%W%w', Timestamp('2009-08-13')],
  3066. ['2013020', '%Y%U%w', Timestamp('2013-01-13')]
  3067. ]
  3068. for s, format, dt in data:
  3069. self.assertEqual(to_datetime(s, format=format), dt)
  3070. class TestToDatetimeInferFormat(tm.TestCase):
  3071. def test_to_datetime_infer_datetime_format_consistent_format(self):
  3072. time_series = pd.Series(
  3073. pd.date_range('20000101', periods=50, freq='H')
  3074. )
  3075. test_formats = [
  3076. '%m-%d-%Y',
  3077. '%m/%d/%Y %H:%M:%S.%f',
  3078. '%Y-%m-%dT%H:%M:%S.%f',
  3079. ]
  3080. for test_format in test_formats:
  3081. s_as_dt_strings = time_series.apply(
  3082. lambda x: x.strftime(test_format)
  3083. )
  3084. with_format = pd.to_datetime(s_as_dt_strings, format=test_format)
  3085. no_infer = pd.to_datetime(
  3086. s_as_dt_strings, infer_datetime_format=False
  3087. )
  3088. yes_infer = pd.to_datetime(
  3089. s_as_dt_strings, infer_datetime_format=True
  3090. )
  3091. # Whether the format is explicitly passed, it is inferred, or
  3092. # it is not inferred, the results should all be the same
  3093. self.assert_numpy_array_equal(with_format, no_infer)
  3094. self.assert_numpy_array_equal(no_infer, yes_infer)
  3095. def test_to_datetime_infer_datetime_format_inconsistent_format(self):
  3096. test_series = pd.Series(
  3097. np.array([
  3098. '01/01/2011 00:00:00',
  3099. '01-02-2011 00:00:00',
  3100. '2011-01-03T00:00:00',
  3101. ]))
  3102. # When the format is inconsistent, infer_datetime_format should just
  3103. # fallback to the default parsing
  3104. self.assert_numpy_array_equal(
  3105. pd.to_datetime(test_series, infer_datetime_format=False),
  3106. pd.to_datetime(test_series, infer_datetime_format=True)
  3107. )
  3108. test_series = pd.Series(
  3109. np.array([
  3110. 'Jan/01/2011',
  3111. 'Feb/01/2011',
  3112. 'Mar/01/2011',
  3113. ]))
  3114. self.assert_numpy_array_equal(
  3115. pd.to_datetime(test_series, infer_datetime_format=False),
  3116. pd.to_datetime(test_series, infer_datetime_format=True)
  3117. )
  3118. def test_to_datetime_infer_datetime_format_series_with_nans(self):
  3119. test_series = pd.Series(
  3120. np.array([
  3121. '01/01/2011 00:00:00',
  3122. np.nan,
  3123. '01/03/2011 00:00:00',
  3124. np.nan,
  3125. ]))
  3126. self.assert_numpy_array_equal(
  3127. pd.to_datetime(test_series, infer_datetime_format=False),
  3128. pd.to_datetime(test_series, infer_datetime_format=True)
  3129. )
  3130. def test_to_datetime_infer_datetime_format_series_starting_with_nans(self):
  3131. test_series = pd.Series(
  3132. np.array([
  3133. np.nan,
  3134. np.nan,
  3135. '01/01/2011 00:00:00',
  3136. '01/02/2011 00:00:00',
  3137. '01/03/2011 00:00:00',
  3138. ]))
  3139. self.assert_numpy_array_equal(
  3140. pd.to_datetime(test_series, infer_datetime_format=False),
  3141. pd.to_datetime(test_series, infer_datetime_format=True)
  3142. )
  3143. class TestGuessDatetimeFormat(tm.TestCase):
  3144. def test_guess_datetime_format_with_parseable_formats(self):
  3145. dt_string_to_format = (
  3146. ('20111230', '%Y%m%d'),
  3147. ('2011-12-30', '%Y-%m-%d'),
  3148. ('30-12-2011', '%d-%m-%Y'),
  3149. ('2011-12-30 00:00:00', '%Y-%m-%d %H:%M:%S'),
  3150. ('2011-12-30T00:00:00', '%Y-%m-%dT%H:%M:%S'),
  3151. ('2011-12-30 00:00:00.000000', '%Y-%m-%d %H:%M:%S.%f'),
  3152. )
  3153. for dt_string, dt_format in dt_string_to_format:
  3154. self.assertEqual(
  3155. tools._guess_datetime_format(dt_string),
  3156. dt_format
  3157. )
  3158. def test_guess_datetime_format_with_dayfirst(self):
  3159. ambiguous_string = '01/01/2011'
  3160. self.assertEqual(
  3161. tools._guess_datetime_format(ambiguous_string, dayfirst=True),
  3162. '%d/%m/%Y'
  3163. )
  3164. self.assertEqual(
  3165. tools._guess_datetime_format(ambiguous_string, dayfirst=False),
  3166. '%m/%d/%Y'
  3167. )
  3168. def test_guess_datetime_format_with_locale_specific_formats(self):
  3169. # The month names will vary depending on the locale, in which
  3170. # case these wont be parsed properly (dateutil can't parse them)
  3171. _skip_if_has_locale()
  3172. dt_string_to_format = (
  3173. ('30/Dec/2011', '%d/%b/%Y'),
  3174. ('30/December/2011', '%d/%B/%Y'),
  3175. ('30/Dec/2011 00:00:00', '%d/%b/%Y %H:%M:%S'),
  3176. )
  3177. for dt_string, dt_format in dt_string_to_format:
  3178. self.assertEqual(
  3179. tools._guess_datetime_format(dt_string),
  3180. dt_format
  3181. )
  3182. def test_guess_datetime_format_invalid_inputs(self):
  3183. # A datetime string must include a year, month and a day for it
  3184. # to be guessable, in addition to being a string that looks like
  3185. # a datetime
  3186. invalid_dts = [
  3187. '2013',
  3188. '01/2013',
  3189. '12:00:00',
  3190. '1/1/1/1',
  3191. 'this_is_not_a_datetime',
  3192. '51a',
  3193. 9,
  3194. datetime(2011, 1, 1),
  3195. ]
  3196. for invalid_dt in invalid_dts:
  3197. self.assertTrue(tools._guess_datetime_format(invalid_dt) is None)
  3198. def test_guess_datetime_format_for_array(self):
  3199. expected_format = '%Y-%m-%d %H:%M:%S.%f'
  3200. dt_string = datetime(2011, 12, 30, 0, 0, 0).strftime(expected_format)
  3201. test_arrays = [
  3202. np.array([dt_string, dt_string, dt_string], dtype='O'),
  3203. np.array([np.nan, np.nan, dt_string], dtype='O'),
  3204. np.array([dt_string, 'random_string'], dtype='O'),
  3205. ]
  3206. for test_array in test_arrays:
  3207. self.assertEqual(
  3208. tools._guess_datetime_format_for_array(test_array),
  3209. expected_format
  3210. )
  3211. format_for_string_of_nans = tools._guess_datetime_format_for_array(
  3212. np.array([np.nan, np.nan, np.nan], dtype='O')
  3213. )
  3214. self.assertTrue(format_for_string_of_nans is None)
  3215. class TestTimestampToJulianDate(tm.TestCase):
  3216. def test_compare_1700(self):
  3217. r = Timestamp('1700-06-23').to_julian_date()
  3218. self.assertEqual(r, 2342145.5)
  3219. def test_compare_2000(self):
  3220. r = Timestamp('2000-04-12').to_julian_date()
  3221. self.assertEqual(r, 2451646.5)
  3222. def test_compare_2100(self):
  3223. r = Timestamp('2100-08-12').to_julian_date()
  3224. self.assertEqual(r, 2488292.5)
  3225. def test_compare_hour01(self):
  3226. r = Timestamp('2000-08-12T01:00:00').to_julian_date()
  3227. self.assertEqual(r, 2451768.5416666666666666)
  3228. def test_compare_hour13(self):
  3229. r = Timestamp('2000-08-12T13:00:00').to_julian_date()
  3230. self.assertEqual(r, 2451769.0416666666666666)
  3231. class TestDateTimeIndexToJulianDate(tm.TestCase):
  3232. def test_1700(self):
  3233. r1 = Float64Index([2345897.5,
  3234. 2345898.5,
  3235. 2345899.5,
  3236. 2345900.5,
  3237. 2345901.5])
  3238. r2 = date_range(start=Timestamp('1710-10-01'),
  3239. periods=5,
  3240. freq='D').to_julian_date()
  3241. self.assertIsInstance(r2, Float64Index)
  3242. tm.assert_index_equal(r1, r2)
  3243. def test_2000(self):
  3244. r1 = Float64Index([2451601.5,
  3245. 2451602.5,
  3246. 2451603.5,
  3247. 2451604.5,
  3248. 2451605.5])
  3249. r2 = date_range(start=Timestamp('2000-02-27'),
  3250. periods=5,
  3251. freq='D').to_julian_date()
  3252. self.assertIsInstance(r2, Float64Index)
  3253. tm.assert_index_equal(r1, r2)
  3254. def test_hour(self):
  3255. r1 = Float64Index([2451601.5,
  3256. 2451601.5416666666666666,
  3257. 2451601.5833333333333333,
  3258. 2451601.625,
  3259. 2451601.6666666666666666])
  3260. r2 = date_range(start=Timestamp('2000-02-27'),
  3261. periods=5,
  3262. freq='H').to_julian_date()
  3263. self.assertIsInstance(r2, Float64Index)
  3264. tm.assert_index_equal(r1, r2)
  3265. def test_minute(self):
  3266. r1 = Float64Index([2451601.5,
  3267. 2451601.5006944444444444,
  3268. 2451601.5013888888888888,
  3269. 2451601.5020833333333333,
  3270. 2451601.5027777777777777])
  3271. r2 = date_range(start=Timestamp('2000-02-27'),
  3272. periods=5,
  3273. freq='T').to_julian_date()
  3274. self.assertIsInstance(r2, Float64Index)
  3275. tm.assert_index_equal(r1, r2)
  3276. def test_second(self):
  3277. r1 = Float64Index([2451601.5,
  3278. 2451601.500011574074074,
  3279. 2451601.5000231481481481,
  3280. 2451601.5000347222222222,
  3281. 2451601.5000462962962962])
  3282. r2 = date_range(start=Timestamp('2000-02-27'),
  3283. periods=5,
  3284. freq='S').to_julian_date()
  3285. self.assertIsInstance(r2, Float64Index)
  3286. tm.assert_index_equal(r1, r2)
  3287. if __name__ == '__main__':
  3288. nose.runmodule(argv=[__file__, '-vvs', '-x', '--pdb', '--pdb-failure'],
  3289. exit=False)