|
11 | 11 | import pandas as pd
|
12 | 12 |
|
13 | 13 | from pandas import date_range, Timestamp, DatetimeIndex
|
| 14 | +from pandas.tseries.frequencies import to_offset |
14 | 15 |
|
15 | 16 |
|
16 | 17 | class TestDatetimeIndexOps(object):
|
@@ -169,6 +170,43 @@ def test_ceil_floor_edge(self, test_input, rounder, freq, expected):
|
169 | 170 | expected = DatetimeIndex(list(expected))
|
170 | 171 | assert expected.equals(result)
|
171 | 172 |
|
| 173 | + @pytest.mark.parametrize('start, index_freq, periods', [ |
| 174 | + ('2018-01-01', '12H', 25), |
| 175 | + ('2018-01-01 0:0:0.124999', '1ns', 1000), |
| 176 | + ]) |
| 177 | + @pytest.mark.parametrize('rounding_freq', [ |
| 178 | + '2ns', '3ns', '4ns', '5ns', '6ns', '7ns', |
| 179 | + '250ns', '500ns', '750ns', |
| 180 | + '1us', '19us', '250us', '500us', '750us', |
| 181 | + '1s', '2s', '3s', |
| 182 | + '12H', '1D', |
| 183 | + ]) |
| 184 | + def test_round_int64(self, start, index_freq, periods, rounding_freq): |
| 185 | + dt = DatetimeIndex(start=start, freq=index_freq, periods=periods) |
| 186 | + unit = to_offset(rounding_freq).nanos |
| 187 | + # test floor |
| 188 | + result = dt.floor(rounding_freq).asi8 |
| 189 | + diff = dt.asi8 - result |
| 190 | + mod = result % unit |
| 191 | + assert (mod == 0).all(), "floor not a %s multiple" % (rounding_freq, ) |
| 192 | + assert (0 <= diff).all() and (diff < unit).all(), "floor error" |
| 193 | + # test ceil |
| 194 | + result = dt.ceil(rounding_freq).asi8 |
| 195 | + diff = result - dt.asi8 |
| 196 | + mod = result % unit |
| 197 | + assert (mod == 0).all(), "ceil not a %s multiple" % (rounding_freq, ) |
| 198 | + assert (0 <= diff).all() and (diff < unit).all(), "ceil error" |
| 199 | + # test round |
| 200 | + result = dt.round(rounding_freq).asi8 |
| 201 | + diff = abs(result - dt.asi8) |
| 202 | + mod = result % unit |
| 203 | + assert (mod == 0).all(), "round not a %s multiple" % (rounding_freq, ) |
| 204 | + assert (diff <= unit // 2).all(), "round error" |
| 205 | + if unit % 2 == 0: |
| 206 | + assert ( |
| 207 | + result[diff == unit // 2] % 2 == 0 |
| 208 | + ).all(), "round half to even error" |
| 209 | + |
172 | 210 | # ----------------------------------------------------------------
|
173 | 211 | # DatetimeIndex.normalize
|
174 | 212 |
|
|
0 commit comments