test_partial_slicing.py 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. import numpy as np
  2. import pytest
  3. import pandas as pd
  4. from pandas import Series, Timedelta, timedelta_range
  5. from pandas.util.testing import assert_series_equal
  6. class TestSlicing(object):
  7. def test_slice_keeps_name(self):
  8. # GH4226
  9. dr = pd.timedelta_range('1d', '5d', freq='H', name='timebucket')
  10. assert dr[1:].name == dr.name
  11. def test_partial_slice(self):
  12. rng = timedelta_range('1 day 10:11:12', freq='h', periods=500)
  13. s = Series(np.arange(len(rng)), index=rng)
  14. result = s['5 day':'6 day']
  15. expected = s.iloc[86:134]
  16. assert_series_equal(result, expected)
  17. result = s['5 day':]
  18. expected = s.iloc[86:]
  19. assert_series_equal(result, expected)
  20. result = s[:'6 day']
  21. expected = s.iloc[:134]
  22. assert_series_equal(result, expected)
  23. result = s['6 days, 23:11:12']
  24. assert result == s.iloc[133]
  25. pytest.raises(KeyError, s.__getitem__, '50 days')
  26. def test_partial_slice_high_reso(self):
  27. # higher reso
  28. rng = timedelta_range('1 day 10:11:12', freq='us', periods=2000)
  29. s = Series(np.arange(len(rng)), index=rng)
  30. result = s['1 day 10:11:12':]
  31. expected = s.iloc[0:]
  32. assert_series_equal(result, expected)
  33. result = s['1 day 10:11:12.001':]
  34. expected = s.iloc[1000:]
  35. assert_series_equal(result, expected)
  36. result = s['1 days, 10:11:12.001001']
  37. assert result == s.iloc[1001]
  38. def test_slice_with_negative_step(self):
  39. ts = Series(np.arange(20), timedelta_range('0', periods=20, freq='H'))
  40. SLC = pd.IndexSlice
  41. def assert_slices_equivalent(l_slc, i_slc):
  42. assert_series_equal(ts[l_slc], ts.iloc[i_slc])
  43. assert_series_equal(ts.loc[l_slc], ts.iloc[i_slc])
  44. assert_series_equal(ts.loc[l_slc], ts.iloc[i_slc])
  45. assert_slices_equivalent(SLC[Timedelta(hours=7)::-1], SLC[7::-1])
  46. assert_slices_equivalent(SLC['7 hours'::-1], SLC[7::-1])
  47. assert_slices_equivalent(SLC[:Timedelta(hours=7):-1], SLC[:6:-1])
  48. assert_slices_equivalent(SLC[:'7 hours':-1], SLC[:6:-1])
  49. assert_slices_equivalent(SLC['15 hours':'7 hours':-1], SLC[15:6:-1])
  50. assert_slices_equivalent(SLC[Timedelta(hours=15):Timedelta(hours=7):-
  51. 1], SLC[15:6:-1])
  52. assert_slices_equivalent(SLC['15 hours':Timedelta(hours=7):-1],
  53. SLC[15:6:-1])
  54. assert_slices_equivalent(SLC[Timedelta(hours=15):'7 hours':-1],
  55. SLC[15:6:-1])
  56. assert_slices_equivalent(SLC['7 hours':'15 hours':-1], SLC[:0])
  57. def test_slice_with_zero_step_raises(self):
  58. ts = Series(np.arange(20), timedelta_range('0', periods=20, freq='H'))
  59. with pytest.raises(ValueError, match='slice step cannot be zero'):
  60. ts[::0]
  61. with pytest.raises(ValueError, match='slice step cannot be zero'):
  62. ts.loc[::0]
  63. with pytest.raises(ValueError, match='slice step cannot be zero'):
  64. ts.loc[::0]