test_to_timestamp.py 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. from datetime import timedelta
  2. import numpy as np
  3. import pytest
  4. from pandas import (
  5. DataFrame,
  6. DatetimeIndex,
  7. PeriodIndex,
  8. Series,
  9. Timedelta,
  10. date_range,
  11. period_range,
  12. to_datetime,
  13. )
  14. import pandas._testing as tm
  15. def _get_with_delta(delta, freq="A-DEC"):
  16. return date_range(
  17. to_datetime("1/1/2001") + delta,
  18. to_datetime("12/31/2009") + delta,
  19. freq=freq,
  20. )
  21. class TestToTimestamp:
  22. def test_to_timestamp(self, frame_or_series):
  23. K = 5
  24. index = period_range(freq="A", start="1/1/2001", end="12/1/2009")
  25. obj = DataFrame(
  26. np.random.randn(len(index), K),
  27. index=index,
  28. columns=["A", "B", "C", "D", "E"],
  29. )
  30. obj["mix"] = "a"
  31. obj = tm.get_obj(obj, frame_or_series)
  32. exp_index = date_range("1/1/2001", end="12/31/2009", freq="A-DEC")
  33. exp_index = exp_index + Timedelta(1, "D") - Timedelta(1, "ns")
  34. result = obj.to_timestamp("D", "end")
  35. tm.assert_index_equal(result.index, exp_index)
  36. tm.assert_numpy_array_equal(result.values, obj.values)
  37. if frame_or_series is Series:
  38. assert result.name == "A"
  39. exp_index = date_range("1/1/2001", end="1/1/2009", freq="AS-JAN")
  40. result = obj.to_timestamp("D", "start")
  41. tm.assert_index_equal(result.index, exp_index)
  42. result = obj.to_timestamp(how="start")
  43. tm.assert_index_equal(result.index, exp_index)
  44. delta = timedelta(hours=23)
  45. result = obj.to_timestamp("H", "end")
  46. exp_index = _get_with_delta(delta)
  47. exp_index = exp_index + Timedelta(1, "h") - Timedelta(1, "ns")
  48. tm.assert_index_equal(result.index, exp_index)
  49. delta = timedelta(hours=23, minutes=59)
  50. result = obj.to_timestamp("T", "end")
  51. exp_index = _get_with_delta(delta)
  52. exp_index = exp_index + Timedelta(1, "m") - Timedelta(1, "ns")
  53. tm.assert_index_equal(result.index, exp_index)
  54. result = obj.to_timestamp("S", "end")
  55. delta = timedelta(hours=23, minutes=59, seconds=59)
  56. exp_index = _get_with_delta(delta)
  57. exp_index = exp_index + Timedelta(1, "s") - Timedelta(1, "ns")
  58. tm.assert_index_equal(result.index, exp_index)
  59. def test_to_timestamp_columns(self):
  60. K = 5
  61. index = period_range(freq="A", start="1/1/2001", end="12/1/2009")
  62. df = DataFrame(
  63. np.random.randn(len(index), K),
  64. index=index,
  65. columns=["A", "B", "C", "D", "E"],
  66. )
  67. df["mix"] = "a"
  68. # columns
  69. df = df.T
  70. exp_index = date_range("1/1/2001", end="12/31/2009", freq="A-DEC")
  71. exp_index = exp_index + Timedelta(1, "D") - Timedelta(1, "ns")
  72. result = df.to_timestamp("D", "end", axis=1)
  73. tm.assert_index_equal(result.columns, exp_index)
  74. tm.assert_numpy_array_equal(result.values, df.values)
  75. exp_index = date_range("1/1/2001", end="1/1/2009", freq="AS-JAN")
  76. result = df.to_timestamp("D", "start", axis=1)
  77. tm.assert_index_equal(result.columns, exp_index)
  78. delta = timedelta(hours=23)
  79. result = df.to_timestamp("H", "end", axis=1)
  80. exp_index = _get_with_delta(delta)
  81. exp_index = exp_index + Timedelta(1, "h") - Timedelta(1, "ns")
  82. tm.assert_index_equal(result.columns, exp_index)
  83. delta = timedelta(hours=23, minutes=59)
  84. result = df.to_timestamp("T", "end", axis=1)
  85. exp_index = _get_with_delta(delta)
  86. exp_index = exp_index + Timedelta(1, "m") - Timedelta(1, "ns")
  87. tm.assert_index_equal(result.columns, exp_index)
  88. result = df.to_timestamp("S", "end", axis=1)
  89. delta = timedelta(hours=23, minutes=59, seconds=59)
  90. exp_index = _get_with_delta(delta)
  91. exp_index = exp_index + Timedelta(1, "s") - Timedelta(1, "ns")
  92. tm.assert_index_equal(result.columns, exp_index)
  93. result1 = df.to_timestamp("5t", axis=1)
  94. result2 = df.to_timestamp("t", axis=1)
  95. expected = date_range("2001-01-01", "2009-01-01", freq="AS")
  96. assert isinstance(result1.columns, DatetimeIndex)
  97. assert isinstance(result2.columns, DatetimeIndex)
  98. tm.assert_numpy_array_equal(result1.columns.asi8, expected.asi8)
  99. tm.assert_numpy_array_equal(result2.columns.asi8, expected.asi8)
  100. # PeriodIndex.to_timestamp always use 'infer'
  101. assert result1.columns.freqstr == "AS-JAN"
  102. assert result2.columns.freqstr == "AS-JAN"
  103. def test_to_timestamp_invalid_axis(self):
  104. index = period_range(freq="A", start="1/1/2001", end="12/1/2009")
  105. obj = DataFrame(np.random.randn(len(index), 5), index=index)
  106. # invalid axis
  107. with pytest.raises(ValueError, match="axis"):
  108. obj.to_timestamp(axis=2)
  109. def test_to_timestamp_hourly(self, frame_or_series):
  110. index = period_range(freq="H", start="1/1/2001", end="1/2/2001")
  111. obj = Series(1, index=index, name="foo")
  112. if frame_or_series is not Series:
  113. obj = obj.to_frame()
  114. exp_index = date_range("1/1/2001 00:59:59", end="1/2/2001 00:59:59", freq="H")
  115. result = obj.to_timestamp(how="end")
  116. exp_index = exp_index + Timedelta(1, "s") - Timedelta(1, "ns")
  117. tm.assert_index_equal(result.index, exp_index)
  118. if frame_or_series is Series:
  119. assert result.name == "foo"
  120. def test_to_timestamp_raises(self, index, frame_or_series):
  121. # GH#33327
  122. obj = frame_or_series(index=index, dtype=object)
  123. if not isinstance(index, PeriodIndex):
  124. msg = f"unsupported Type {type(index).__name__}"
  125. with pytest.raises(TypeError, match=msg):
  126. obj.to_timestamp()