test_partial_slicing.py 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. import numpy as np
  2. import pytest
  3. import pandas as pd
  4. from pandas import DataFrame, Period, Series, period_range
  5. from pandas.util import testing as tm
  6. class TestPeriodIndex(object):
  7. def setup_method(self, method):
  8. pass
  9. def test_slice_with_negative_step(self):
  10. ts = Series(np.arange(20),
  11. period_range('2014-01', periods=20, freq='M'))
  12. SLC = pd.IndexSlice
  13. def assert_slices_equivalent(l_slc, i_slc):
  14. tm.assert_series_equal(ts[l_slc], ts.iloc[i_slc])
  15. tm.assert_series_equal(ts.loc[l_slc], ts.iloc[i_slc])
  16. tm.assert_series_equal(ts.loc[l_slc], ts.iloc[i_slc])
  17. assert_slices_equivalent(SLC[Period('2014-10')::-1], SLC[9::-1])
  18. assert_slices_equivalent(SLC['2014-10'::-1], SLC[9::-1])
  19. assert_slices_equivalent(SLC[:Period('2014-10'):-1], SLC[:8:-1])
  20. assert_slices_equivalent(SLC[:'2014-10':-1], SLC[:8:-1])
  21. assert_slices_equivalent(SLC['2015-02':'2014-10':-1], SLC[13:8:-1])
  22. assert_slices_equivalent(SLC[Period('2015-02'):Period('2014-10'):-1],
  23. SLC[13:8:-1])
  24. assert_slices_equivalent(SLC['2015-02':Period('2014-10'):-1],
  25. SLC[13:8:-1])
  26. assert_slices_equivalent(SLC[Period('2015-02'):'2014-10':-1],
  27. SLC[13:8:-1])
  28. assert_slices_equivalent(SLC['2014-10':'2015-02':-1], SLC[:0])
  29. def test_slice_with_zero_step_raises(self):
  30. ts = Series(np.arange(20),
  31. period_range('2014-01', periods=20, freq='M'))
  32. with pytest.raises(ValueError, match='slice step cannot be zero'):
  33. ts[::0]
  34. with pytest.raises(ValueError, match='slice step cannot be zero'):
  35. ts.loc[::0]
  36. with pytest.raises(ValueError, match='slice step cannot be zero'):
  37. ts.loc[::0]
  38. def test_slice_keep_name(self):
  39. idx = period_range('20010101', periods=10, freq='D', name='bob')
  40. assert idx.name == idx[1:].name
  41. def test_pindex_slice_index(self):
  42. pi = period_range(start='1/1/10', end='12/31/12', freq='M')
  43. s = Series(np.random.rand(len(pi)), index=pi)
  44. res = s['2010']
  45. exp = s[0:12]
  46. tm.assert_series_equal(res, exp)
  47. res = s['2011']
  48. exp = s[12:24]
  49. tm.assert_series_equal(res, exp)
  50. def test_range_slice_day(self):
  51. # GH#6716
  52. didx = pd.date_range(start='2013/01/01', freq='D', periods=400)
  53. pidx = period_range(start='2013/01/01', freq='D', periods=400)
  54. for idx in [didx, pidx]:
  55. # slices against index should raise IndexError
  56. values = ['2014', '2013/02', '2013/01/02', '2013/02/01 9H',
  57. '2013/02/01 09:00']
  58. for v in values:
  59. with pytest.raises(TypeError):
  60. idx[v:]
  61. s = Series(np.random.rand(len(idx)), index=idx)
  62. tm.assert_series_equal(s['2013/01/02':], s[1:])
  63. tm.assert_series_equal(s['2013/01/02':'2013/01/05'], s[1:5])
  64. tm.assert_series_equal(s['2013/02':], s[31:])
  65. tm.assert_series_equal(s['2014':], s[365:])
  66. invalid = ['2013/02/01 9H', '2013/02/01 09:00']
  67. for v in invalid:
  68. with pytest.raises(TypeError):
  69. idx[v:]
  70. def test_range_slice_seconds(self):
  71. # GH#6716
  72. didx = pd.date_range(start='2013/01/01 09:00:00', freq='S',
  73. periods=4000)
  74. pidx = period_range(start='2013/01/01 09:00:00', freq='S',
  75. periods=4000)
  76. for idx in [didx, pidx]:
  77. # slices against index should raise IndexError
  78. values = ['2014', '2013/02', '2013/01/02', '2013/02/01 9H',
  79. '2013/02/01 09:00']
  80. for v in values:
  81. with pytest.raises(TypeError):
  82. idx[v:]
  83. s = Series(np.random.rand(len(idx)), index=idx)
  84. tm.assert_series_equal(s['2013/01/01 09:05':'2013/01/01 09:10'],
  85. s[300:660])
  86. tm.assert_series_equal(s['2013/01/01 10:00':'2013/01/01 10:05'],
  87. s[3600:3960])
  88. tm.assert_series_equal(s['2013/01/01 10H':], s[3600:])
  89. tm.assert_series_equal(s[:'2013/01/01 09:30'], s[:1860])
  90. for d in ['2013/01/01', '2013/01', '2013']:
  91. tm.assert_series_equal(s[d:], s)
  92. def test_range_slice_outofbounds(self):
  93. # GH#5407
  94. didx = pd.date_range(start='2013/10/01', freq='D', periods=10)
  95. pidx = period_range(start='2013/10/01', freq='D', periods=10)
  96. for idx in [didx, pidx]:
  97. df = DataFrame(dict(units=[100 + i for i in range(10)]), index=idx)
  98. empty = DataFrame(index=idx.__class__([], freq='D'),
  99. columns=['units'])
  100. empty['units'] = empty['units'].astype('int64')
  101. tm.assert_frame_equal(df['2013/09/01':'2013/09/30'], empty)
  102. tm.assert_frame_equal(df['2013/09/30':'2013/10/02'], df.iloc[:2])
  103. tm.assert_frame_equal(df['2013/10/01':'2013/10/02'], df.iloc[:2])
  104. tm.assert_frame_equal(df['2013/10/02':'2013/09/30'], empty)
  105. tm.assert_frame_equal(df['2013/10/15':'2013/10/17'], empty)
  106. tm.assert_frame_equal(df['2013-06':'2013-09'], empty)
  107. tm.assert_frame_equal(df['2013-11':'2013-12'], empty)