test_first_and_last.py 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. """
  2. Note: includes tests for `last`
  3. """
  4. import pytest
  5. import pandas as pd
  6. from pandas import (
  7. DataFrame,
  8. bdate_range,
  9. )
  10. import pandas._testing as tm
  11. class TestFirst:
  12. def test_first_subset(self, frame_or_series):
  13. ts = tm.makeTimeDataFrame(freq="12h")
  14. ts = tm.get_obj(ts, frame_or_series)
  15. result = ts.first("10d")
  16. assert len(result) == 20
  17. ts = tm.makeTimeDataFrame(freq="D")
  18. ts = tm.get_obj(ts, frame_or_series)
  19. result = ts.first("10d")
  20. assert len(result) == 10
  21. result = ts.first("3M")
  22. expected = ts[:"3/31/2000"]
  23. tm.assert_equal(result, expected)
  24. result = ts.first("21D")
  25. expected = ts[:21]
  26. tm.assert_equal(result, expected)
  27. result = ts[:0].first("3M")
  28. tm.assert_equal(result, ts[:0])
  29. def test_first_last_raises(self, frame_or_series):
  30. # GH#20725
  31. obj = DataFrame([[1, 2, 3], [4, 5, 6]])
  32. obj = tm.get_obj(obj, frame_or_series)
  33. msg = "'first' only supports a DatetimeIndex index"
  34. with pytest.raises(TypeError, match=msg): # index is not a DatetimeIndex
  35. obj.first("1D")
  36. msg = "'last' only supports a DatetimeIndex index"
  37. with pytest.raises(TypeError, match=msg): # index is not a DatetimeIndex
  38. obj.last("1D")
  39. def test_last_subset(self, frame_or_series):
  40. ts = tm.makeTimeDataFrame(freq="12h")
  41. ts = tm.get_obj(ts, frame_or_series)
  42. result = ts.last("10d")
  43. assert len(result) == 20
  44. ts = tm.makeTimeDataFrame(nper=30, freq="D")
  45. ts = tm.get_obj(ts, frame_or_series)
  46. result = ts.last("10d")
  47. assert len(result) == 10
  48. result = ts.last("21D")
  49. expected = ts["2000-01-10":]
  50. tm.assert_equal(result, expected)
  51. result = ts.last("21D")
  52. expected = ts[-21:]
  53. tm.assert_equal(result, expected)
  54. result = ts[:0].last("3M")
  55. tm.assert_equal(result, ts[:0])
  56. @pytest.mark.parametrize("start, periods", [("2010-03-31", 1), ("2010-03-30", 2)])
  57. def test_first_with_first_day_last_of_month(self, frame_or_series, start, periods):
  58. # GH#29623
  59. x = frame_or_series([1] * 100, index=bdate_range(start, periods=100))
  60. result = x.first("1M")
  61. expected = frame_or_series(
  62. [1] * periods, index=bdate_range(start, periods=periods)
  63. )
  64. tm.assert_equal(result, expected)
  65. def test_first_with_first_day_end_of_frq_n_greater_one(self, frame_or_series):
  66. # GH#29623
  67. x = frame_or_series([1] * 100, index=bdate_range("2010-03-31", periods=100))
  68. result = x.first("2M")
  69. expected = frame_or_series(
  70. [1] * 23, index=bdate_range("2010-03-31", "2010-04-30")
  71. )
  72. tm.assert_equal(result, expected)
  73. @pytest.mark.parametrize("func", ["first", "last"])
  74. def test_empty_not_input(self, func):
  75. # GH#51032
  76. df = DataFrame(index=pd.DatetimeIndex([]))
  77. result = getattr(df, func)(offset=1)
  78. tm.assert_frame_equal(df, result)
  79. assert df is not result