python - 如何仅在某些工作日分组?
问题描述
我有一个日期集,我想进一步过滤。我现在做的是按天和小时对它进行分组。但我想在工作日(周一至周五)和周末(周六至周日)拆分数据帧,并从每个数据帧中获取每小时值。我想要的是 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
解决方案
利用:
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')