2525from pandas .tests .frame .common import TestData
2626
2727
28+ @pytest .fixture (params = product ([True , False ], [True , False ]))
29+ def close_open_fixture (request ):
30+ return request .param
31+
32+
2833class TestDataFrameTimeSeriesMethods (TestData ):
2934
3035 def test_diff (self ):
@@ -638,33 +643,49 @@ def test_at_time_raises(self):
638643 with pytest .raises (TypeError ): # index is not a DatetimeIndex
639644 df .at_time ('00:00' )
640645
641- def test_between_time (self ):
646+ @pytest .mark .parametrize ('axis' , ['index' , 'columns' , 0 , 1 ])
647+ def test_at_time_axis (self , axis ):
648+ # issue 8839
649+ rng = date_range ('1/1/2000' , '1/5/2000' , freq = '5min' )
650+ ts = DataFrame (np .random .randn (len (rng ), len (rng )))
651+ ts .index , ts .columns = rng , rng
652+
653+ indices = rng [(rng .hour == 9 ) & (rng .minute == 30 ) & (rng .second == 0 )]
654+
655+ if axis in ['index' , 0 ]:
656+ expected = ts .loc [indices , :]
657+ elif axis in ['columns' , 1 ]:
658+ expected = ts .loc [:, indices ]
659+
660+ result = ts .at_time ('9:30' , axis = axis )
661+ assert_frame_equal (result , expected )
662+
663+ def test_between_time (self , close_open_fixture ):
642664 rng = date_range ('1/1/2000' , '1/5/2000' , freq = '5min' )
643665 ts = DataFrame (np .random .randn (len (rng ), 2 ), index = rng )
644666 stime = time (0 , 0 )
645667 etime = time (1 , 0 )
646-
647- close_open = product ([True , False ], [True , False ])
648- for inc_start , inc_end in close_open :
649- filtered = ts .between_time (stime , etime , inc_start , inc_end )
650- exp_len = 13 * 4 + 1
651- if not inc_start :
652- exp_len -= 5
653- if not inc_end :
654- exp_len -= 4
655-
656- assert len (filtered ) == exp_len
657- for rs in filtered .index :
658- t = rs .time ()
659- if inc_start :
660- assert t >= stime
661- else :
662- assert t > stime
663-
664- if inc_end :
665- assert t <= etime
666- else :
667- assert t < etime
668+ inc_start , inc_end = close_open_fixture
669+
670+ filtered = ts .between_time (stime , etime , inc_start , inc_end )
671+ exp_len = 13 * 4 + 1
672+ if not inc_start :
673+ exp_len -= 5
674+ if not inc_end :
675+ exp_len -= 4
676+
677+ assert len (filtered ) == exp_len
678+ for rs in filtered .index :
679+ t = rs .time ()
680+ if inc_start :
681+ assert t >= stime
682+ else :
683+ assert t > stime
684+
685+ if inc_end :
686+ assert t <= etime
687+ else :
688+ assert t < etime
668689
669690 result = ts .between_time ('00:00' , '01:00' )
670691 expected = ts .between_time (stime , etime )
@@ -676,34 +697,66 @@ def test_between_time(self):
676697 stime = time (22 , 0 )
677698 etime = time (9 , 0 )
678699
679- close_open = product ([True , False ], [True , False ])
680- for inc_start , inc_end in close_open :
681- filtered = ts .between_time (stime , etime , inc_start , inc_end )
682- exp_len = (12 * 11 + 1 ) * 4 + 1
683- if not inc_start :
684- exp_len -= 4
685- if not inc_end :
686- exp_len -= 4
687-
688- assert len (filtered ) == exp_len
689- for rs in filtered .index :
690- t = rs .time ()
691- if inc_start :
692- assert (t >= stime ) or (t <= etime )
693- else :
694- assert (t > stime ) or (t <= etime )
695-
696- if inc_end :
697- assert (t <= etime ) or (t >= stime )
698- else :
699- assert (t < etime ) or (t >= stime )
700+ filtered = ts .between_time (stime , etime , inc_start , inc_end )
701+ exp_len = (12 * 11 + 1 ) * 4 + 1
702+ if not inc_start :
703+ exp_len -= 4
704+ if not inc_end :
705+ exp_len -= 4
706+
707+ assert len (filtered ) == exp_len
708+ for rs in filtered .index :
709+ t = rs .time ()
710+ if inc_start :
711+ assert (t >= stime ) or (t <= etime )
712+ else :
713+ assert (t > stime ) or (t <= etime )
714+
715+ if inc_end :
716+ assert (t <= etime ) or (t >= stime )
717+ else :
718+ assert (t < etime ) or (t >= stime )
700719
701720 def test_between_time_raises (self ):
702721 # GH20725
703722 df = pd .DataFrame ([[1 , 2 , 3 ], [4 , 5 , 6 ]])
704723 with pytest .raises (TypeError ): # index is not a DatetimeIndex
705724 df .between_time (start_time = '00:00' , end_time = '12:00' )
706725
726+ def test_between_time_axis (self , axis ):
727+ # issue 8839
728+ rng = date_range ('1/1/2000' , periods = 100 , freq = '10min' )
729+ ts = DataFrame (np .random .randn (len (rng ), len (rng )))
730+ stime , etime = ('08:00:00' , '09:00:00' )
731+ exp_len = 7
732+
733+ if axis in ['index' , 0 ]:
734+ ts .index = rng
735+ assert len (ts .between_time (stime , etime )) == exp_len
736+ assert len (ts .between_time (stime , etime , axis = 0 )) == exp_len
737+
738+ if axis in ['columns' , 1 ]:
739+ ts .columns = rng
740+ selected = ts .between_time (stime , etime , axis = 1 ).columns
741+ assert len (selected ) == exp_len
742+
743+ def test_between_time_axis_raises (self , axis ):
744+ # issue 8839
745+ rng = date_range ('1/1/2000' , periods = 100 , freq = '10min' )
746+ mask = np .arange (0 , len (rng ))
747+ rand_data = np .random .randn (len (rng ), len (rng ))
748+ ts = DataFrame (rand_data , index = rng , columns = rng )
749+ stime , etime = ('08:00:00' , '09:00:00' )
750+
751+ if axis in ['columns' , 1 ]:
752+ ts .index = mask
753+ pytest .raises (TypeError , ts .between_time , stime , etime )
754+ pytest .raises (TypeError , ts .between_time , stime , etime , axis = 0 )
755+
756+ if axis in ['index' , 0 ]:
757+ ts .columns = mask
758+ pytest .raises (TypeError , ts .between_time , stime , etime , axis = 1 )
759+
707760 def test_operation_on_NaT (self ):
708761 # Both NaT and Timestamp are in DataFrame.
709762 df = pd .DataFrame ({'foo' : [pd .NaT , pd .NaT ,
0 commit comments