test_formats.py 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267
  1. from datetime import datetime
  2. import dateutil.tz
  3. import numpy as np
  4. import pytest
  5. import pytz
  6. import pandas as pd
  7. from pandas import (
  8. DatetimeIndex,
  9. Series,
  10. )
  11. import pandas._testing as tm
  12. def test_format_native_types():
  13. index = pd.date_range(freq="1D", periods=3, start="2017-01-01")
  14. # First, with no arguments.
  15. expected = np.array(["2017-01-01", "2017-01-02", "2017-01-03"], dtype=object)
  16. result = index._format_native_types()
  17. tm.assert_numpy_array_equal(result, expected)
  18. # No NaN values, so na_rep has no effect
  19. result = index._format_native_types(na_rep="pandas")
  20. tm.assert_numpy_array_equal(result, expected)
  21. # Make sure date formatting works
  22. expected = np.array(["01-2017-01", "01-2017-02", "01-2017-03"], dtype=object)
  23. result = index._format_native_types(date_format="%m-%Y-%d")
  24. tm.assert_numpy_array_equal(result, expected)
  25. # NULL object handling should work
  26. index = DatetimeIndex(["2017-01-01", pd.NaT, "2017-01-03"])
  27. expected = np.array(["2017-01-01", "NaT", "2017-01-03"], dtype=object)
  28. result = index._format_native_types()
  29. tm.assert_numpy_array_equal(result, expected)
  30. expected = np.array(["2017-01-01", "pandas", "2017-01-03"], dtype=object)
  31. result = index._format_native_types(na_rep="pandas")
  32. tm.assert_numpy_array_equal(result, expected)
  33. result = index._format_native_types(date_format="%Y-%m-%d %H:%M:%S.%f")
  34. expected = np.array(
  35. ["2017-01-01 00:00:00.000000", "NaT", "2017-01-03 00:00:00.000000"],
  36. dtype=object,
  37. )
  38. tm.assert_numpy_array_equal(result, expected)
  39. # invalid format
  40. result = index._format_native_types(date_format="foo")
  41. expected = np.array(["foo", "NaT", "foo"], dtype=object)
  42. tm.assert_numpy_array_equal(result, expected)
  43. class TestDatetimeIndexRendering:
  44. def test_dti_repr_short(self):
  45. dr = pd.date_range(start="1/1/2012", periods=1)
  46. repr(dr)
  47. dr = pd.date_range(start="1/1/2012", periods=2)
  48. repr(dr)
  49. dr = pd.date_range(start="1/1/2012", periods=3)
  50. repr(dr)
  51. @pytest.mark.parametrize("method", ["__repr__", "__str__"])
  52. def test_dti_representation(self, method):
  53. idxs = []
  54. idxs.append(DatetimeIndex([], freq="D"))
  55. idxs.append(DatetimeIndex(["2011-01-01"], freq="D"))
  56. idxs.append(DatetimeIndex(["2011-01-01", "2011-01-02"], freq="D"))
  57. idxs.append(DatetimeIndex(["2011-01-01", "2011-01-02", "2011-01-03"], freq="D"))
  58. idxs.append(
  59. DatetimeIndex(
  60. ["2011-01-01 09:00", "2011-01-01 10:00", "2011-01-01 11:00"],
  61. freq="H",
  62. tz="Asia/Tokyo",
  63. )
  64. )
  65. idxs.append(
  66. DatetimeIndex(
  67. ["2011-01-01 09:00", "2011-01-01 10:00", pd.NaT], tz="US/Eastern"
  68. )
  69. )
  70. idxs.append(
  71. DatetimeIndex(["2011-01-01 09:00", "2011-01-01 10:00", pd.NaT], tz="UTC")
  72. )
  73. exp = []
  74. exp.append("DatetimeIndex([], dtype='datetime64[ns]', freq='D')")
  75. exp.append("DatetimeIndex(['2011-01-01'], dtype='datetime64[ns]', freq='D')")
  76. exp.append(
  77. "DatetimeIndex(['2011-01-01', '2011-01-02'], "
  78. "dtype='datetime64[ns]', freq='D')"
  79. )
  80. exp.append(
  81. "DatetimeIndex(['2011-01-01', '2011-01-02', '2011-01-03'], "
  82. "dtype='datetime64[ns]', freq='D')"
  83. )
  84. exp.append(
  85. "DatetimeIndex(['2011-01-01 09:00:00+09:00', "
  86. "'2011-01-01 10:00:00+09:00', '2011-01-01 11:00:00+09:00']"
  87. ", dtype='datetime64[ns, Asia/Tokyo]', freq='H')"
  88. )
  89. exp.append(
  90. "DatetimeIndex(['2011-01-01 09:00:00-05:00', "
  91. "'2011-01-01 10:00:00-05:00', 'NaT'], "
  92. "dtype='datetime64[ns, US/Eastern]', freq=None)"
  93. )
  94. exp.append(
  95. "DatetimeIndex(['2011-01-01 09:00:00+00:00', "
  96. "'2011-01-01 10:00:00+00:00', 'NaT'], "
  97. "dtype='datetime64[ns, UTC]', freq=None)"
  98. ""
  99. )
  100. with pd.option_context("display.width", 300):
  101. for indx, expected in zip(idxs, exp):
  102. result = getattr(indx, method)()
  103. assert result == expected
  104. def test_dti_representation_to_series(self):
  105. idx1 = DatetimeIndex([], freq="D")
  106. idx2 = DatetimeIndex(["2011-01-01"], freq="D")
  107. idx3 = DatetimeIndex(["2011-01-01", "2011-01-02"], freq="D")
  108. idx4 = DatetimeIndex(["2011-01-01", "2011-01-02", "2011-01-03"], freq="D")
  109. idx5 = DatetimeIndex(
  110. ["2011-01-01 09:00", "2011-01-01 10:00", "2011-01-01 11:00"],
  111. freq="H",
  112. tz="Asia/Tokyo",
  113. )
  114. idx6 = DatetimeIndex(
  115. ["2011-01-01 09:00", "2011-01-01 10:00", pd.NaT], tz="US/Eastern"
  116. )
  117. idx7 = DatetimeIndex(["2011-01-01 09:00", "2011-01-02 10:15"])
  118. exp1 = """Series([], dtype: datetime64[ns])"""
  119. exp2 = "0 2011-01-01\ndtype: datetime64[ns]"
  120. exp3 = "0 2011-01-01\n1 2011-01-02\ndtype: datetime64[ns]"
  121. exp4 = (
  122. "0 2011-01-01\n"
  123. "1 2011-01-02\n"
  124. "2 2011-01-03\n"
  125. "dtype: datetime64[ns]"
  126. )
  127. exp5 = (
  128. "0 2011-01-01 09:00:00+09:00\n"
  129. "1 2011-01-01 10:00:00+09:00\n"
  130. "2 2011-01-01 11:00:00+09:00\n"
  131. "dtype: datetime64[ns, Asia/Tokyo]"
  132. )
  133. exp6 = (
  134. "0 2011-01-01 09:00:00-05:00\n"
  135. "1 2011-01-01 10:00:00-05:00\n"
  136. "2 NaT\n"
  137. "dtype: datetime64[ns, US/Eastern]"
  138. )
  139. exp7 = (
  140. "0 2011-01-01 09:00:00\n"
  141. "1 2011-01-02 10:15:00\n"
  142. "dtype: datetime64[ns]"
  143. )
  144. with pd.option_context("display.width", 300):
  145. for idx, expected in zip(
  146. [idx1, idx2, idx3, idx4, idx5, idx6, idx7],
  147. [exp1, exp2, exp3, exp4, exp5, exp6, exp7],
  148. ):
  149. result = repr(Series(idx))
  150. assert result == expected
  151. def test_dti_summary(self):
  152. # GH#9116
  153. idx1 = DatetimeIndex([], freq="D")
  154. idx2 = DatetimeIndex(["2011-01-01"], freq="D")
  155. idx3 = DatetimeIndex(["2011-01-01", "2011-01-02"], freq="D")
  156. idx4 = DatetimeIndex(["2011-01-01", "2011-01-02", "2011-01-03"], freq="D")
  157. idx5 = DatetimeIndex(
  158. ["2011-01-01 09:00", "2011-01-01 10:00", "2011-01-01 11:00"],
  159. freq="H",
  160. tz="Asia/Tokyo",
  161. )
  162. idx6 = DatetimeIndex(
  163. ["2011-01-01 09:00", "2011-01-01 10:00", pd.NaT], tz="US/Eastern"
  164. )
  165. exp1 = "DatetimeIndex: 0 entries\nFreq: D"
  166. exp2 = "DatetimeIndex: 1 entries, 2011-01-01 to 2011-01-01\nFreq: D"
  167. exp3 = "DatetimeIndex: 2 entries, 2011-01-01 to 2011-01-02\nFreq: D"
  168. exp4 = "DatetimeIndex: 3 entries, 2011-01-01 to 2011-01-03\nFreq: D"
  169. exp5 = (
  170. "DatetimeIndex: 3 entries, 2011-01-01 09:00:00+09:00 "
  171. "to 2011-01-01 11:00:00+09:00\n"
  172. "Freq: H"
  173. )
  174. exp6 = """DatetimeIndex: 3 entries, 2011-01-01 09:00:00-05:00 to NaT"""
  175. for idx, expected in zip(
  176. [idx1, idx2, idx3, idx4, idx5, idx6], [exp1, exp2, exp3, exp4, exp5, exp6]
  177. ):
  178. result = idx._summary()
  179. assert result == expected
  180. def test_dti_business_repr(self):
  181. # only really care that it works
  182. repr(pd.bdate_range(datetime(2009, 1, 1), datetime(2010, 1, 1)))
  183. def test_dti_business_summary(self):
  184. rng = pd.bdate_range(datetime(2009, 1, 1), datetime(2010, 1, 1))
  185. rng._summary()
  186. rng[2:2]._summary()
  187. def test_dti_business_summary_pytz(self):
  188. pd.bdate_range("1/1/2005", "1/1/2009", tz=pytz.utc)._summary()
  189. def test_dti_business_summary_dateutil(self):
  190. pd.bdate_range("1/1/2005", "1/1/2009", tz=dateutil.tz.tzutc())._summary()
  191. def test_dti_custom_business_repr(self):
  192. # only really care that it works
  193. repr(pd.bdate_range(datetime(2009, 1, 1), datetime(2010, 1, 1), freq="C"))
  194. def test_dti_custom_business_summary(self):
  195. rng = pd.bdate_range(datetime(2009, 1, 1), datetime(2010, 1, 1), freq="C")
  196. rng._summary()
  197. rng[2:2]._summary()
  198. def test_dti_custom_business_summary_pytz(self):
  199. pd.bdate_range("1/1/2005", "1/1/2009", freq="C", tz=pytz.utc)._summary()
  200. def test_dti_custom_business_summary_dateutil(self):
  201. pd.bdate_range(
  202. "1/1/2005", "1/1/2009", freq="C", tz=dateutil.tz.tzutc()
  203. )._summary()
  204. class TestFormat:
  205. def test_format_with_name_time_info(self):
  206. # bug I fixed 12/20/2011
  207. dates = pd.date_range("2011-01-01 04:00:00", periods=10, name="something")
  208. formatted = dates.format(name=True)
  209. assert formatted[0] == "something"
  210. def test_format_datetime_with_time(self):
  211. dti = DatetimeIndex([datetime(2012, 2, 7), datetime(2012, 2, 7, 23)])
  212. result = dti.format()
  213. expected = ["2012-02-07 00:00:00", "2012-02-07 23:00:00"]
  214. assert len(result) == 2
  215. assert result == expected