25
25
from pandas .tests .frame .common import TestData
26
26
27
27
28
+ @pytest .fixture (params = product ([True , False ], [True , False ]))
29
+ def close_open_fixture (request ):
30
+ return request .param
31
+
32
+
28
33
class TestDataFrameTimeSeriesMethods (TestData ):
29
34
30
35
def test_diff (self ):
@@ -638,33 +643,49 @@ def test_at_time_raises(self):
638
643
with pytest .raises (TypeError ): # index is not a DatetimeIndex
639
644
df .at_time ('00:00' )
640
645
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 ):
642
664
rng = date_range ('1/1/2000' , '1/5/2000' , freq = '5min' )
643
665
ts = DataFrame (np .random .randn (len (rng ), 2 ), index = rng )
644
666
stime = time (0 , 0 )
645
667
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
668
689
669
690
result = ts .between_time ('00:00' , '01:00' )
670
691
expected = ts .between_time (stime , etime )
@@ -676,34 +697,66 @@ def test_between_time(self):
676
697
stime = time (22 , 0 )
677
698
etime = time (9 , 0 )
678
699
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 )
700
719
701
720
def test_between_time_raises (self ):
702
721
# GH20725
703
722
df = pd .DataFrame ([[1 , 2 , 3 ], [4 , 5 , 6 ]])
704
723
with pytest .raises (TypeError ): # index is not a DatetimeIndex
705
724
df .between_time (start_time = '00:00' , end_time = '12:00' )
706
725
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
+
707
760
def test_operation_on_NaT (self ):
708
761
# Both NaT and Timestamp are in DataFrame.
709
762
df = pd .DataFrame ({'foo' : [pd .NaT , pd .NaT ,
0 commit comments