test_indexing.py 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612
  1. from datetime import datetime, time, timedelta
  2. import numpy as np
  3. import pytest
  4. import pytz
  5. import pandas.compat as compat
  6. import pandas as pd
  7. from pandas import DatetimeIndex, Index, Timestamp, date_range, notna
  8. import pandas.util.testing as tm
  9. from pandas.tseries.offsets import BDay, CDay
  10. START, END = datetime(2009, 1, 1), datetime(2010, 1, 1)
  11. class TestGetItem(object):
  12. def test_ellipsis(self):
  13. # GH#21282
  14. idx = pd.date_range('2011-01-01', '2011-01-31', freq='D',
  15. tz='Asia/Tokyo', name='idx')
  16. result = idx[...]
  17. assert result.equals(idx)
  18. assert result is not idx
  19. def test_getitem(self):
  20. idx1 = pd.date_range('2011-01-01', '2011-01-31', freq='D', name='idx')
  21. idx2 = pd.date_range('2011-01-01', '2011-01-31', freq='D',
  22. tz='Asia/Tokyo', name='idx')
  23. for idx in [idx1, idx2]:
  24. result = idx[0]
  25. assert result == Timestamp('2011-01-01', tz=idx.tz)
  26. result = idx[0:5]
  27. expected = pd.date_range('2011-01-01', '2011-01-05', freq='D',
  28. tz=idx.tz, name='idx')
  29. tm.assert_index_equal(result, expected)
  30. assert result.freq == expected.freq
  31. result = idx[0:10:2]
  32. expected = pd.date_range('2011-01-01', '2011-01-09', freq='2D',
  33. tz=idx.tz, name='idx')
  34. tm.assert_index_equal(result, expected)
  35. assert result.freq == expected.freq
  36. result = idx[-20:-5:3]
  37. expected = pd.date_range('2011-01-12', '2011-01-24', freq='3D',
  38. tz=idx.tz, name='idx')
  39. tm.assert_index_equal(result, expected)
  40. assert result.freq == expected.freq
  41. result = idx[4::-1]
  42. expected = DatetimeIndex(['2011-01-05', '2011-01-04', '2011-01-03',
  43. '2011-01-02', '2011-01-01'],
  44. freq='-1D', tz=idx.tz, name='idx')
  45. tm.assert_index_equal(result, expected)
  46. assert result.freq == expected.freq
  47. def test_dti_business_getitem(self):
  48. rng = pd.bdate_range(START, END)
  49. smaller = rng[:5]
  50. exp = DatetimeIndex(rng.view(np.ndarray)[:5])
  51. tm.assert_index_equal(smaller, exp)
  52. assert smaller.freq == rng.freq
  53. sliced = rng[::5]
  54. assert sliced.freq == BDay() * 5
  55. fancy_indexed = rng[[4, 3, 2, 1, 0]]
  56. assert len(fancy_indexed) == 5
  57. assert isinstance(fancy_indexed, DatetimeIndex)
  58. assert fancy_indexed.freq is None
  59. # 32-bit vs. 64-bit platforms
  60. assert rng[4] == rng[np.int_(4)]
  61. def test_dti_business_getitem_matplotlib_hackaround(self):
  62. rng = pd.bdate_range(START, END)
  63. values = rng[:, None]
  64. expected = rng.values[:, None]
  65. tm.assert_numpy_array_equal(values, expected)
  66. def test_dti_custom_getitem(self):
  67. rng = pd.bdate_range(START, END, freq='C')
  68. smaller = rng[:5]
  69. exp = DatetimeIndex(rng.view(np.ndarray)[:5])
  70. tm.assert_index_equal(smaller, exp)
  71. assert smaller.freq == rng.freq
  72. sliced = rng[::5]
  73. assert sliced.freq == CDay() * 5
  74. fancy_indexed = rng[[4, 3, 2, 1, 0]]
  75. assert len(fancy_indexed) == 5
  76. assert isinstance(fancy_indexed, DatetimeIndex)
  77. assert fancy_indexed.freq is None
  78. # 32-bit vs. 64-bit platforms
  79. assert rng[4] == rng[np.int_(4)]
  80. def test_dti_custom_getitem_matplotlib_hackaround(self):
  81. rng = pd.bdate_range(START, END, freq='C')
  82. values = rng[:, None]
  83. expected = rng.values[:, None]
  84. tm.assert_numpy_array_equal(values, expected)
  85. class TestWhere(object):
  86. def test_where_other(self):
  87. # other is ndarray or Index
  88. i = pd.date_range('20130101', periods=3, tz='US/Eastern')
  89. for arr in [np.nan, pd.NaT]:
  90. result = i.where(notna(i), other=np.nan)
  91. expected = i
  92. tm.assert_index_equal(result, expected)
  93. i2 = i.copy()
  94. i2 = Index([pd.NaT, pd.NaT] + i[2:].tolist())
  95. result = i.where(notna(i2), i2)
  96. tm.assert_index_equal(result, i2)
  97. i2 = i.copy()
  98. i2 = Index([pd.NaT, pd.NaT] + i[2:].tolist())
  99. result = i.where(notna(i2), i2.values)
  100. tm.assert_index_equal(result, i2)
  101. def test_where_tz(self):
  102. i = pd.date_range('20130101', periods=3, tz='US/Eastern')
  103. result = i.where(notna(i))
  104. expected = i
  105. tm.assert_index_equal(result, expected)
  106. i2 = i.copy()
  107. i2 = Index([pd.NaT, pd.NaT] + i[2:].tolist())
  108. result = i.where(notna(i2))
  109. expected = i2
  110. tm.assert_index_equal(result, expected)
  111. class TestTake(object):
  112. def test_take(self):
  113. # GH#10295
  114. idx1 = pd.date_range('2011-01-01', '2011-01-31', freq='D', name='idx')
  115. idx2 = pd.date_range('2011-01-01', '2011-01-31', freq='D',
  116. tz='Asia/Tokyo', name='idx')
  117. for idx in [idx1, idx2]:
  118. result = idx.take([0])
  119. assert result == Timestamp('2011-01-01', tz=idx.tz)
  120. result = idx.take([0, 1, 2])
  121. expected = pd.date_range('2011-01-01', '2011-01-03', freq='D',
  122. tz=idx.tz, name='idx')
  123. tm.assert_index_equal(result, expected)
  124. assert result.freq == expected.freq
  125. result = idx.take([0, 2, 4])
  126. expected = pd.date_range('2011-01-01', '2011-01-05', freq='2D',
  127. tz=idx.tz, name='idx')
  128. tm.assert_index_equal(result, expected)
  129. assert result.freq == expected.freq
  130. result = idx.take([7, 4, 1])
  131. expected = pd.date_range('2011-01-08', '2011-01-02', freq='-3D',
  132. tz=idx.tz, name='idx')
  133. tm.assert_index_equal(result, expected)
  134. assert result.freq == expected.freq
  135. result = idx.take([3, 2, 5])
  136. expected = DatetimeIndex(['2011-01-04', '2011-01-03',
  137. '2011-01-06'],
  138. freq=None, tz=idx.tz, name='idx')
  139. tm.assert_index_equal(result, expected)
  140. assert result.freq is None
  141. result = idx.take([-3, 2, 5])
  142. expected = DatetimeIndex(['2011-01-29', '2011-01-03',
  143. '2011-01-06'],
  144. freq=None, tz=idx.tz, name='idx')
  145. tm.assert_index_equal(result, expected)
  146. assert result.freq is None
  147. def test_take_invalid_kwargs(self):
  148. idx = pd.date_range('2011-01-01', '2011-01-31', freq='D', name='idx')
  149. indices = [1, 6, 5, 9, 10, 13, 15, 3]
  150. msg = r"take\(\) got an unexpected keyword argument 'foo'"
  151. with pytest.raises(TypeError, match=msg):
  152. idx.take(indices, foo=2)
  153. msg = "the 'out' parameter is not supported"
  154. with pytest.raises(ValueError, match=msg):
  155. idx.take(indices, out=indices)
  156. msg = "the 'mode' parameter is not supported"
  157. with pytest.raises(ValueError, match=msg):
  158. idx.take(indices, mode='clip')
  159. # TODO: This method came from test_datetime; de-dup with version above
  160. @pytest.mark.parametrize('tz', [None, 'US/Eastern', 'Asia/Tokyo'])
  161. def test_take2(self, tz):
  162. dates = [datetime(2010, 1, 1, 14), datetime(2010, 1, 1, 15),
  163. datetime(2010, 1, 1, 17), datetime(2010, 1, 1, 21)]
  164. idx = pd.date_range(start='2010-01-01 09:00',
  165. end='2010-02-01 09:00', freq='H', tz=tz,
  166. name='idx')
  167. expected = DatetimeIndex(dates, freq=None, name='idx', tz=tz)
  168. taken1 = idx.take([5, 6, 8, 12])
  169. taken2 = idx[[5, 6, 8, 12]]
  170. for taken in [taken1, taken2]:
  171. tm.assert_index_equal(taken, expected)
  172. assert isinstance(taken, DatetimeIndex)
  173. assert taken.freq is None
  174. assert taken.tz == expected.tz
  175. assert taken.name == expected.name
  176. def test_take_fill_value(self):
  177. # GH#12631
  178. idx = pd.DatetimeIndex(['2011-01-01', '2011-02-01', '2011-03-01'],
  179. name='xxx')
  180. result = idx.take(np.array([1, 0, -1]))
  181. expected = pd.DatetimeIndex(['2011-02-01', '2011-01-01', '2011-03-01'],
  182. name='xxx')
  183. tm.assert_index_equal(result, expected)
  184. # fill_value
  185. result = idx.take(np.array([1, 0, -1]), fill_value=True)
  186. expected = pd.DatetimeIndex(['2011-02-01', '2011-01-01', 'NaT'],
  187. name='xxx')
  188. tm.assert_index_equal(result, expected)
  189. # allow_fill=False
  190. result = idx.take(np.array([1, 0, -1]), allow_fill=False,
  191. fill_value=True)
  192. expected = pd.DatetimeIndex(['2011-02-01', '2011-01-01', '2011-03-01'],
  193. name='xxx')
  194. tm.assert_index_equal(result, expected)
  195. msg = ('When allow_fill=True and fill_value is not None, '
  196. 'all indices must be >= -1')
  197. with pytest.raises(ValueError, match=msg):
  198. idx.take(np.array([1, 0, -2]), fill_value=True)
  199. with pytest.raises(ValueError, match=msg):
  200. idx.take(np.array([1, 0, -5]), fill_value=True)
  201. with pytest.raises(IndexError):
  202. idx.take(np.array([1, -5]))
  203. def test_take_fill_value_with_timezone(self):
  204. idx = pd.DatetimeIndex(['2011-01-01', '2011-02-01', '2011-03-01'],
  205. name='xxx', tz='US/Eastern')
  206. result = idx.take(np.array([1, 0, -1]))
  207. expected = pd.DatetimeIndex(['2011-02-01', '2011-01-01', '2011-03-01'],
  208. name='xxx', tz='US/Eastern')
  209. tm.assert_index_equal(result, expected)
  210. # fill_value
  211. result = idx.take(np.array([1, 0, -1]), fill_value=True)
  212. expected = pd.DatetimeIndex(['2011-02-01', '2011-01-01', 'NaT'],
  213. name='xxx', tz='US/Eastern')
  214. tm.assert_index_equal(result, expected)
  215. # allow_fill=False
  216. result = idx.take(np.array([1, 0, -1]), allow_fill=False,
  217. fill_value=True)
  218. expected = pd.DatetimeIndex(['2011-02-01', '2011-01-01', '2011-03-01'],
  219. name='xxx', tz='US/Eastern')
  220. tm.assert_index_equal(result, expected)
  221. msg = ('When allow_fill=True and fill_value is not None, '
  222. 'all indices must be >= -1')
  223. with pytest.raises(ValueError, match=msg):
  224. idx.take(np.array([1, 0, -2]), fill_value=True)
  225. with pytest.raises(ValueError, match=msg):
  226. idx.take(np.array([1, 0, -5]), fill_value=True)
  227. with pytest.raises(IndexError):
  228. idx.take(np.array([1, -5]))
  229. class TestDatetimeIndex(object):
  230. @pytest.mark.parametrize('null', [None, np.nan, pd.NaT])
  231. @pytest.mark.parametrize('tz', [None, 'UTC', 'US/Eastern'])
  232. def test_insert_nat(self, tz, null):
  233. # GH#16537, GH#18295 (test missing)
  234. idx = pd.DatetimeIndex(['2017-01-01'], tz=tz)
  235. expected = pd.DatetimeIndex(['NaT', '2017-01-01'], tz=tz)
  236. res = idx.insert(0, null)
  237. tm.assert_index_equal(res, expected)
  238. def test_insert(self):
  239. idx = DatetimeIndex(
  240. ['2000-01-04', '2000-01-01', '2000-01-02'], name='idx')
  241. result = idx.insert(2, datetime(2000, 1, 5))
  242. exp = DatetimeIndex(['2000-01-04', '2000-01-01', '2000-01-05',
  243. '2000-01-02'], name='idx')
  244. tm.assert_index_equal(result, exp)
  245. # insertion of non-datetime should coerce to object index
  246. result = idx.insert(1, 'inserted')
  247. expected = Index([datetime(2000, 1, 4), 'inserted',
  248. datetime(2000, 1, 1),
  249. datetime(2000, 1, 2)], name='idx')
  250. assert not isinstance(result, DatetimeIndex)
  251. tm.assert_index_equal(result, expected)
  252. assert result.name == expected.name
  253. idx = date_range('1/1/2000', periods=3, freq='M', name='idx')
  254. # preserve freq
  255. expected_0 = DatetimeIndex(['1999-12-31', '2000-01-31', '2000-02-29',
  256. '2000-03-31'], name='idx', freq='M')
  257. expected_3 = DatetimeIndex(['2000-01-31', '2000-02-29', '2000-03-31',
  258. '2000-04-30'], name='idx', freq='M')
  259. # reset freq to None
  260. expected_1_nofreq = DatetimeIndex(['2000-01-31', '2000-01-31',
  261. '2000-02-29',
  262. '2000-03-31'], name='idx',
  263. freq=None)
  264. expected_3_nofreq = DatetimeIndex(['2000-01-31', '2000-02-29',
  265. '2000-03-31',
  266. '2000-01-02'], name='idx',
  267. freq=None)
  268. cases = [(0, datetime(1999, 12, 31), expected_0),
  269. (-3, datetime(1999, 12, 31), expected_0),
  270. (3, datetime(2000, 4, 30), expected_3),
  271. (1, datetime(2000, 1, 31), expected_1_nofreq),
  272. (3, datetime(2000, 1, 2), expected_3_nofreq)]
  273. for n, d, expected in cases:
  274. result = idx.insert(n, d)
  275. tm.assert_index_equal(result, expected)
  276. assert result.name == expected.name
  277. assert result.freq == expected.freq
  278. # reset freq to None
  279. result = idx.insert(3, datetime(2000, 1, 2))
  280. expected = DatetimeIndex(['2000-01-31', '2000-02-29', '2000-03-31',
  281. '2000-01-02'], name='idx', freq=None)
  282. tm.assert_index_equal(result, expected)
  283. assert result.name == expected.name
  284. assert result.freq is None
  285. # see gh-7299
  286. idx = date_range('1/1/2000', periods=3, freq='D', tz='Asia/Tokyo',
  287. name='idx')
  288. with pytest.raises(ValueError):
  289. idx.insert(3, pd.Timestamp('2000-01-04'))
  290. with pytest.raises(ValueError):
  291. idx.insert(3, datetime(2000, 1, 4))
  292. with pytest.raises(ValueError):
  293. idx.insert(3, pd.Timestamp('2000-01-04', tz='US/Eastern'))
  294. with pytest.raises(ValueError):
  295. idx.insert(3, datetime(2000, 1, 4,
  296. tzinfo=pytz.timezone('US/Eastern')))
  297. for tz in ['US/Pacific', 'Asia/Singapore']:
  298. idx = date_range('1/1/2000 09:00', periods=6, freq='H', tz=tz,
  299. name='idx')
  300. # preserve freq
  301. expected = date_range('1/1/2000 09:00', periods=7, freq='H', tz=tz,
  302. name='idx')
  303. for d in [pd.Timestamp('2000-01-01 15:00', tz=tz),
  304. pytz.timezone(tz).localize(datetime(2000, 1, 1, 15))]:
  305. result = idx.insert(6, d)
  306. tm.assert_index_equal(result, expected)
  307. assert result.name == expected.name
  308. assert result.freq == expected.freq
  309. assert result.tz == expected.tz
  310. expected = DatetimeIndex(['2000-01-01 09:00', '2000-01-01 10:00',
  311. '2000-01-01 11:00',
  312. '2000-01-01 12:00', '2000-01-01 13:00',
  313. '2000-01-01 14:00',
  314. '2000-01-01 10:00'], name='idx',
  315. tz=tz, freq=None)
  316. # reset freq to None
  317. for d in [pd.Timestamp('2000-01-01 10:00', tz=tz),
  318. pytz.timezone(tz).localize(datetime(2000, 1, 1, 10))]:
  319. result = idx.insert(6, d)
  320. tm.assert_index_equal(result, expected)
  321. assert result.name == expected.name
  322. assert result.tz == expected.tz
  323. assert result.freq is None
  324. def test_delete(self):
  325. idx = date_range(start='2000-01-01', periods=5, freq='M', name='idx')
  326. # prserve freq
  327. expected_0 = date_range(start='2000-02-01', periods=4, freq='M',
  328. name='idx')
  329. expected_4 = date_range(start='2000-01-01', periods=4, freq='M',
  330. name='idx')
  331. # reset freq to None
  332. expected_1 = DatetimeIndex(['2000-01-31', '2000-03-31', '2000-04-30',
  333. '2000-05-31'], freq=None, name='idx')
  334. cases = {0: expected_0,
  335. -5: expected_0,
  336. -1: expected_4,
  337. 4: expected_4,
  338. 1: expected_1}
  339. for n, expected in compat.iteritems(cases):
  340. result = idx.delete(n)
  341. tm.assert_index_equal(result, expected)
  342. assert result.name == expected.name
  343. assert result.freq == expected.freq
  344. with pytest.raises((IndexError, ValueError)):
  345. # either depending on numpy version
  346. idx.delete(5)
  347. for tz in [None, 'Asia/Tokyo', 'US/Pacific']:
  348. idx = date_range(start='2000-01-01 09:00', periods=10, freq='H',
  349. name='idx', tz=tz)
  350. expected = date_range(start='2000-01-01 10:00', periods=9,
  351. freq='H', name='idx', tz=tz)
  352. result = idx.delete(0)
  353. tm.assert_index_equal(result, expected)
  354. assert result.name == expected.name
  355. assert result.freqstr == 'H'
  356. assert result.tz == expected.tz
  357. expected = date_range(start='2000-01-01 09:00', periods=9,
  358. freq='H', name='idx', tz=tz)
  359. result = idx.delete(-1)
  360. tm.assert_index_equal(result, expected)
  361. assert result.name == expected.name
  362. assert result.freqstr == 'H'
  363. assert result.tz == expected.tz
  364. def test_delete_slice(self):
  365. idx = date_range(start='2000-01-01', periods=10, freq='D', name='idx')
  366. # prserve freq
  367. expected_0_2 = date_range(start='2000-01-04', periods=7, freq='D',
  368. name='idx')
  369. expected_7_9 = date_range(start='2000-01-01', periods=7, freq='D',
  370. name='idx')
  371. # reset freq to None
  372. expected_3_5 = DatetimeIndex(['2000-01-01', '2000-01-02', '2000-01-03',
  373. '2000-01-07', '2000-01-08', '2000-01-09',
  374. '2000-01-10'], freq=None, name='idx')
  375. cases = {(0, 1, 2): expected_0_2,
  376. (7, 8, 9): expected_7_9,
  377. (3, 4, 5): expected_3_5}
  378. for n, expected in compat.iteritems(cases):
  379. result = idx.delete(n)
  380. tm.assert_index_equal(result, expected)
  381. assert result.name == expected.name
  382. assert result.freq == expected.freq
  383. result = idx.delete(slice(n[0], n[-1] + 1))
  384. tm.assert_index_equal(result, expected)
  385. assert result.name == expected.name
  386. assert result.freq == expected.freq
  387. for tz in [None, 'Asia/Tokyo', 'US/Pacific']:
  388. ts = pd.Series(1, index=pd.date_range(
  389. '2000-01-01 09:00', periods=10, freq='H', name='idx', tz=tz))
  390. # preserve freq
  391. result = ts.drop(ts.index[:5]).index
  392. expected = pd.date_range('2000-01-01 14:00', periods=5, freq='H',
  393. name='idx', tz=tz)
  394. tm.assert_index_equal(result, expected)
  395. assert result.name == expected.name
  396. assert result.freq == expected.freq
  397. assert result.tz == expected.tz
  398. # reset freq to None
  399. result = ts.drop(ts.index[[1, 3, 5, 7, 9]]).index
  400. expected = DatetimeIndex(['2000-01-01 09:00', '2000-01-01 11:00',
  401. '2000-01-01 13:00',
  402. '2000-01-01 15:00', '2000-01-01 17:00'],
  403. freq=None, name='idx', tz=tz)
  404. tm.assert_index_equal(result, expected)
  405. assert result.name == expected.name
  406. assert result.freq == expected.freq
  407. assert result.tz == expected.tz
  408. def test_get_loc(self):
  409. idx = pd.date_range('2000-01-01', periods=3)
  410. for method in [None, 'pad', 'backfill', 'nearest']:
  411. assert idx.get_loc(idx[1], method) == 1
  412. assert idx.get_loc(idx[1].to_pydatetime(), method) == 1
  413. assert idx.get_loc(str(idx[1]), method) == 1
  414. if method is not None:
  415. assert idx.get_loc(idx[1], method,
  416. tolerance=pd.Timedelta('0 days')) == 1
  417. assert idx.get_loc('2000-01-01', method='nearest') == 0
  418. assert idx.get_loc('2000-01-01T12', method='nearest') == 1
  419. assert idx.get_loc('2000-01-01T12', method='nearest',
  420. tolerance='1 day') == 1
  421. assert idx.get_loc('2000-01-01T12', method='nearest',
  422. tolerance=pd.Timedelta('1D')) == 1
  423. assert idx.get_loc('2000-01-01T12', method='nearest',
  424. tolerance=np.timedelta64(1, 'D')) == 1
  425. assert idx.get_loc('2000-01-01T12', method='nearest',
  426. tolerance=timedelta(1)) == 1
  427. with pytest.raises(ValueError, match='unit abbreviation w/o a number'):
  428. idx.get_loc('2000-01-01T12', method='nearest', tolerance='foo')
  429. with pytest.raises(KeyError):
  430. idx.get_loc('2000-01-01T03', method='nearest', tolerance='2 hours')
  431. with pytest.raises(
  432. ValueError,
  433. match='tolerance size must match target index size'):
  434. idx.get_loc('2000-01-01', method='nearest',
  435. tolerance=[pd.Timedelta('1day').to_timedelta64(),
  436. pd.Timedelta('1day').to_timedelta64()])
  437. assert idx.get_loc('2000', method='nearest') == slice(0, 3)
  438. assert idx.get_loc('2000-01', method='nearest') == slice(0, 3)
  439. assert idx.get_loc('1999', method='nearest') == 0
  440. assert idx.get_loc('2001', method='nearest') == 2
  441. with pytest.raises(KeyError):
  442. idx.get_loc('1999', method='pad')
  443. with pytest.raises(KeyError):
  444. idx.get_loc('2001', method='backfill')
  445. with pytest.raises(KeyError):
  446. idx.get_loc('foobar')
  447. with pytest.raises(TypeError):
  448. idx.get_loc(slice(2))
  449. idx = pd.to_datetime(['2000-01-01', '2000-01-04'])
  450. assert idx.get_loc('2000-01-02', method='nearest') == 0
  451. assert idx.get_loc('2000-01-03', method='nearest') == 1
  452. assert idx.get_loc('2000-01', method='nearest') == slice(0, 2)
  453. # time indexing
  454. idx = pd.date_range('2000-01-01', periods=24, freq='H')
  455. tm.assert_numpy_array_equal(idx.get_loc(time(12)),
  456. np.array([12]), check_dtype=False)
  457. tm.assert_numpy_array_equal(idx.get_loc(time(12, 30)),
  458. np.array([]), check_dtype=False)
  459. with pytest.raises(NotImplementedError):
  460. idx.get_loc(time(12, 30), method='pad')
  461. def test_get_indexer(self):
  462. idx = pd.date_range('2000-01-01', periods=3)
  463. exp = np.array([0, 1, 2], dtype=np.intp)
  464. tm.assert_numpy_array_equal(idx.get_indexer(idx), exp)
  465. target = idx[0] + pd.to_timedelta(['-1 hour', '12 hours',
  466. '1 day 1 hour'])
  467. tm.assert_numpy_array_equal(idx.get_indexer(target, 'pad'),
  468. np.array([-1, 0, 1], dtype=np.intp))
  469. tm.assert_numpy_array_equal(idx.get_indexer(target, 'backfill'),
  470. np.array([0, 1, 2], dtype=np.intp))
  471. tm.assert_numpy_array_equal(idx.get_indexer(target, 'nearest'),
  472. np.array([0, 1, 1], dtype=np.intp))
  473. tm.assert_numpy_array_equal(
  474. idx.get_indexer(target, 'nearest',
  475. tolerance=pd.Timedelta('1 hour')),
  476. np.array([0, -1, 1], dtype=np.intp))
  477. tol_raw = [pd.Timedelta('1 hour'),
  478. pd.Timedelta('1 hour'),
  479. pd.Timedelta('1 hour').to_timedelta64(), ]
  480. tm.assert_numpy_array_equal(
  481. idx.get_indexer(target, 'nearest',
  482. tolerance=[np.timedelta64(x) for x in tol_raw]),
  483. np.array([0, -1, 1], dtype=np.intp))
  484. tol_bad = [pd.Timedelta('2 hour').to_timedelta64(),
  485. pd.Timedelta('1 hour').to_timedelta64(),
  486. 'foo', ]
  487. with pytest.raises(
  488. ValueError, match='abbreviation w/o a number'):
  489. idx.get_indexer(target, 'nearest', tolerance=tol_bad)
  490. with pytest.raises(ValueError):
  491. idx.get_indexer(idx[[0]], method='nearest', tolerance='foo')
  492. def test_reasonable_key_error(self):
  493. # GH#1062
  494. index = DatetimeIndex(['1/3/2000'])
  495. with pytest.raises(KeyError, match='2000'):
  496. index.get_loc('1/1/2000')
  497. @pytest.mark.parametrize('key', [pd.Timedelta(0),
  498. pd.Timedelta(1),
  499. timedelta(0)])
  500. def test_timedelta_invalid_key(self, key):
  501. # GH#20464
  502. dti = pd.date_range('1970-01-01', periods=10)
  503. with pytest.raises(TypeError):
  504. dti.get_loc(key)
  505. def test_get_loc_nat(self):
  506. # GH#20464
  507. index = DatetimeIndex(['1/3/2000', 'NaT'])
  508. assert index.get_loc(pd.NaT) == 1