Pandas每周分组

uinbv5nw  于 2022-12-21  发布在  其他
关注(0)|答案(6)|浏览(205)

我有这样的数据框架:

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
dsf9zpds

dsf9zpds1#

首先,转换列dateto_datetime并减去一周,因为我们需要该日期前一周的总和,而不是该日期前一周的总和。
然后通过W-MON使用groupbyGrouper,并聚合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
92dk7w1h

92dk7w1h2#

让我们将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
dddzy1tm

dddzy1tm3#

首先将列date转换为_datetime。这将从Mondays开始按周分组。它将输出周数(但您可以在中查找更改
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
yqhsw0fo

yqhsw0fo4#

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

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
whlutmcx

whlutmcx5#

你已经收到了很多好答案,这个问题也很老了,但是,考虑到一些解决方案使用了过时的函数,我遇到了同样的问题,找到了一个不同的解决方案,我认为这对分享它的人可能会有帮助。
根据您提议的 Dataframe :

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

我们必须将'Date'中的值转换为Pandas' Datetime,因为它们现在是字符串。
然后我们可以使用Series的 dt 属性,该属性允许我们处理 * DateTime类 * 序列并提取信息。

df['Date'] = pd.to_datetime(df['Date'], format='%m/%d/%y')

通过DateTime格式,我们可以使用dt参数来提取与日期相关的周数。为了不丢失任何信息,我倾向于添加一个包含周数的新列。一旦检索到周数,我们就可以按该周分组。

df['WeekNumber'] = df['Date'].dt.isocalendar().week
df.groupby(['Name', 'WeekNumber']).sum()

Name    WeekNumber  
Apple   28  90
        29  30
Orange  28  20
        30  40
小问题:如果我们考虑不同的年份呢

可能会有这样的情况,我们的数据有一个年份范围,在这种情况下,我们不能只考虑星期(否则我们会把一年的数据和另一年的数据混淆),所以从isocalendar()中提取年份列也是有用的。

df['year'] = df['Date'].dt.isocalendar().year
df.groupby(['Name', 'WeekNumber', 'year']).sum()

Name    WeekNumber  year    Quantity
Apple   28          2017    90
        29          2017    30
Orange  28          2017    20
        30          2017    40
uqdfh47h

uqdfh47h6#

可以使用to_period方法将日期截断为一周的第一天(如果使用周期M,则为一个月):

df["Week"] = df["Date"].dt.to_period("W").dt.to_timestamp()
df.groupby(["Name", "Week")).sum()

相关问题