使用pandas groupby计算周数

时间:2018-08-14 17:06:22

标签: python pandas datetime count

我有以下示例数据框:

Date                count_row   Work_Type
2018-07-31 00:00:00 1           logpage
2018-08-01 00:00:00 1           logpage
2018-08-01 00:00:00 1           logpage
2018-08-01 00:00:00 1           logpage
2018-08-01 00:00:00 1           logpage
2018-09-02 00:00:00 1           logpage
2018-09-02 00:00:00 1           logpage
2018-09-03 00:00:00 1           logpage
2018-09-04 00:00:00 1           logpage
2018-09-04 00:00:00 1           logpage
2018-09-06 00:00:00 1           logpage
2018-09-07 00:00:00 1           logpage
2018-09-08 00:00:00 1           logpage

我想将其分解为几周,并计算该周的出现次数。具体来说,我认为一周的开始是星期一,一周的结束是星期日。

例如,9/3/2018是星期一(或我认为是一周的开始)。所以从那个星期一到下一个星期日,我算的都是9/3/2018。

以下是我正在寻找的数据框结果:

Beginning of Week Date (Mon)    count
7/30/2018                       5
8/27/2018                       2
9/3/2018                        6

我尝试了以下代码:

df.set_index('Date', inplace=True)
df.sort_index(inplace=True)

def take_first(array_like):
    return array_like[0]

output = df.resample('W',                  
                    how={'Date': take_first, 
                         'count_row': 'sum'}, 
                    loffset=pd.offsets.timedelta(days=-6))

这是我得到的错误:

IndexError: index out of bounds

2 个答案:

答案 0 :(得分:2)

一点时间算术+ value_counts应该可以解决这个问题:

  1. 找到从一周开始的天数偏移量
  2. 减去增量以获取一周的开始
  3. 计算这些值。

(df['Date'].sub(pd.to_timedelta(df['Date'].dt.dayofweek, unit='D'))
    .value_counts(sort=False))

2018-07-30    5
2018-08-27    2
2018-09-03    6
Name: Date, dtype: int64

答案 1 :(得分:1)

您可以使用resample

df.resample('W-Mon', on='Date', label='left', closed='left').sum().query('count_row > 0') 

输出:

            count_row
Date                 
2018-07-30          5
2018-08-27          2
2018-09-03          6