test_at_time.py 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. from datetime import time
  2. import numpy as np
  3. import pytest
  4. import pytz
  5. from pandas._libs.tslibs import timezones
  6. from pandas import (
  7. DataFrame,
  8. date_range,
  9. )
  10. import pandas._testing as tm
  11. class TestAtTime:
  12. @pytest.mark.parametrize("tzstr", ["US/Eastern", "dateutil/US/Eastern"])
  13. def test_localized_at_time(self, tzstr, frame_or_series):
  14. tz = timezones.maybe_get_tz(tzstr)
  15. rng = date_range("4/16/2012", "5/1/2012", freq="H")
  16. ts = frame_or_series(np.random.randn(len(rng)), index=rng)
  17. ts_local = ts.tz_localize(tzstr)
  18. result = ts_local.at_time(time(10, 0))
  19. expected = ts.at_time(time(10, 0)).tz_localize(tzstr)
  20. tm.assert_equal(result, expected)
  21. assert timezones.tz_compare(result.index.tz, tz)
  22. def test_at_time(self, frame_or_series):
  23. rng = date_range("1/1/2000", "1/5/2000", freq="5min")
  24. ts = DataFrame(np.random.randn(len(rng), 2), index=rng)
  25. ts = tm.get_obj(ts, frame_or_series)
  26. rs = ts.at_time(rng[1])
  27. assert (rs.index.hour == rng[1].hour).all()
  28. assert (rs.index.minute == rng[1].minute).all()
  29. assert (rs.index.second == rng[1].second).all()
  30. result = ts.at_time("9:30")
  31. expected = ts.at_time(time(9, 30))
  32. tm.assert_equal(result, expected)
  33. def test_at_time_midnight(self, frame_or_series):
  34. # midnight, everything
  35. rng = date_range("1/1/2000", "1/31/2000")
  36. ts = DataFrame(np.random.randn(len(rng), 3), index=rng)
  37. ts = tm.get_obj(ts, frame_or_series)
  38. result = ts.at_time(time(0, 0))
  39. tm.assert_equal(result, ts)
  40. def test_at_time_nonexistent(self, frame_or_series):
  41. # time doesn't exist
  42. rng = date_range("1/1/2012", freq="23Min", periods=384)
  43. ts = DataFrame(np.random.randn(len(rng)), rng)
  44. ts = tm.get_obj(ts, frame_or_series)
  45. rs = ts.at_time("16:00")
  46. assert len(rs) == 0
  47. @pytest.mark.parametrize(
  48. "hour", ["1:00", "1:00AM", time(1), time(1, tzinfo=pytz.UTC)]
  49. )
  50. def test_at_time_errors(self, hour):
  51. # GH#24043
  52. dti = date_range("2018", periods=3, freq="H")
  53. df = DataFrame(list(range(len(dti))), index=dti)
  54. if getattr(hour, "tzinfo", None) is None:
  55. result = df.at_time(hour)
  56. expected = df.iloc[1:2]
  57. tm.assert_frame_equal(result, expected)
  58. else:
  59. with pytest.raises(ValueError, match="Index must be timezone"):
  60. df.at_time(hour)
  61. def test_at_time_tz(self):
  62. # GH#24043
  63. dti = date_range("2018", periods=3, freq="H", tz="US/Pacific")
  64. df = DataFrame(list(range(len(dti))), index=dti)
  65. result = df.at_time(time(4, tzinfo=pytz.timezone("US/Eastern")))
  66. expected = df.iloc[1:2]
  67. tm.assert_frame_equal(result, expected)
  68. def test_at_time_raises(self, frame_or_series):
  69. # GH#20725
  70. obj = DataFrame([[1, 2, 3], [4, 5, 6]])
  71. obj = tm.get_obj(obj, frame_or_series)
  72. msg = "Index must be DatetimeIndex"
  73. with pytest.raises(TypeError, match=msg): # index is not a DatetimeIndex
  74. obj.at_time("00:00")
  75. @pytest.mark.parametrize("axis", ["index", "columns", 0, 1])
  76. def test_at_time_axis(self, axis):
  77. # issue 8839
  78. rng = date_range("1/1/2000", "1/5/2000", freq="5min")
  79. ts = DataFrame(np.random.randn(len(rng), len(rng)))
  80. ts.index, ts.columns = rng, rng
  81. indices = rng[(rng.hour == 9) & (rng.minute == 30) & (rng.second == 0)]
  82. if axis in ["index", 0]:
  83. expected = ts.loc[indices, :]
  84. elif axis in ["columns", 1]:
  85. expected = ts.loc[:, indices]
  86. result = ts.at_time("9:30", axis=axis)
  87. # Without clearing freq, result has freq 1440T and expected 5T
  88. result.index = result.index._with_freq(None)
  89. expected.index = expected.index._with_freq(None)
  90. tm.assert_frame_equal(result, expected)
  91. def test_at_time_datetimeindex(self):
  92. index = date_range("2012-01-01", "2012-01-05", freq="30min")
  93. df = DataFrame(np.random.randn(len(index), 5), index=index)
  94. akey = time(12, 0, 0)
  95. ainds = [24, 72, 120, 168]
  96. result = df.at_time(akey)
  97. expected = df.loc[akey]
  98. expected2 = df.iloc[ainds]
  99. tm.assert_frame_equal(result, expected)
  100. tm.assert_frame_equal(result, expected2)
  101. assert len(result) == 4