|
5 | 5 | import calendar
|
6 | 6 | import unicodedata
|
7 | 7 | import pytest
|
| 8 | +import pytz |
8 | 9 |
|
9 | 10 | from datetime import datetime, time, date
|
10 | 11 |
|
@@ -95,42 +96,6 @@ def compare(s, name):
|
95 | 96 | expected = Series(exp_values, index=s.index, name='xxx')
|
96 | 97 | tm.assert_series_equal(result, expected)
|
97 | 98 |
|
98 |
| - # round |
99 |
| - s = Series(pd.to_datetime(['2012-01-01 13:00:00', |
100 |
| - '2012-01-01 12:01:00', |
101 |
| - '2012-01-01 08:00:00']), name='xxx') |
102 |
| - result = s.dt.round('D') |
103 |
| - expected = Series(pd.to_datetime(['2012-01-02', '2012-01-02', |
104 |
| - '2012-01-01']), name='xxx') |
105 |
| - tm.assert_series_equal(result, expected) |
106 |
| - |
107 |
| - # round with tz |
108 |
| - result = (s.dt.tz_localize('UTC') |
109 |
| - .dt.tz_convert('US/Eastern') |
110 |
| - .dt.round('D')) |
111 |
| - exp_values = pd.to_datetime(['2012-01-01', '2012-01-01', |
112 |
| - '2012-01-01']).tz_localize('US/Eastern') |
113 |
| - expected = Series(exp_values, name='xxx') |
114 |
| - tm.assert_series_equal(result, expected) |
115 |
| - |
116 |
| - # floor |
117 |
| - s = Series(pd.to_datetime(['2012-01-01 13:00:00', |
118 |
| - '2012-01-01 12:01:00', |
119 |
| - '2012-01-01 08:00:00']), name='xxx') |
120 |
| - result = s.dt.floor('D') |
121 |
| - expected = Series(pd.to_datetime(['2012-01-01', '2012-01-01', |
122 |
| - '2012-01-01']), name='xxx') |
123 |
| - tm.assert_series_equal(result, expected) |
124 |
| - |
125 |
| - # ceil |
126 |
| - s = Series(pd.to_datetime(['2012-01-01 13:00:00', |
127 |
| - '2012-01-01 12:01:00', |
128 |
| - '2012-01-01 08:00:00']), name='xxx') |
129 |
| - result = s.dt.ceil('D') |
130 |
| - expected = Series(pd.to_datetime(['2012-01-02', '2012-01-02', |
131 |
| - '2012-01-02']), name='xxx') |
132 |
| - tm.assert_series_equal(result, expected) |
133 |
| - |
134 | 99 | # datetimeindex with tz
|
135 | 100 | s = Series(date_range('20130101', periods=5, tz='US/Eastern'),
|
136 | 101 | name='xxx')
|
@@ -261,6 +226,64 @@ def get_dir(s):
|
261 | 226 | with pytest.raises(com.SettingWithCopyError):
|
262 | 227 | s.dt.hour[0] = 5
|
263 | 228 |
|
| 229 | + @pytest.mark.parametrize('method, dates', [ |
| 230 | + ['round', ['2012-01-02', '2012-01-02', '2012-01-01']], |
| 231 | + ['floor', ['2012-01-01', '2012-01-01', '2012-01-01']], |
| 232 | + ['ceil', ['2012-01-02', '2012-01-02', '2012-01-02']] |
| 233 | + ]) |
| 234 | + def test_dt_round(self, method, dates): |
| 235 | + # round |
| 236 | + s = Series(pd.to_datetime(['2012-01-01 13:00:00', |
| 237 | + '2012-01-01 12:01:00', |
| 238 | + '2012-01-01 08:00:00']), name='xxx') |
| 239 | + result = getattr(s.dt, method)('D') |
| 240 | + expected = Series(pd.to_datetime(dates), name='xxx') |
| 241 | + tm.assert_series_equal(result, expected) |
| 242 | + |
| 243 | + def test_dt_round_tz(self): |
| 244 | + s = Series(pd.to_datetime(['2012-01-01 13:00:00', |
| 245 | + '2012-01-01 12:01:00', |
| 246 | + '2012-01-01 08:00:00']), name='xxx') |
| 247 | + result = (s.dt.tz_localize('UTC') |
| 248 | + .dt.tz_convert('US/Eastern') |
| 249 | + .dt.round('D')) |
| 250 | + |
| 251 | + exp_values = pd.to_datetime(['2012-01-01', '2012-01-01', |
| 252 | + '2012-01-01']).tz_localize('US/Eastern') |
| 253 | + expected = Series(exp_values, name='xxx') |
| 254 | + tm.assert_series_equal(result, expected) |
| 255 | + |
| 256 | + @pytest.mark.parametrize('method', ['ceil', 'round', 'floor']) |
| 257 | + def test_dt_round_tz_ambiguous(self, method): |
| 258 | + # GH 18946 round near DST |
| 259 | + df1 = pd.DataFrame([ |
| 260 | + pd.to_datetime('2017-10-29 02:00:00+02:00', utc=True), |
| 261 | + pd.to_datetime('2017-10-29 02:00:00+01:00', utc=True), |
| 262 | + pd.to_datetime('2017-10-29 03:00:00+01:00', utc=True) |
| 263 | + ], |
| 264 | + columns=['date']) |
| 265 | + df1['date'] = df1['date'].dt.tz_convert('Europe/Madrid') |
| 266 | + # infer |
| 267 | + result = getattr(df1.date.dt, method)('H', ambiguous='infer') |
| 268 | + expected = df1['date'] |
| 269 | + tm.assert_series_equal(result, expected) |
| 270 | + |
| 271 | + # bool-array |
| 272 | + result = getattr(df1.date.dt, method)( |
| 273 | + 'H', ambiguous=[True, False, False] |
| 274 | + ) |
| 275 | + tm.assert_series_equal(result, expected) |
| 276 | + |
| 277 | + # NaT |
| 278 | + result = getattr(df1.date.dt, method)('H', ambiguous='NaT') |
| 279 | + expected = df1['date'].copy() |
| 280 | + expected.iloc[0:2] = pd.NaT |
| 281 | + tm.assert_series_equal(result, expected) |
| 282 | + |
| 283 | + # raise |
| 284 | + with pytest.raises(pytz.AmbiguousTimeError): |
| 285 | + getattr(df1.date.dt, method)('H', ambiguous='raise') |
| 286 | + |
264 | 287 | def test_dt_namespace_accessor_categorical(self):
|
265 | 288 | # GH 19468
|
266 | 289 | dti = DatetimeIndex(['20171111', '20181212']).repeat(2)
|
|
0 commit comments