1- from datetime import time
1+ from datetime import datetime , time
22
33import numpy as np
44import pytest
55
6- from pandas import DataFrame , date_range
6+ from pandas ._libs .tslibs import timezones
7+ import pandas .util ._test_decorators as td
8+
9+ from pandas import DataFrame , Series , date_range
710import pandas ._testing as tm
811
912
1013class TestBetweenTime :
11- def test_between_time (self , close_open_fixture ):
14+ @td .skip_if_has_locale
15+ def test_between_time_formats (self , frame_or_series ):
16+ # GH#11818
1217 rng = date_range ("1/1/2000" , "1/5/2000" , freq = "5min" )
1318 ts = DataFrame (np .random .randn (len (rng ), 2 ), index = rng )
19+ if frame_or_series is Series :
20+ ts = ts [0 ]
21+
22+ strings = [
23+ ("2:00" , "2:30" ),
24+ ("0200" , "0230" ),
25+ ("2:00am" , "2:30am" ),
26+ ("0200am" , "0230am" ),
27+ ("2:00:00" , "2:30:00" ),
28+ ("020000" , "023000" ),
29+ ("2:00:00am" , "2:30:00am" ),
30+ ("020000am" , "023000am" ),
31+ ]
32+ expected_length = 28
33+
34+ for time_string in strings :
35+ assert len (ts .between_time (* time_string )) == expected_length
36+
37+ @pytest .mark .parametrize ("tzstr" , ["US/Eastern" , "dateutil/US/Eastern" ])
38+ def test_localized_between_time (self , tzstr , frame_or_series ):
39+ tz = timezones .maybe_get_tz (tzstr )
40+
41+ rng = date_range ("4/16/2012" , "5/1/2012" , freq = "H" )
42+ ts = Series (np .random .randn (len (rng )), index = rng )
43+ if frame_or_series is DataFrame :
44+ ts = ts .to_frame ()
45+
46+ ts_local = ts .tz_localize (tzstr )
47+
48+ t1 , t2 = time (10 , 0 ), time (11 , 0 )
49+ result = ts_local .between_time (t1 , t2 )
50+ expected = ts .between_time (t1 , t2 ).tz_localize (tzstr )
51+ tm .assert_equal (result , expected )
52+ assert timezones .tz_compare (result .index .tz , tz )
53+
54+ def test_between_time_types (self , frame_or_series ):
55+ # GH11818
56+ rng = date_range ("1/1/2000" , "1/5/2000" , freq = "5min" )
57+ obj = DataFrame ({"A" : 0 }, index = rng )
58+ if frame_or_series is Series :
59+ obj = obj ["A" ]
60+
61+ msg = r"Cannot convert arg \[datetime\.datetime\(2010, 1, 2, 1, 0\)\] to a time"
62+ with pytest .raises (ValueError , match = msg ):
63+ obj .between_time (datetime (2010 , 1 , 2 , 1 ), datetime (2010 , 1 , 2 , 5 ))
64+
65+ def test_between_time (self , close_open_fixture , frame_or_series ):
66+ rng = date_range ("1/1/2000" , "1/5/2000" , freq = "5min" )
67+ ts = DataFrame (np .random .randn (len (rng ), 2 ), index = rng )
68+ if frame_or_series is not DataFrame :
69+ ts = ts [0 ]
70+
1471 stime = time (0 , 0 )
1572 etime = time (1 , 0 )
1673 inc_start , inc_end = close_open_fixture
@@ -37,11 +94,13 @@ def test_between_time(self, close_open_fixture):
3794
3895 result = ts .between_time ("00:00" , "01:00" )
3996 expected = ts .between_time (stime , etime )
40- tm .assert_frame_equal (result , expected )
97+ tm .assert_equal (result , expected )
4198
4299 # across midnight
43100 rng = date_range ("1/1/2000" , "1/5/2000" , freq = "5min" )
44101 ts = DataFrame (np .random .randn (len (rng ), 2 ), index = rng )
102+ if frame_or_series is not DataFrame :
103+ ts = ts [0 ]
45104 stime = time (22 , 0 )
46105 etime = time (9 , 0 )
47106
@@ -65,14 +124,33 @@ def test_between_time(self, close_open_fixture):
65124 else :
66125 assert (t < etime ) or (t >= stime )
67126
68- def test_between_time_raises (self ):
127+ def test_between_time_raises (self , frame_or_series ):
69128 # GH#20725
70- df = DataFrame ([[1 , 2 , 3 ], [4 , 5 , 6 ]])
129+ obj = DataFrame ([[1 , 2 , 3 ], [4 , 5 , 6 ]])
130+ if frame_or_series is not DataFrame :
131+ obj = obj [0 ]
132+
71133 msg = "Index must be DatetimeIndex"
72134 with pytest .raises (TypeError , match = msg ): # index is not a DatetimeIndex
73- df .between_time (start_time = "00:00" , end_time = "12:00" )
135+ obj .between_time (start_time = "00:00" , end_time = "12:00" )
136+
137+ def test_between_time_axis (self , frame_or_series ):
138+ # GH#8839
139+ rng = date_range ("1/1/2000" , periods = 100 , freq = "10min" )
140+ ts = Series (np .random .randn (len (rng )), index = rng )
141+ if frame_or_series is DataFrame :
142+ ts = ts .to_frame ()
143+
144+ stime , etime = ("08:00:00" , "09:00:00" )
145+ expected_length = 7
146+
147+ assert len (ts .between_time (stime , etime )) == expected_length
148+ assert len (ts .between_time (stime , etime , axis = 0 )) == expected_length
149+ msg = f"No axis named { ts .ndim } for object type { type (ts ).__name__ } "
150+ with pytest .raises (ValueError , match = msg ):
151+ ts .between_time (stime , etime , axis = ts .ndim )
74152
75- def test_between_time_axis (self , axis ):
153+ def test_between_time_axis_aliases (self , axis ):
76154 # GH#8839
77155 rng = date_range ("1/1/2000" , periods = 100 , freq = "10min" )
78156 ts = DataFrame (np .random .randn (len (rng ), len (rng )))
0 commit comments