test_timedelta_range.py 3.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. import numpy as np
  2. import pytest
  3. from pandas import (
  4. Timedelta,
  5. timedelta_range,
  6. to_timedelta,
  7. )
  8. import pandas._testing as tm
  9. from pandas.tseries.offsets import (
  10. Day,
  11. Second,
  12. )
  13. class TestTimedeltas:
  14. def test_timedelta_range_unit(self):
  15. # GH#49824
  16. tdi = timedelta_range("0 Days", periods=10, freq="100000D", unit="s")
  17. exp_arr = (np.arange(10, dtype="i8") * 100_000).view("m8[D]").astype("m8[s]")
  18. tm.assert_numpy_array_equal(tdi.to_numpy(), exp_arr)
  19. def test_timedelta_range(self):
  20. expected = to_timedelta(np.arange(5), unit="D")
  21. result = timedelta_range("0 days", periods=5, freq="D")
  22. tm.assert_index_equal(result, expected)
  23. expected = to_timedelta(np.arange(11), unit="D")
  24. result = timedelta_range("0 days", "10 days", freq="D")
  25. tm.assert_index_equal(result, expected)
  26. expected = to_timedelta(np.arange(5), unit="D") + Second(2) + Day()
  27. result = timedelta_range("1 days, 00:00:02", "5 days, 00:00:02", freq="D")
  28. tm.assert_index_equal(result, expected)
  29. expected = to_timedelta([1, 3, 5, 7, 9], unit="D") + Second(2)
  30. result = timedelta_range("1 days, 00:00:02", periods=5, freq="2D")
  31. tm.assert_index_equal(result, expected)
  32. expected = to_timedelta(np.arange(50), unit="T") * 30
  33. result = timedelta_range("0 days", freq="30T", periods=50)
  34. tm.assert_index_equal(result, expected)
  35. @pytest.mark.parametrize(
  36. "periods, freq", [(3, "2D"), (5, "D"), (6, "19H12T"), (7, "16H"), (9, "12H")]
  37. )
  38. def test_linspace_behavior(self, periods, freq):
  39. # GH 20976
  40. result = timedelta_range(start="0 days", end="4 days", periods=periods)
  41. expected = timedelta_range(start="0 days", end="4 days", freq=freq)
  42. tm.assert_index_equal(result, expected)
  43. def test_errors(self):
  44. # not enough params
  45. msg = (
  46. "Of the four parameters: start, end, periods, and freq, "
  47. "exactly three must be specified"
  48. )
  49. with pytest.raises(ValueError, match=msg):
  50. timedelta_range(start="0 days")
  51. with pytest.raises(ValueError, match=msg):
  52. timedelta_range(end="5 days")
  53. with pytest.raises(ValueError, match=msg):
  54. timedelta_range(periods=2)
  55. with pytest.raises(ValueError, match=msg):
  56. timedelta_range()
  57. # too many params
  58. with pytest.raises(ValueError, match=msg):
  59. timedelta_range(start="0 days", end="5 days", periods=10, freq="H")
  60. @pytest.mark.parametrize(
  61. "start, end, freq, expected_periods",
  62. [
  63. ("1D", "10D", "2D", (10 - 1) // 2 + 1),
  64. ("2D", "30D", "3D", (30 - 2) // 3 + 1),
  65. ("2s", "50s", "5s", (50 - 2) // 5 + 1),
  66. # tests that worked before GH 33498:
  67. ("4D", "16D", "3D", (16 - 4) // 3 + 1),
  68. ("8D", "16D", "40s", (16 * 3600 * 24 - 8 * 3600 * 24) // 40 + 1),
  69. ],
  70. )
  71. def test_timedelta_range_freq_divide_end(self, start, end, freq, expected_periods):
  72. # GH 33498 only the cases where `(end % freq) == 0` used to fail
  73. res = timedelta_range(start=start, end=end, freq=freq)
  74. assert Timedelta(start) == res[0]
  75. assert Timedelta(end) >= res[-1]
  76. assert len(res) == expected_periods
  77. def test_timedelta_range_infer_freq(self):
  78. # https://github.com/pandas-dev/pandas/issues/35897
  79. result = timedelta_range("0s", "1s", periods=31)
  80. assert result.freq is None