test_timedelta.py 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. import numpy as np
  2. import pytest
  3. import pandas as pd
  4. import pandas._testing as tm
  5. class TestTimedeltaIndexing:
  6. def test_boolean_indexing(self):
  7. # GH 14946
  8. df = pd.DataFrame({"x": range(10)})
  9. df.index = pd.to_timedelta(range(10), unit="s")
  10. conditions = [df["x"] > 3, df["x"] == 3, df["x"] < 3]
  11. expected_data = [
  12. [0, 1, 2, 3, 10, 10, 10, 10, 10, 10],
  13. [0, 1, 2, 10, 4, 5, 6, 7, 8, 9],
  14. [10, 10, 10, 3, 4, 5, 6, 7, 8, 9],
  15. ]
  16. for cond, data in zip(conditions, expected_data):
  17. result = df.assign(x=df.mask(cond, 10).astype("int64"))
  18. expected = pd.DataFrame(
  19. data,
  20. index=pd.to_timedelta(range(10), unit="s"),
  21. columns=["x"],
  22. dtype="int64",
  23. )
  24. tm.assert_frame_equal(expected, result)
  25. @pytest.mark.parametrize(
  26. "indexer, expected",
  27. [
  28. (0, [20, 1, 2, 3, 4, 5, 6, 7, 8, 9]),
  29. (slice(4, 8), [0, 1, 2, 3, 20, 20, 20, 20, 8, 9]),
  30. ([3, 5], [0, 1, 2, 20, 4, 20, 6, 7, 8, 9]),
  31. ],
  32. )
  33. def test_list_like_indexing(self, indexer, expected):
  34. # GH 16637
  35. df = pd.DataFrame({"x": range(10)}, dtype="int64")
  36. df.index = pd.to_timedelta(range(10), unit="s")
  37. df.loc[df.index[indexer], "x"] = 20
  38. expected = pd.DataFrame(
  39. expected,
  40. index=pd.to_timedelta(range(10), unit="s"),
  41. columns=["x"],
  42. dtype="int64",
  43. )
  44. tm.assert_frame_equal(expected, df)
  45. def test_string_indexing(self):
  46. # GH 16896
  47. df = pd.DataFrame({"x": range(3)}, index=pd.to_timedelta(range(3), unit="days"))
  48. expected = df.iloc[0]
  49. sliced = df.loc["0 days"]
  50. tm.assert_series_equal(sliced, expected)
  51. @pytest.mark.parametrize("value", [None, pd.NaT, np.nan])
  52. def test_masked_setitem(self, value):
  53. # issue (#18586)
  54. series = pd.Series([0, 1, 2], dtype="timedelta64[ns]")
  55. series[series == series[0]] = value
  56. expected = pd.Series([pd.NaT, 1, 2], dtype="timedelta64[ns]")
  57. tm.assert_series_equal(series, expected)
  58. @pytest.mark.parametrize("value", [None, pd.NaT, np.nan])
  59. def test_listlike_setitem(self, value):
  60. # issue (#18586)
  61. series = pd.Series([0, 1, 2], dtype="timedelta64[ns]")
  62. series.iloc[0] = value
  63. expected = pd.Series([pd.NaT, 1, 2], dtype="timedelta64[ns]")
  64. tm.assert_series_equal(series, expected)
  65. @pytest.mark.parametrize(
  66. "start,stop, expected_slice",
  67. [
  68. [np.timedelta64(0, "ns"), None, slice(0, 11)],
  69. [np.timedelta64(1, "D"), np.timedelta64(6, "D"), slice(1, 7)],
  70. [None, np.timedelta64(4, "D"), slice(0, 5)],
  71. ],
  72. )
  73. def test_numpy_timedelta_scalar_indexing(self, start, stop, expected_slice):
  74. # GH 20393
  75. s = pd.Series(range(11), pd.timedelta_range("0 days", "10 days"))
  76. result = s.loc[slice(start, stop)]
  77. expected = s.iloc[expected_slice]
  78. tm.assert_series_equal(result, expected)
  79. def test_roundtrip_thru_setitem(self):
  80. # PR 23462
  81. dt1 = pd.Timedelta(0)
  82. dt2 = pd.Timedelta(28767471428571405)
  83. df = pd.DataFrame({"dt": pd.Series([dt1, dt2])})
  84. df_copy = df.copy()
  85. s = pd.Series([dt1])
  86. expected = df["dt"].iloc[1].value
  87. df.loc[[True, False]] = s
  88. result = df["dt"].iloc[1].value
  89. assert expected == result
  90. tm.assert_frame_equal(df, df_copy)
  91. def test_loc_str_slicing(self):
  92. ix = pd.timedelta_range(start="1 day", end="2 days", freq="1H")
  93. ser = ix.to_series()
  94. result = ser.loc[:"1 days"]
  95. expected = ser.iloc[:-1]
  96. tm.assert_series_equal(result, expected)
  97. def test_loc_slicing(self):
  98. ix = pd.timedelta_range(start="1 day", end="2 days", freq="1H")
  99. ser = ix.to_series()
  100. result = ser.loc[: ix[-2]]
  101. expected = ser.iloc[:-1]
  102. tm.assert_series_equal(result, expected)