test_datetime.py 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. import re
  2. import pytest
  3. import pandas as pd
  4. from pandas import (
  5. DataFrame,
  6. Index,
  7. Series,
  8. Timestamp,
  9. date_range,
  10. )
  11. import pandas._testing as tm
  12. class TestDatetimeIndex:
  13. def test_get_loc_naive_dti_aware_str_deprecated(self):
  14. # GH#46903
  15. ts = Timestamp("20130101")._value
  16. dti = pd.DatetimeIndex([ts + 50 + i for i in range(100)])
  17. ser = Series(range(100), index=dti)
  18. key = "2013-01-01 00:00:00.000000050+0000"
  19. msg = re.escape(repr(key))
  20. with pytest.raises(KeyError, match=msg):
  21. ser[key]
  22. with pytest.raises(KeyError, match=msg):
  23. dti.get_loc(key)
  24. def test_indexing_with_datetime_tz(self):
  25. # GH#8260
  26. # support datetime64 with tz
  27. idx = Index(date_range("20130101", periods=3, tz="US/Eastern"), name="foo")
  28. dr = date_range("20130110", periods=3)
  29. df = DataFrame({"A": idx, "B": dr})
  30. df["C"] = idx
  31. df.iloc[1, 1] = pd.NaT
  32. df.iloc[1, 2] = pd.NaT
  33. expected = Series(
  34. [Timestamp("2013-01-02 00:00:00-0500", tz="US/Eastern"), pd.NaT, pd.NaT],
  35. index=list("ABC"),
  36. dtype="object",
  37. name=1,
  38. )
  39. # indexing
  40. result = df.iloc[1]
  41. tm.assert_series_equal(result, expected)
  42. result = df.loc[1]
  43. tm.assert_series_equal(result, expected)
  44. def test_indexing_fast_xs(self):
  45. # indexing - fast_xs
  46. df = DataFrame({"a": date_range("2014-01-01", periods=10, tz="UTC")})
  47. result = df.iloc[5]
  48. expected = Series(
  49. [Timestamp("2014-01-06 00:00:00+0000", tz="UTC")],
  50. index=["a"],
  51. name=5,
  52. dtype="M8[ns, UTC]",
  53. )
  54. tm.assert_series_equal(result, expected)
  55. result = df.loc[5]
  56. tm.assert_series_equal(result, expected)
  57. # indexing - boolean
  58. result = df[df.a > df.a[3]]
  59. expected = df.iloc[4:]
  60. tm.assert_frame_equal(result, expected)
  61. def test_consistency_with_tz_aware_scalar(self):
  62. # xef gh-12938
  63. # various ways of indexing the same tz-aware scalar
  64. df = Series([Timestamp("2016-03-30 14:35:25", tz="Europe/Brussels")]).to_frame()
  65. df = pd.concat([df, df]).reset_index(drop=True)
  66. expected = Timestamp("2016-03-30 14:35:25+0200", tz="Europe/Brussels")
  67. result = df[0][0]
  68. assert result == expected
  69. result = df.iloc[0, 0]
  70. assert result == expected
  71. result = df.loc[0, 0]
  72. assert result == expected
  73. result = df.iat[0, 0]
  74. assert result == expected
  75. result = df.at[0, 0]
  76. assert result == expected
  77. result = df[0].loc[0]
  78. assert result == expected
  79. result = df[0].at[0]
  80. assert result == expected
  81. def test_indexing_with_datetimeindex_tz(self, indexer_sl):
  82. # GH 12050
  83. # indexing on a series with a datetimeindex with tz
  84. index = date_range("2015-01-01", periods=2, tz="utc")
  85. ser = Series(range(2), index=index, dtype="int64")
  86. # list-like indexing
  87. for sel in (index, list(index)):
  88. # getitem
  89. result = indexer_sl(ser)[sel]
  90. expected = ser.copy()
  91. if sel is not index:
  92. expected.index = expected.index._with_freq(None)
  93. tm.assert_series_equal(result, expected)
  94. # setitem
  95. result = ser.copy()
  96. indexer_sl(result)[sel] = 1
  97. expected = Series(1, index=index)
  98. tm.assert_series_equal(result, expected)
  99. # single element indexing
  100. # getitem
  101. assert indexer_sl(ser)[index[1]] == 1
  102. # setitem
  103. result = ser.copy()
  104. indexer_sl(result)[index[1]] = 5
  105. expected = Series([0, 5], index=index)
  106. tm.assert_series_equal(result, expected)
  107. def test_nanosecond_getitem_setitem_with_tz(self):
  108. # GH 11679
  109. data = ["2016-06-28 08:30:00.123456789"]
  110. index = pd.DatetimeIndex(data, dtype="datetime64[ns, America/Chicago]")
  111. df = DataFrame({"a": [10]}, index=index)
  112. result = df.loc[df.index[0]]
  113. expected = Series(10, index=["a"], name=df.index[0])
  114. tm.assert_series_equal(result, expected)
  115. result = df.copy()
  116. result.loc[df.index[0], "a"] = -1
  117. expected = DataFrame(-1, index=index, columns=["a"])
  118. tm.assert_frame_equal(result, expected)
  119. def test_getitem_str_slice_millisecond_resolution(self, frame_or_series):
  120. # GH#33589
  121. keys = [
  122. "2017-10-25T16:25:04.151",
  123. "2017-10-25T16:25:04.252",
  124. "2017-10-25T16:50:05.237",
  125. "2017-10-25T16:50:05.238",
  126. ]
  127. obj = frame_or_series(
  128. [1, 2, 3, 4],
  129. index=[Timestamp(x) for x in keys],
  130. )
  131. result = obj[keys[1] : keys[2]]
  132. expected = frame_or_series(
  133. [2, 3],
  134. index=[
  135. Timestamp(keys[1]),
  136. Timestamp(keys[2]),
  137. ],
  138. )
  139. tm.assert_equal(result, expected)
  140. def test_getitem_pyarrow_index(self, frame_or_series):
  141. # GH 53644
  142. pytest.importorskip("pyarrow")
  143. obj = frame_or_series(
  144. range(5),
  145. index=date_range("2020", freq="D", periods=5).astype(
  146. "timestamp[us][pyarrow]"
  147. ),
  148. )
  149. result = obj.loc[obj.index[:-3]]
  150. expected = frame_or_series(
  151. range(2),
  152. index=date_range("2020", freq="D", periods=2).astype(
  153. "timestamp[us][pyarrow]"
  154. ),
  155. )
  156. tm.assert_equal(result, expected)