test_tools.py 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. from datetime import time, timedelta
  2. import numpy as np
  3. import pytest
  4. import pandas as pd
  5. from pandas import Series, TimedeltaIndex, isna, to_timedelta
  6. import pandas._testing as tm
  7. class TestTimedeltas:
  8. def test_to_timedelta(self):
  9. result = to_timedelta(["", ""])
  10. assert isna(result).all()
  11. # pass thru
  12. result = to_timedelta(np.array([np.timedelta64(1, "s")]))
  13. expected = pd.Index(np.array([np.timedelta64(1, "s")]))
  14. tm.assert_index_equal(result, expected)
  15. # Series
  16. expected = Series([timedelta(days=1), timedelta(days=1, seconds=1)])
  17. result = to_timedelta(Series(["1d", "1days 00:00:01"]))
  18. tm.assert_series_equal(result, expected)
  19. # with units
  20. result = TimedeltaIndex(
  21. [np.timedelta64(0, "ns"), np.timedelta64(10, "s").astype("m8[ns]")]
  22. )
  23. expected = to_timedelta([0, 10], unit="s")
  24. tm.assert_index_equal(result, expected)
  25. # arrays of various dtypes
  26. arr = np.array([1] * 5, dtype="int64")
  27. result = to_timedelta(arr, unit="s")
  28. expected = TimedeltaIndex([np.timedelta64(1, "s")] * 5)
  29. tm.assert_index_equal(result, expected)
  30. arr = np.array([1] * 5, dtype="int64")
  31. result = to_timedelta(arr, unit="m")
  32. expected = TimedeltaIndex([np.timedelta64(1, "m")] * 5)
  33. tm.assert_index_equal(result, expected)
  34. arr = np.array([1] * 5, dtype="int64")
  35. result = to_timedelta(arr, unit="h")
  36. expected = TimedeltaIndex([np.timedelta64(1, "h")] * 5)
  37. tm.assert_index_equal(result, expected)
  38. arr = np.array([1] * 5, dtype="timedelta64[s]")
  39. result = to_timedelta(arr)
  40. expected = TimedeltaIndex([np.timedelta64(1, "s")] * 5)
  41. tm.assert_index_equal(result, expected)
  42. arr = np.array([1] * 5, dtype="timedelta64[D]")
  43. result = to_timedelta(arr)
  44. expected = TimedeltaIndex([np.timedelta64(1, "D")] * 5)
  45. tm.assert_index_equal(result, expected)
  46. def test_to_timedelta_invalid(self):
  47. # bad value for errors parameter
  48. msg = "errors must be one of"
  49. with pytest.raises(ValueError, match=msg):
  50. to_timedelta(["foo"], errors="never")
  51. # these will error
  52. msg = "invalid unit abbreviation: foo"
  53. with pytest.raises(ValueError, match=msg):
  54. to_timedelta([1, 2], unit="foo")
  55. with pytest.raises(ValueError, match=msg):
  56. to_timedelta(1, unit="foo")
  57. # time not supported ATM
  58. msg = (
  59. "Value must be Timedelta, string, integer, float, timedelta or convertible"
  60. )
  61. with pytest.raises(ValueError, match=msg):
  62. to_timedelta(time(second=1))
  63. assert to_timedelta(time(second=1), errors="coerce") is pd.NaT
  64. msg = "unit abbreviation w/o a number"
  65. with pytest.raises(ValueError, match=msg):
  66. to_timedelta(["foo", "bar"])
  67. tm.assert_index_equal(
  68. TimedeltaIndex([pd.NaT, pd.NaT]),
  69. to_timedelta(["foo", "bar"], errors="coerce"),
  70. )
  71. tm.assert_index_equal(
  72. TimedeltaIndex(["1 day", pd.NaT, "1 min"]),
  73. to_timedelta(["1 day", "bar", "1 min"], errors="coerce"),
  74. )
  75. # gh-13613: these should not error because errors='ignore'
  76. invalid_data = "apple"
  77. assert invalid_data == to_timedelta(invalid_data, errors="ignore")
  78. invalid_data = ["apple", "1 days"]
  79. tm.assert_numpy_array_equal(
  80. np.array(invalid_data, dtype=object),
  81. to_timedelta(invalid_data, errors="ignore"),
  82. )
  83. invalid_data = pd.Index(["apple", "1 days"])
  84. tm.assert_index_equal(invalid_data, to_timedelta(invalid_data, errors="ignore"))
  85. invalid_data = Series(["apple", "1 days"])
  86. tm.assert_series_equal(
  87. invalid_data, to_timedelta(invalid_data, errors="ignore")
  88. )
  89. def test_to_timedelta_via_apply(self):
  90. # GH 5458
  91. expected = Series([np.timedelta64(1, "s")])
  92. result = Series(["00:00:01"]).apply(to_timedelta)
  93. tm.assert_series_equal(result, expected)
  94. result = Series([to_timedelta("00:00:01")])
  95. tm.assert_series_equal(result, expected)
  96. def test_to_timedelta_on_missing_values(self):
  97. # GH5438
  98. timedelta_NaT = np.timedelta64("NaT")
  99. actual = pd.to_timedelta(Series(["00:00:01", np.nan]))
  100. expected = Series(
  101. [np.timedelta64(1000000000, "ns"), timedelta_NaT], dtype="<m8[ns]"
  102. )
  103. tm.assert_series_equal(actual, expected)
  104. actual = pd.to_timedelta(Series(["00:00:01", pd.NaT]))
  105. tm.assert_series_equal(actual, expected)
  106. actual = pd.to_timedelta(np.nan)
  107. assert actual.value == timedelta_NaT.astype("int64")
  108. actual = pd.to_timedelta(pd.NaT)
  109. assert actual.value == timedelta_NaT.astype("int64")
  110. def test_to_timedelta_float(self):
  111. # https://github.com/pandas-dev/pandas/issues/25077
  112. arr = np.arange(0, 1, 1e-6)[-10:]
  113. result = pd.to_timedelta(arr, unit="s")
  114. expected_asi8 = np.arange(999990000, int(1e9), 1000, dtype="int64")
  115. tm.assert_numpy_array_equal(result.asi8, expected_asi8)