大熊猫一周一周

Ram*_*Ram 27 python pandas

我有这个数据框:

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
Run Code Online (Sandbox Code Playgroud)

我想通过名称和日期汇总这个以获得数量总和详细信息:

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

数量:总和,如果两个或多个记录具有相同的名称和日期(如果是相同的间隔)

所需的输出如下:

Name   Date    Quantity
Apple  07/10/17  90
orange 07/10/17  20
Apple  07/17/17  30
orange 07/24/17  40
Run Code Online (Sandbox Code Playgroud)

提前致谢

jez*_*ael 50

首先转换列date to_datetime并减去一周.

然后使用groupbyGrouperW-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
Run Code Online (Sandbox Code Playgroud)

  • 为什么要减去一周? (7认同)
  • @Lobstw如果我没有记错,那是因为W-MON的工作方式,如果未指定label ='left',则W-MON将获得前一周的总和,通常情况并非如此。相关问题:/sf/ask/3468109501/ (2认同)
  • 如果您有日期时间值而不仅仅是日期,则减 7 不会正确工作。你需要减去6。 (2认同)

Sco*_*ton 9

让我们使用groupby,resample使用W-Monsum:

df.groupby('Name').resample('W-Mon', on='Date').sum().reset_index().sort_values(by='Date')
Run Code Online (Sandbox Code Playgroud)

输出:

     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
Run Code Online (Sandbox Code Playgroud)

  • 是的,您需要将“数据”列转换为数据类型日期时间。使用 df['Date'] = pd.to_datetime(df['Date'])。 (3认同)

And*_*reP 7

您已经收到了很多好的答案,并且问题已经很老了,但是,考虑到某些解决方案使用已弃用的函数,并且我遇到了同样的问题,并找到了一个不同的解决方案,我认为这可能对分享它的人有所帮助。

鉴于您提出的数据框:

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

Run Code Online (Sandbox Code Playgroud)

我们必须将“日期”中的值转换为 Pandas 的日期时间,因为它们现在是字符串。
然后我们可以使用 Series 的dt属性,它允许我们处理类似 DateTime 的系列并提取信息。

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

Run Code Online (Sandbox Code Playgroud)

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

df['Date'] = pd.to_datetime(df['Date'], format='%m/%d/%y')
Run Code Online (Sandbox Code Playgroud)
小问题:如果我们考虑不同年份怎么办?

可能存在这样的情况,我们的数据有一定的年份范围,在这种情况下,我们不能只考虑周(否则我们会将一年的数据混合到另一年),因此从其中提取年份列会很有用等历()。

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

Name    WeekNumber  
Apple   28  90
        29  30
Orange  28  20
        30  40
Run Code Online (Sandbox Code Playgroud)


LN_*_*N_P 5

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

http://strftime.org/

df.groupby(['name', df['date'].dt.strftime('%W')])['quantity'].sum()
Run Code Online (Sandbox Code Playgroud)

输出:

name    date
apple   28      90
        29      30
orange  28      20
        30      40
Run Code Online (Sandbox Code Playgroud)

  • 一旦跨越年份界限,此操作就会失败,它会按周数(0-52)对所有内容进行分组。 (3认同)
  • 通过将 .dt.strftime('%W') 更改为 .dt.strftime('%W %Y') 可以轻松解决此问题 (2认同)