Skip to content

Commit fbd3e71

Browse files
committed
between_time
1 parent 9e0df5a commit fbd3e71

File tree

4 files changed

+146
-139
lines changed

4 files changed

+146
-139
lines changed

pandas/tests/series/methods/test_at_time.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,7 @@
1111

1212
class TestAtTime:
1313
@pytest.mark.parametrize("tzstr", ["US/Eastern", "dateutil/US/Eastern"])
14-
def test_localized_at_time_between_time(self, tzstr):
15-
from datetime import time
16-
14+
def test_localized_at_time(self, tzstr):
1715
tz = timezones.maybe_get_tz(tzstr)
1816

1917
rng = date_range("4/16/2012", "5/1/2012", freq="H")
Lines changed: 144 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,144 @@
1+
from datetime import datetime, time
2+
from itertools import product
3+
4+
import numpy as np
5+
import pytest
6+
7+
from pandas._libs.tslibs import timezones
8+
import pandas.util._test_decorators as td
9+
10+
from pandas import DataFrame, Series, date_range
11+
import pandas._testing as tm
12+
13+
14+
class TestBetweenTime:
15+
@pytest.mark.parametrize("tzstr", ["US/Eastern", "dateutil/US/Eastern"])
16+
def test_localized_between_time(self, tzstr):
17+
tz = timezones.maybe_get_tz(tzstr)
18+
19+
rng = date_range("4/16/2012", "5/1/2012", freq="H")
20+
ts = Series(np.random.randn(len(rng)), index=rng)
21+
22+
ts_local = ts.tz_localize(tzstr)
23+
24+
t1, t2 = time(10, 0), time(11, 0)
25+
result = ts_local.between_time(t1, t2)
26+
expected = ts.between_time(t1, t2).tz_localize(tzstr)
27+
tm.assert_series_equal(result, expected)
28+
assert timezones.tz_compare(result.index.tz, tz)
29+
30+
def test_between_time(self):
31+
rng = date_range("1/1/2000", "1/5/2000", freq="5min")
32+
ts = Series(np.random.randn(len(rng)), index=rng)
33+
stime = time(0, 0)
34+
etime = time(1, 0)
35+
36+
close_open = product([True, False], [True, False])
37+
for inc_start, inc_end in close_open:
38+
filtered = ts.between_time(stime, etime, inc_start, inc_end)
39+
exp_len = 13 * 4 + 1
40+
if not inc_start:
41+
exp_len -= 5
42+
if not inc_end:
43+
exp_len -= 4
44+
45+
assert len(filtered) == exp_len
46+
for rs in filtered.index:
47+
t = rs.time()
48+
if inc_start:
49+
assert t >= stime
50+
else:
51+
assert t > stime
52+
53+
if inc_end:
54+
assert t <= etime
55+
else:
56+
assert t < etime
57+
58+
result = ts.between_time("00:00", "01:00")
59+
expected = ts.between_time(stime, etime)
60+
tm.assert_series_equal(result, expected)
61+
62+
# across midnight
63+
rng = date_range("1/1/2000", "1/5/2000", freq="5min")
64+
ts = Series(np.random.randn(len(rng)), index=rng)
65+
stime = time(22, 0)
66+
etime = time(9, 0)
67+
68+
close_open = product([True, False], [True, False])
69+
for inc_start, inc_end in close_open:
70+
filtered = ts.between_time(stime, etime, inc_start, inc_end)
71+
exp_len = (12 * 11 + 1) * 4 + 1
72+
if not inc_start:
73+
exp_len -= 4
74+
if not inc_end:
75+
exp_len -= 4
76+
77+
assert len(filtered) == exp_len
78+
for rs in filtered.index:
79+
t = rs.time()
80+
if inc_start:
81+
assert (t >= stime) or (t <= etime)
82+
else:
83+
assert (t > stime) or (t <= etime)
84+
85+
if inc_end:
86+
assert (t <= etime) or (t >= stime)
87+
else:
88+
assert (t < etime) or (t >= stime)
89+
90+
def test_between_time_raises(self):
91+
# GH20725
92+
ser = Series("a b c".split())
93+
msg = "Index must be DatetimeIndex"
94+
with pytest.raises(TypeError, match=msg):
95+
ser.between_time(start_time="00:00", end_time="12:00")
96+
97+
def test_between_time_types(self):
98+
# GH11818
99+
rng = date_range("1/1/2000", "1/5/2000", freq="5min")
100+
msg = r"Cannot convert arg \[datetime\.datetime\(2010, 1, 2, 1, 0\)\] to a time"
101+
with pytest.raises(ValueError, match=msg):
102+
rng.indexer_between_time(datetime(2010, 1, 2, 1), datetime(2010, 1, 2, 5))
103+
104+
frame = DataFrame({"A": 0}, index=rng)
105+
with pytest.raises(ValueError, match=msg):
106+
frame.between_time(datetime(2010, 1, 2, 1), datetime(2010, 1, 2, 5))
107+
108+
series = Series(0, index=rng)
109+
with pytest.raises(ValueError, match=msg):
110+
series.between_time(datetime(2010, 1, 2, 1), datetime(2010, 1, 2, 5))
111+
112+
@td.skip_if_has_locale
113+
def test_between_time_formats(self):
114+
# GH11818
115+
rng = date_range("1/1/2000", "1/5/2000", freq="5min")
116+
ts = DataFrame(np.random.randn(len(rng), 2), index=rng)
117+
118+
strings = [
119+
("2:00", "2:30"),
120+
("0200", "0230"),
121+
("2:00am", "2:30am"),
122+
("0200am", "0230am"),
123+
("2:00:00", "2:30:00"),
124+
("020000", "023000"),
125+
("2:00:00am", "2:30:00am"),
126+
("020000am", "023000am"),
127+
]
128+
expected_length = 28
129+
130+
for time_string in strings:
131+
assert len(ts.between_time(*time_string)) == expected_length
132+
133+
def test_between_time_axis(self):
134+
# issue 8839
135+
rng = date_range("1/1/2000", periods=100, freq="10min")
136+
ts = Series(np.random.randn(len(rng)), index=rng)
137+
stime, etime = ("08:00:00", "09:00:00")
138+
expected_length = 7
139+
140+
assert len(ts.between_time(stime, etime)) == expected_length
141+
assert len(ts.between_time(stime, etime, axis=0)) == expected_length
142+
msg = "No axis named 1 for object type <class 'pandas.core.series.Series'>"
143+
with pytest.raises(ValueError, match=msg):
144+
ts.between_time(stime, etime, axis=1)

