【问题标题】:group by week in pandas在熊猫中按周分组
【发布时间】:2017-12-30 01:57:03
【问题描述】:

我有这个数据框:

Name   Date    Quantity
Apple  07/11/17  20
orange 07/14/17  20
Apple  07/14/17  70
Orange 07/25/17  40
Apple  07/20/17  30

我想通过 NameDate 将其汇总以获得数量总和 详情:

日期:分组,结果应该是在一周的开始(或者就在星期一)

数量:求和,如果两个或多个记录具有相同的名称和日期(如果落在相同的时间间隔内)

所需的输出如下:

Name   Date    Quantity
Apple  07/10/17  90
orange 07/10/17  20
Apple  07/17/17  30
orange 07/24/17  40

提前致谢

【问题讨论】:

    标签: python pandas date group-by


    【解决方案1】:

    首先转换列 date to_datetime 并减去一周,因为我们想要对日期前一周的总和,而不是该日期之前的一周。

    然后使用groupbyGrouper by W-MON 并聚合sum

    df['Date'] = pd.to_datetime(df['Date']) - pd.to_timedelta(7, unit='d')
    df = df.groupby(['Name', pd.Grouper(key='Date', freq='W-MON')])['Quantity']
           .sum()
           .reset_index()
           .sort_values('Date')
    print (df)
         Name       Date  Quantity
    0   Apple 2017-07-10        90
    3  orange 2017-07-10        20
    1   Apple 2017-07-17        30
    2  Orange 2017-07-24        40
    

    【讨论】:

    • 现在是正确的,只需要减去一个星期。检查编辑的答案。
    • 为什么要减一周?
    • @Lobstw 如果我没记错,那是因为 W-MON 是如何工作的,如果 label='left' 没有指定 W-MON 将得到前一周的总和,这不是通常情况下。相关问:stackoverflow.com/questions/49544421/…
    • 我刚刚检查了一下,与在 pd.Grouper 的参数上添加 label='left' 相同减去 7 天。
    • “W-MON”标识符对我来说是灵丹妙药。在我的数据中,每周从星期二开始......
    【解决方案2】:

    让我们将groupbyresampleW-Monsum 一起使用:

    df.groupby('Name').resample('W-Mon', on='Date').sum().reset_index().sort_values(by='Date')
    

    输出:

         Name       Date  Quantity
    0   Apple 2017-07-17        90
    3  orange 2017-07-17        20
    1   Apple 2017-07-24        30
    2  Orange 2017-07-31        40
    

    【讨论】:

    • 感谢您的回复!但是当我使用您的代码时,它显示,TypeError:仅对 DatetimeIndex、TimedeltaIndex 或 PeriodIndex 有效,但有一个“索引”实例你知道为什么吗?谢谢
    • 是的,您需要将 data 列转换为 dtype 日期时间。使用 df['Date'] = pd.to_datetime(df['Date'])。
    • 对我不起作用。完整的示例代码将有助于重现。数量字段是否需要在代码中?
    • @MarkAndersen 如果您创建一个新问题并在此处粘贴带有完整代码和示例数据集的链接,我将尝试回答您的问题。
    【解决方案3】:

    首先将列日期转换为_datetime。这将从星期一开始按周分组。它将输出周数(但您可以在

    中更改查找

    http://strftime.org/

    df.groupby(['name', df['date'].dt.strftime('%W')])['quantity'].sum()
    

    输出:

    name    date
    apple   28      90
            29      30
    orange  28      20
            30      40
    

    【讨论】:

    • 一旦你越过年份界限就会失败,它会按周数 (0-52) 对所有内容进行分组。
    【解决方案4】:

    这会将前一个星期一的每一行分组(如果日期已经是星期一,则没有任何更改)。这具有按周分组的效果:

    import pandas as pd, datetime as dt
    
    # df = ...
    
    df['WeekDate'] = df.apply(lambda row: row['Date'] - dt.timedelta(days=row['Date'].weekday()), axis=1)
    
    perweek = df['WeekDate'].groupby(df['WeekDate']).count()
    

    示例:

    Date           WeekDate
    2020-06-20     2020-06-15 <- monday
    2020-06-21     2020-06-15
    2020-06-24     2020-06-22 <- monday 
    2020-06-25     2020-06-22
    2020-06-26     2020-06-22
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-12
      • 2021-12-19
      • 1970-01-01
      • 1970-01-01
      • 2019-11-17
      • 2021-12-23
      • 2016-06-24
      • 2021-11-11
      相关资源
      最近更新 更多