首页 > 解决方案 > 如何仅在某些工作日分组?

问题描述

我有一个日期集,我想进一步过滤。我现在做的是按天和小时对它进行分组。但我想在工作日(周一至周五)和周末(周六至周日)拆分数据帧,并从每个数据帧中获取每小时值。我想要的是 Dataframe(Monday-Friday) 包含一天中每个小时的小时平均值(Monday-Friday),而另一个 DataFrame(Saturday-Sunday) 包含周末每个小时的小时平均值。我该怎么做?

实际数据位于数据透视表中。以我的数据为例:

datetime                    value 
2018-01-01 00:30:00+01:00   0.22 
2018-01-01 00:35:00+01:00   0.31   
2018-01-01 00:40:00+01:00   0.36   
2018-01-02 00:30:00+01:00   1.15  
2018-01-02 00:35:00+01:00   1.80   
2018-01-03 00:30:00+01:00   2.60  
2018-01-03 00:35:00+01:00   0.31   
2018-01-03 00:40:00+01:00   2.30 
2018-01-04 00:30:00+01:00   1.90   
2018-01-04 00:35:00+01:00   0.31   
2018-01-04 00:40:00+01:00   0.11   
2018-01-04 00:45:00+01:00   2.10  
2018-01-05 00:35:00+01:00   0.31   
2018-01-05 00:40:00+01:00   0.31   
2018-01-06 00:30:00+01:00   2.90 
2018-01-07 00:35:00+01:00   0.31   

这是我用于每小时数据的示例:

hourly_data = df.groupby([lambda idx: idx.hour]).agg([np.mean, np.std])

结果,我目前拥有的周一至周日的每小时数据是:

    mean        std
0   27.860838   18.343950
1   24.911061   16.232515
2   22.336631   14.677039
3   20.573154   12.753809
4   20.212531   12.344275
5   21.627746   13.345323
6   25.588201   14.912653
7   30.159981   17.578256
8   31.318752   17.861644
9   29.879141   16.428627
10  28.352384   15.407880
11  27.699245   15.733109
12  28.969922   17.200370
13  30.788167   19.134690
14  32.769236   20.259829
15  34.660255   21.245490
16  37.788306   22.291647
17  39.799648   23.015198
18  42.112639   24.492105
19  42.179550   25.723250
20  42.504322   26.344708
21  39.665381   24.751716
22  35.955789   22.529915
23  31.320789   19.816748

标签: pythonpandasdatetime

解决方案


利用:

m = df.index.dayofweek < 5

hourly_data1 = df[m].groupby(df.index.hour).agg([np.mean, np.std])
hourly_data2 = df[~m].groupby(df.index.hour).agg([np.mean, np.std])

或者:

arr = np.where(df.index.dayofweek < 5, 'workdays','weekend')
hourly_data = (df.groupby([arr, df.index.hour])
                 .agg([np.mean, np.std])
                 .rename_axis(('type','hour')))

hourly_data1 = hourly_data.xs('workdays')
hourly_data2 = hourly_data.xs('weekend')

推荐阅读