1
- from datetime import time
1
+ from datetime import datetime , time
2
2
3
3
import numpy as np
4
4
import pytest
5
5
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
7
10
import pandas ._testing as tm
8
11
9
12
10
13
class 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
12
17
rng = date_range ("1/1/2000" , "1/5/2000" , freq = "5min" )
13
18
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
+
14
71
stime = time (0 , 0 )
15
72
etime = time (1 , 0 )
16
73
inc_start , inc_end = close_open_fixture
@@ -37,11 +94,13 @@ def test_between_time(self, close_open_fixture):
37
94
38
95
result = ts .between_time ("00:00" , "01:00" )
39
96
expected = ts .between_time (stime , etime )
40
- tm .assert_frame_equal (result , expected )
97
+ tm .assert_equal (result , expected )
41
98
42
99
# across midnight
43
100
rng = date_range ("1/1/2000" , "1/5/2000" , freq = "5min" )
44
101
ts = DataFrame (np .random .randn (len (rng ), 2 ), index = rng )
102
+ if frame_or_series is not DataFrame :
103
+ ts = ts [0 ]
45
104
stime = time (22 , 0 )
46
105
etime = time (9 , 0 )
47
106
@@ -65,14 +124,33 @@ def test_between_time(self, close_open_fixture):
65
124
else :
66
125
assert (t < etime ) or (t >= stime )
67
126
68
- def test_between_time_raises (self ):
127
+ def test_between_time_raises (self , frame_or_series ):
69
128
# 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
+
71
133
msg = "Index must be DatetimeIndex"
72
134
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 )
74
152
75
- def test_between_time_axis (self , axis ):
153
+ def test_between_time_axis_aliases (self , axis ):
76
154
# GH#8839
77
155
rng = date_range ("1/1/2000" , periods = 100 , freq = "10min" )
78
156
ts = DataFrame (np .random .randn (len (rng ), len (rng )))
0 commit comments