pandas/tests/series/test_timeseries.py

Lines changed: 1 addition & 119 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,11 @@
1-
from datetime import datetime, time, timedelta
1+
from datetime import datetime, timedelta
22
from io import StringIO
3-
from itertools import product
43

54
import numpy as np
65
import pytest
76

87
from pandas._libs.tslib import iNaT
98
from pandas._libs.tslibs.np_datetime import OutOfBoundsDatetime
10-
import pandas.util._test_decorators as td
119

1210
import pandas as pd
1311
from pandas import (
@@ -380,122 +378,6 @@ def test_format_pre_1900_dates(self):
380378
ts = Series(1, index=rng)
381379
repr(ts)
382380

383-
def test_between_time(self):
384-
rng = date_range("1/1/2000", "1/5/2000", freq="5min")
385-
ts = Series(np.random.randn(len(rng)), index=rng)
386-
stime = time(0, 0)
387-
etime = time(1, 0)
388-
389-
close_open = product([True, False], [True, False])
390-
for inc_start, inc_end in close_open:
391-
filtered = ts.between_time(stime, etime, inc_start, inc_end)
392-
exp_len = 13 * 4 + 1
393-
if not inc_start:
394-
exp_len -= 5
395-
if not inc_end:
396-
exp_len -= 4
397-
398-
assert len(filtered) == exp_len
399-
for rs in filtered.index:
400-
t = rs.time()
401-
if inc_start:
402-
assert t >= stime
403-
else:
404-
assert t > stime
405-
406-
if inc_end:
407-
assert t <= etime
408-
else:
409-
assert t < etime
410-
411-
result = ts.between_time("00:00", "01:00")
412-
expected = ts.between_time(stime, etime)
413-
tm.assert_series_equal(result, expected)
414-
415-
# across midnight
416-
rng = date_range("1/1/2000", "1/5/2000", freq="5min")
417-
ts = Series(np.random.randn(len(rng)), index=rng)
418-
stime = time(22, 0)
419-
etime = time(9, 0)
420-
421-
close_open = product([True, False], [True, False])
422-
for inc_start, inc_end in close_open:
423-
filtered = ts.between_time(stime, etime, inc_start, inc_end)
424-
exp_len = (12 * 11 + 1) * 4 + 1
425-
if not inc_start:
426-
exp_len -= 4
427-
if not inc_end:
428-
exp_len -= 4
429-
430-
assert len(filtered) == exp_len
431-
for rs in filtered.index:
432-
t = rs.time()
433-
if inc_start:
434-
assert (t >= stime) or (t <= etime)
435-
else:
436-
assert (t > stime) or (t <= etime)
437-
438-
if inc_end:
439-
assert (t <= etime) or (t >= stime)
440-
else:
441-
assert (t < etime) or (t >= stime)
442-
443-
def test_between_time_raises(self):
444-
# GH20725
445-
ser = pd.Series("a b c".split())
446-
msg = "Index must be DatetimeIndex"
447-
with pytest.raises(TypeError, match=msg):
448-
ser.between_time(start_time="00:00", end_time="12:00")
449-
450-
def test_between_time_types(self):
451-
# GH11818
452-
rng = date_range("1/1/2000", "1/5/2000", freq="5min")
453-
msg = r"Cannot convert arg \[datetime\.datetime\(2010, 1, 2, 1, 0\)\] to a time"
454-
with pytest.raises(ValueError, match=msg):
455-
rng.indexer_between_time(datetime(2010, 1, 2, 1), datetime(2010, 1, 2, 5))
456-
457-
frame = DataFrame({"A": 0}, index=rng)
458-
with pytest.raises(ValueError, match=msg):
459-
frame.between_time(datetime(2010, 1, 2, 1), datetime(2010, 1, 2, 5))
460-
461-
series = Series(0, index=rng)
462-
with pytest.raises(ValueError, match=msg):
463-
series.between_time(datetime(2010, 1, 2, 1), datetime(2010, 1, 2, 5))
464-
465-
@td.skip_if_has_locale
466-
def test_between_time_formats(self):
467-
# GH11818
468-
rng = date_range("1/1/2000", "1/5/2000", freq="5min")
469-
ts = DataFrame(np.random.randn(len(rng), 2), index=rng)
470-
471-
strings = [
472-
("2:00", "2:30"),
473-
("0200", "0230"),
474-
("2:00am", "2:30am"),
475-
("0200am", "0230am"),
476-
("2:00:00", "2:30:00"),
477-
("020000", "023000"),
478-
("2:00:00am", "2:30:00am"),
479-
("020000am", "023000am"),
480-
]
481-
expected_length = 28
482-
483-
for time_string in strings:
484-
assert len(ts.between_time(*time_string)) == expected_length
485-
486-
def test_between_time_axis(self):
487-
# issue 8839
488-
rng = date_range("1/1/2000", periods=100, freq="10min")
489-
ts = Series(np.random.randn(len(rng)), index=rng)
490-
stime, etime = ("08:00:00", "09:00:00")
491-
expected_length = 7
492-
493-
assert len(ts.between_time(stime, etime)) == expected_length
494-
assert len(ts.between_time(stime, etime, axis=0)) == expected_length
495-
msg = "No axis named 1 for object type <class 'pandas.core.series.Series'>"
496-
with pytest.raises(ValueError, match=msg):
497-
ts.between_time(stime, etime, axis=1)
498-
499381
def test_to_period(self):
500382
from pandas.core.indexes.period import period_range
501383

pandas/tests/series/test_timezones.py

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -184,23 +184,6 @@ def test_series_align_aware(self):
184184
assert new1.index.tz == pytz.UTC
185185
assert new2.index.tz == pytz.UTC
186186

187-
@pytest.mark.parametrize("tzstr", ["US/Eastern", "dateutil/US/Eastern"])
188-
def test_localized_between_time(self, tzstr):
189-
from datetime import time
190-
191-
tz = timezones.maybe_get_tz(tzstr)
192-
193-
rng = date_range("4/16/2012", "5/1/2012", freq="H")
194-
ts = Series(np.random.randn(len(rng)), index=rng)
195-
196-
ts_local = ts.tz_localize(tzstr)
197-
198-
t1, t2 = time(10, 0), time(11, 0)
199-
result = ts_local.between_time(t1, t2)
200-
expected = ts.between_time(t1, t2).tz_localize(tzstr)
201-
tm.assert_series_equal(result, expected)
202-
assert timezones.tz_compare(result.index.tz, tz)
203-
204187
@pytest.mark.parametrize("tzstr", ["Europe/Berlin", "dateutil/Europe/Berlin"])
205188
def test_getitem_pydatetime_tz(self, tzstr):
206189
tz = timezones.maybe_get_tz(tzstr)

0 commit comments

Comments
 (0)