test_misc.py 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312
  1. import calendar
  2. import locale
  3. import unicodedata
  4. import numpy as np
  5. import pytest
  6. import pandas as pd
  7. from pandas import (
  8. DatetimeIndex, Index, Timestamp, compat, date_range, datetime, offsets)
  9. import pandas.util.testing as tm
  10. class TestTimeSeries(object):
  11. def test_pass_datetimeindex_to_index(self):
  12. # Bugs in #1396
  13. rng = date_range('1/1/2000', '3/1/2000')
  14. idx = Index(rng, dtype=object)
  15. expected = Index(rng.to_pydatetime(), dtype=object)
  16. tm.assert_numpy_array_equal(idx.values, expected.values)
  17. def test_range_edges(self):
  18. # GH#13672
  19. idx = pd.date_range(start=Timestamp('1970-01-01 00:00:00.000000001'),
  20. end=Timestamp('1970-01-01 00:00:00.000000004'),
  21. freq='N')
  22. exp = DatetimeIndex(['1970-01-01 00:00:00.000000001',
  23. '1970-01-01 00:00:00.000000002',
  24. '1970-01-01 00:00:00.000000003',
  25. '1970-01-01 00:00:00.000000004'])
  26. tm.assert_index_equal(idx, exp)
  27. idx = pd.date_range(start=Timestamp('1970-01-01 00:00:00.000000004'),
  28. end=Timestamp('1970-01-01 00:00:00.000000001'),
  29. freq='N')
  30. exp = DatetimeIndex([])
  31. tm.assert_index_equal(idx, exp)
  32. idx = pd.date_range(start=Timestamp('1970-01-01 00:00:00.000000001'),
  33. end=Timestamp('1970-01-01 00:00:00.000000001'),
  34. freq='N')
  35. exp = DatetimeIndex(['1970-01-01 00:00:00.000000001'])
  36. tm.assert_index_equal(idx, exp)
  37. idx = pd.date_range(start=Timestamp('1970-01-01 00:00:00.000001'),
  38. end=Timestamp('1970-01-01 00:00:00.000004'),
  39. freq='U')
  40. exp = DatetimeIndex(['1970-01-01 00:00:00.000001',
  41. '1970-01-01 00:00:00.000002',
  42. '1970-01-01 00:00:00.000003',
  43. '1970-01-01 00:00:00.000004'])
  44. tm.assert_index_equal(idx, exp)
  45. idx = pd.date_range(start=Timestamp('1970-01-01 00:00:00.001'),
  46. end=Timestamp('1970-01-01 00:00:00.004'),
  47. freq='L')
  48. exp = DatetimeIndex(['1970-01-01 00:00:00.001',
  49. '1970-01-01 00:00:00.002',
  50. '1970-01-01 00:00:00.003',
  51. '1970-01-01 00:00:00.004'])
  52. tm.assert_index_equal(idx, exp)
  53. idx = pd.date_range(start=Timestamp('1970-01-01 00:00:01'),
  54. end=Timestamp('1970-01-01 00:00:04'), freq='S')
  55. exp = DatetimeIndex(['1970-01-01 00:00:01', '1970-01-01 00:00:02',
  56. '1970-01-01 00:00:03', '1970-01-01 00:00:04'])
  57. tm.assert_index_equal(idx, exp)
  58. idx = pd.date_range(start=Timestamp('1970-01-01 00:01'),
  59. end=Timestamp('1970-01-01 00:04'), freq='T')
  60. exp = DatetimeIndex(['1970-01-01 00:01', '1970-01-01 00:02',
  61. '1970-01-01 00:03', '1970-01-01 00:04'])
  62. tm.assert_index_equal(idx, exp)
  63. idx = pd.date_range(start=Timestamp('1970-01-01 01:00'),
  64. end=Timestamp('1970-01-01 04:00'), freq='H')
  65. exp = DatetimeIndex(['1970-01-01 01:00', '1970-01-01 02:00',
  66. '1970-01-01 03:00', '1970-01-01 04:00'])
  67. tm.assert_index_equal(idx, exp)
  68. idx = pd.date_range(start=Timestamp('1970-01-01'),
  69. end=Timestamp('1970-01-04'), freq='D')
  70. exp = DatetimeIndex(['1970-01-01', '1970-01-02',
  71. '1970-01-03', '1970-01-04'])
  72. tm.assert_index_equal(idx, exp)
  73. class TestDatetime64(object):
  74. def test_datetimeindex_accessors(self):
  75. dti_naive = pd.date_range(freq='D', start=datetime(1998, 1, 1),
  76. periods=365)
  77. # GH#13303
  78. dti_tz = pd.date_range(freq='D', start=datetime(1998, 1, 1),
  79. periods=365, tz='US/Eastern')
  80. for dti in [dti_naive, dti_tz]:
  81. assert dti.year[0] == 1998
  82. assert dti.month[0] == 1
  83. assert dti.day[0] == 1
  84. assert dti.hour[0] == 0
  85. assert dti.minute[0] == 0
  86. assert dti.second[0] == 0
  87. assert dti.microsecond[0] == 0
  88. assert dti.dayofweek[0] == 3
  89. assert dti.dayofyear[0] == 1
  90. assert dti.dayofyear[120] == 121
  91. assert dti.weekofyear[0] == 1
  92. assert dti.weekofyear[120] == 18
  93. assert dti.quarter[0] == 1
  94. assert dti.quarter[120] == 2
  95. assert dti.days_in_month[0] == 31
  96. assert dti.days_in_month[90] == 30
  97. assert dti.is_month_start[0]
  98. assert not dti.is_month_start[1]
  99. assert dti.is_month_start[31]
  100. assert dti.is_quarter_start[0]
  101. assert dti.is_quarter_start[90]
  102. assert dti.is_year_start[0]
  103. assert not dti.is_year_start[364]
  104. assert not dti.is_month_end[0]
  105. assert dti.is_month_end[30]
  106. assert not dti.is_month_end[31]
  107. assert dti.is_month_end[364]
  108. assert not dti.is_quarter_end[0]
  109. assert not dti.is_quarter_end[30]
  110. assert dti.is_quarter_end[89]
  111. assert dti.is_quarter_end[364]
  112. assert not dti.is_year_end[0]
  113. assert dti.is_year_end[364]
  114. assert len(dti.year) == 365
  115. assert len(dti.month) == 365
  116. assert len(dti.day) == 365
  117. assert len(dti.hour) == 365
  118. assert len(dti.minute) == 365
  119. assert len(dti.second) == 365
  120. assert len(dti.microsecond) == 365
  121. assert len(dti.dayofweek) == 365
  122. assert len(dti.dayofyear) == 365
  123. assert len(dti.weekofyear) == 365
  124. assert len(dti.quarter) == 365
  125. assert len(dti.is_month_start) == 365
  126. assert len(dti.is_month_end) == 365
  127. assert len(dti.is_quarter_start) == 365
  128. assert len(dti.is_quarter_end) == 365
  129. assert len(dti.is_year_start) == 365
  130. assert len(dti.is_year_end) == 365
  131. assert len(dti.weekday_name) == 365
  132. dti.name = 'name'
  133. # non boolean accessors -> return Index
  134. for accessor in DatetimeIndex._field_ops:
  135. res = getattr(dti, accessor)
  136. assert len(res) == 365
  137. assert isinstance(res, Index)
  138. assert res.name == 'name'
  139. # boolean accessors -> return array
  140. for accessor in DatetimeIndex._bool_ops:
  141. res = getattr(dti, accessor)
  142. assert len(res) == 365
  143. assert isinstance(res, np.ndarray)
  144. # test boolean indexing
  145. res = dti[dti.is_quarter_start]
  146. exp = dti[[0, 90, 181, 273]]
  147. tm.assert_index_equal(res, exp)
  148. res = dti[dti.is_leap_year]
  149. exp = DatetimeIndex([], freq='D', tz=dti.tz, name='name')
  150. tm.assert_index_equal(res, exp)
  151. dti = pd.date_range(freq='BQ-FEB', start=datetime(1998, 1, 1),
  152. periods=4)
  153. assert sum(dti.is_quarter_start) == 0
  154. assert sum(dti.is_quarter_end) == 4
  155. assert sum(dti.is_year_start) == 0
  156. assert sum(dti.is_year_end) == 1
  157. # Ensure is_start/end accessors throw ValueError for CustomBusinessDay,
  158. bday_egypt = offsets.CustomBusinessDay(weekmask='Sun Mon Tue Wed Thu')
  159. dti = date_range(datetime(2013, 4, 30), periods=5, freq=bday_egypt)
  160. pytest.raises(ValueError, lambda: dti.is_month_start)
  161. dti = DatetimeIndex(['2000-01-01', '2000-01-02', '2000-01-03'])
  162. assert dti.is_month_start[0] == 1
  163. tests = [
  164. (Timestamp('2013-06-01', freq='M').is_month_start, 1),
  165. (Timestamp('2013-06-01', freq='BM').is_month_start, 0),
  166. (Timestamp('2013-06-03', freq='M').is_month_start, 0),
  167. (Timestamp('2013-06-03', freq='BM').is_month_start, 1),
  168. (Timestamp('2013-02-28', freq='Q-FEB').is_month_end, 1),
  169. (Timestamp('2013-02-28', freq='Q-FEB').is_quarter_end, 1),
  170. (Timestamp('2013-02-28', freq='Q-FEB').is_year_end, 1),
  171. (Timestamp('2013-03-01', freq='Q-FEB').is_month_start, 1),
  172. (Timestamp('2013-03-01', freq='Q-FEB').is_quarter_start, 1),
  173. (Timestamp('2013-03-01', freq='Q-FEB').is_year_start, 1),
  174. (Timestamp('2013-03-31', freq='QS-FEB').is_month_end, 1),
  175. (Timestamp('2013-03-31', freq='QS-FEB').is_quarter_end, 0),
  176. (Timestamp('2013-03-31', freq='QS-FEB').is_year_end, 0),
  177. (Timestamp('2013-02-01', freq='QS-FEB').is_month_start, 1),
  178. (Timestamp('2013-02-01', freq='QS-FEB').is_quarter_start, 1),
  179. (Timestamp('2013-02-01', freq='QS-FEB').is_year_start, 1),
  180. (Timestamp('2013-06-30', freq='BQ').is_month_end, 0),
  181. (Timestamp('2013-06-30', freq='BQ').is_quarter_end, 0),
  182. (Timestamp('2013-06-30', freq='BQ').is_year_end, 0),
  183. (Timestamp('2013-06-28', freq='BQ').is_month_end, 1),
  184. (Timestamp('2013-06-28', freq='BQ').is_quarter_end, 1),
  185. (Timestamp('2013-06-28', freq='BQ').is_year_end, 0),
  186. (Timestamp('2013-06-30', freq='BQS-APR').is_month_end, 0),
  187. (Timestamp('2013-06-30', freq='BQS-APR').is_quarter_end, 0),
  188. (Timestamp('2013-06-30', freq='BQS-APR').is_year_end, 0),
  189. (Timestamp('2013-06-28', freq='BQS-APR').is_month_end, 1),
  190. (Timestamp('2013-06-28', freq='BQS-APR').is_quarter_end, 1),
  191. (Timestamp('2013-03-29', freq='BQS-APR').is_year_end, 1),
  192. (Timestamp('2013-11-01', freq='AS-NOV').is_year_start, 1),
  193. (Timestamp('2013-10-31', freq='AS-NOV').is_year_end, 1),
  194. (Timestamp('2012-02-01').days_in_month, 29),
  195. (Timestamp('2013-02-01').days_in_month, 28)]
  196. for ts, value in tests:
  197. assert ts == value
  198. # GH 6538: Check that DatetimeIndex and its TimeStamp elements
  199. # return the same weekofyear accessor close to new year w/ tz
  200. dates = ["2013/12/29", "2013/12/30", "2013/12/31"]
  201. dates = DatetimeIndex(dates, tz="Europe/Brussels")
  202. expected = [52, 1, 1]
  203. assert dates.weekofyear.tolist() == expected
  204. assert [d.weekofyear for d in dates] == expected
  205. # GH 12806
  206. @pytest.mark.parametrize('time_locale', [
  207. None] if tm.get_locales() is None else [None] + tm.get_locales())
  208. def test_datetime_name_accessors(self, time_locale):
  209. # Test Monday -> Sunday and January -> December, in that sequence
  210. if time_locale is None:
  211. # If the time_locale is None, day-name and month_name should
  212. # return the english attributes
  213. expected_days = ['Monday', 'Tuesday', 'Wednesday', 'Thursday',
  214. 'Friday', 'Saturday', 'Sunday']
  215. expected_months = ['January', 'February', 'March', 'April', 'May',
  216. 'June', 'July', 'August', 'September',
  217. 'October', 'November', 'December']
  218. else:
  219. with tm.set_locale(time_locale, locale.LC_TIME):
  220. expected_days = calendar.day_name[:]
  221. expected_months = calendar.month_name[1:]
  222. # GH#11128
  223. dti = pd.date_range(freq='D', start=datetime(1998, 1, 1),
  224. periods=365)
  225. english_days = ['Monday', 'Tuesday', 'Wednesday', 'Thursday',
  226. 'Friday', 'Saturday', 'Sunday']
  227. for day, name, eng_name in zip(range(4, 11),
  228. expected_days,
  229. english_days):
  230. name = name.capitalize()
  231. assert dti.weekday_name[day] == eng_name
  232. assert dti.day_name(locale=time_locale)[day] == name
  233. ts = Timestamp(datetime(2016, 4, day))
  234. with tm.assert_produces_warning(FutureWarning,
  235. check_stacklevel=False):
  236. assert ts.weekday_name == eng_name
  237. assert ts.day_name(locale=time_locale) == name
  238. dti = dti.append(DatetimeIndex([pd.NaT]))
  239. assert np.isnan(dti.day_name(locale=time_locale)[-1])
  240. ts = Timestamp(pd.NaT)
  241. assert np.isnan(ts.day_name(locale=time_locale))
  242. # GH#12805
  243. dti = pd.date_range(freq='M', start='2012', end='2013')
  244. result = dti.month_name(locale=time_locale)
  245. expected = Index([month.capitalize() for month in expected_months])
  246. # work around different normalization schemes
  247. # https://github.com/pandas-dev/pandas/issues/22342
  248. if not compat.PY2:
  249. result = result.str.normalize("NFD")
  250. expected = expected.str.normalize("NFD")
  251. tm.assert_index_equal(result, expected)
  252. for date, expected in zip(dti, expected_months):
  253. result = date.month_name(locale=time_locale)
  254. expected = expected.capitalize()
  255. if not compat.PY2:
  256. result = unicodedata.normalize("NFD", result)
  257. expected = unicodedata.normalize("NFD", result)
  258. assert result == expected
  259. dti = dti.append(DatetimeIndex([pd.NaT]))
  260. assert np.isnan(dti.month_name(locale=time_locale)[-1])
  261. def test_nanosecond_field(self):
  262. dti = DatetimeIndex(np.arange(10))
  263. tm.assert_index_equal(dti.nanosecond,
  264. pd.Index(np.arange(10, dtype=np.int64)))