@@ -2903,6 +2903,108 @@ def test_groupby_with_timegrouper_methods(self):
2903
2903
self .assertTrue (isinstance (groups ,dict ))
2904
2904
self .assertTrue (len (groups ) == 3 )
2905
2905
2906
+ def test_timegrouper_with_reg_groups (self ):
2907
+
2908
+ # GH 3794
2909
+ # allow combinateion of timegrouper/reg groups
2910
+
2911
+ import datetime as DT
2912
+
2913
+ df = DataFrame ({
2914
+ 'Branch' : 'A A A A A A A B' .split (),
2915
+ 'Buyer' : 'Carl Mark Carl Carl Joe Joe Joe Carl' .split (),
2916
+ 'Quantity' : [1 ,3 ,5 ,1 ,8 ,1 ,9 ,3 ],
2917
+ 'Date' : [
2918
+ DT .datetime (2013 ,1 ,1 ,13 ,0 ),
2919
+ DT .datetime (2013 ,1 ,1 ,13 ,5 ),
2920
+ DT .datetime (2013 ,10 ,1 ,20 ,0 ),
2921
+ DT .datetime (2013 ,10 ,2 ,10 ,0 ),
2922
+ DT .datetime (2013 ,10 ,1 ,20 ,0 ),
2923
+ DT .datetime (2013 ,10 ,2 ,10 ,0 ),
2924
+ DT .datetime (2013 ,12 ,2 ,12 ,0 ),
2925
+ DT .datetime (2013 ,12 ,2 ,14 ,0 ),
2926
+ ]}).set_index ('Date' )
2927
+
2928
+ expected = DataFrame ({
2929
+ 'Buyer' : 'Carl Joe Mark' .split (),
2930
+ 'Quantity' : [10 ,18 ,3 ],
2931
+ 'Date' : [
2932
+ DT .datetime (2013 ,12 ,31 ,0 ,0 ),
2933
+ DT .datetime (2013 ,12 ,31 ,0 ,0 ),
2934
+ DT .datetime (2013 ,12 ,31 ,0 ,0 ),
2935
+ ]}).set_index (['Date' ,'Buyer' ])
2936
+ result = df .groupby ([pd .TimeGrouper ('A' ),'Buyer' ]).sum ()
2937
+ assert_frame_equal (result ,expected )
2938
+
2939
+ expected = DataFrame ({
2940
+ 'Buyer' : 'Carl Mark Carl Joe' .split (),
2941
+ 'Quantity' : [1 ,3 ,9 ,18 ],
2942
+ 'Date' : [
2943
+ DT .datetime (2013 ,1 ,1 ,0 ,0 ),
2944
+ DT .datetime (2013 ,1 ,1 ,0 ,0 ),
2945
+ DT .datetime (2013 ,7 ,1 ,0 ,0 ),
2946
+ DT .datetime (2013 ,7 ,1 ,0 ,0 ),
2947
+ ]}).set_index (['Date' ,'Buyer' ])
2948
+
2949
+ result = df .groupby ([pd .TimeGrouper ('6MS' ),'Buyer' ]).sum ()
2950
+ assert_frame_equal (result ,expected )
2951
+
2952
+ df = DataFrame ({
2953
+ 'Branch' : 'A A A A A A A B' .split (),
2954
+ 'Buyer' : 'Carl Mark Carl Carl Joe Joe Joe Carl' .split (),
2955
+ 'Quantity' : [1 ,3 ,5 ,1 ,8 ,1 ,9 ,3 ],
2956
+ 'Date' : [
2957
+ DT .datetime (2013 ,10 ,1 ,13 ,0 ),
2958
+ DT .datetime (2013 ,10 ,1 ,13 ,5 ),
2959
+ DT .datetime (2013 ,10 ,1 ,20 ,0 ),
2960
+ DT .datetime (2013 ,10 ,2 ,10 ,0 ),
2961
+ DT .datetime (2013 ,10 ,1 ,20 ,0 ),
2962
+ DT .datetime (2013 ,10 ,2 ,10 ,0 ),
2963
+ DT .datetime (2013 ,10 ,2 ,12 ,0 ),
2964
+ DT .datetime (2013 ,10 ,2 ,14 ,0 ),
2965
+ ]}).set_index ('Date' )
2966
+
2967
+ expected = DataFrame ({
2968
+ 'Buyer' : 'Carl Joe Mark Carl Joe' .split (),
2969
+ 'Quantity' : [6 ,8 ,3 ,4 ,10 ],
2970
+ 'Date' : [
2971
+ DT .datetime (2013 ,10 ,1 ,0 ,0 ),
2972
+ DT .datetime (2013 ,10 ,1 ,0 ,0 ),
2973
+ DT .datetime (2013 ,10 ,1 ,0 ,0 ),
2974
+ DT .datetime (2013 ,10 ,2 ,0 ,0 ),
2975
+ DT .datetime (2013 ,10 ,2 ,0 ,0 ),
2976
+ ]}).set_index (['Date' ,'Buyer' ])
2977
+
2978
+ result = df .groupby ([pd .TimeGrouper ('1D' ),'Buyer' ]).sum ()
2979
+ assert_frame_equal (result ,expected )
2980
+
2981
+ result = df .groupby ([pd .TimeGrouper ('1M' ),'Buyer' ]).sum ()
2982
+ expected = DataFrame ({
2983
+ 'Buyer' : 'Carl Joe Mark' .split (),
2984
+ 'Quantity' : [10 ,18 ,3 ],
2985
+ 'Date' : [
2986
+ DT .datetime (2013 ,10 ,31 ,0 ,0 ),
2987
+ DT .datetime (2013 ,10 ,31 ,0 ,0 ),
2988
+ DT .datetime (2013 ,10 ,31 ,0 ,0 ),
2989
+ ]}).set_index (['Date' ,'Buyer' ])
2990
+ assert_frame_equal (result ,expected )
2991
+
2992
+ # passing the name
2993
+ df = df .reset_index ()
2994
+ result = df .groupby ([pd .TimeGrouper ('1M' ,name = 'Date' ),'Buyer' ]).sum ()
2995
+ assert_frame_equal (result ,expected )
2996
+
2997
+ self .assertRaises (KeyError , lambda : df .groupby ([pd .TimeGrouper ('1M' ,name = 'foo' ),'Buyer' ]).sum ())
2998
+
2999
+ # passing the level
3000
+ df = df .set_index ('Date' )
3001
+ result = df .groupby ([pd .TimeGrouper ('1M' ,level = 'Date' ),'Buyer' ]).sum ()
3002
+ assert_frame_equal (result ,expected )
3003
+ result = df .groupby ([pd .TimeGrouper ('1M' ,level = 0 ),'Buyer' ]).sum ()
3004
+ assert_frame_equal (result ,expected )
3005
+
3006
+ self .assertRaises (ValueError , lambda : df .groupby ([pd .TimeGrouper ('1M' ,level = 'foo' ),'Buyer' ]).sum ())
3007
+
2906
3008
def test_cumcount (self ):
2907
3009
df = DataFrame ([['a' ], ['a' ], ['a' ], ['b' ], ['a' ]], columns = ['A' ])
2908
3010
g = df .groupby ('A' )
0 commit comments