【问题标题】:How to groupby only certain weekdays?如何仅在某些工作日分组?
【发布时间】:2021-10-23 13:43:24
【问题描述】:

我有一个要进一步过滤的日期集。我现在做的是按天和小时对它进行分组。但我想在工作日(周一至周五)和周末(周六至周日)拆分数据帧,并从每个数据帧中获取每小时值。我想要的是 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

【问题讨论】:

    标签: python pandas datetime


    【解决方案1】:

    用途:

    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')
    

    【讨论】:

    • 第二种解决方案看起来很棒。但是如何将 hourly_data 中的日期组合在一起?结果是一个多索引数据框,第一列是工作日,第二列是小时。我如何将其组合在一起以获得周一至周五的 0-23 的 dataframe1。周六至周日为 0-23 的 Dataframe2。非常感谢。:)
    • @Gobrel - 您需要删除 MultiIndex 的第一级吗?添加了第二个解决方案,但没有删除。
    • 你知道如何删除多索引的第一级吗?我正在网上搜索解决方案,但无法使用。
    • @Gobrel - 使用hourly_data.query("week &lt; 5").reset_index(level=0, drop=True)
    • 非常感谢。我真的很感谢你的努力。我处理 hourly_data2 的主要问题是,我可以用你的解决方案降低水平。但我最终得到了一个长长的列表,其中包含 0-23 和 0-23 的条目。我的主要问题和目标是如何将这个长列表汇总为平均值,以便我每天只有 0-23 而不是 0-23 0-23 0-23 0-23 0-23 。多索引消失了,但每天的条目仍然存在。:)
    猜你喜欢
    • 2014-09-09
    • 2021-05-18
    • 1970-01-01
    • 2016-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-29
    相关资源
    最近更新 更多