test_timedelta.py 3.6 KB

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