你可以使用下面的基本语法在pandas DataFrame中按周分组行
#convert date column to datetime and subtract one week
df['date'] = pd.to_datetime(df['date']) - pd.to_timedelta(7, unit='d')
#calculate sum of values, grouped by week
df.groupby([pd.Grouper(key='date', freq='W')])['values'].sum()
这个特殊的公式在日期列中按周对行进行分组,并计算DataFrame中数值列的数值之和。
下面的例子展示了如何在实践中使用这种语法。
例子:如何在Pandas中按周分组
假设我们有如下的pandas DataFrame,显示某个公司在不同日期的销售额。
import pandas as pd
#create DataFrame
df = pd.DataFrame({'date': pd.date_range(start='1/5/2022', freq='D', periods=15),
'sales': [6, 8, 9, 5, 4, 8, 8, 3, 5, 9, 8, 3, 4, 7, 7]})
#view DataFrame
print(df)
date sales
0 2022-01-05 6
1 2022-01-06 8
2 2022-01-07 9
3 2022-01-08 5
4 2022-01-09 4
5 2022-01-10 8
6 2022-01-11 8
7 2022-01-12 3
8 2022-01-13 5
9 2022-01-14 9
10 2022-01-15 8
11 2022-01-16 3
12 2022-01-17 4
13 2022-01-18 7
14 2022-01-19 7
相关的: 如何在Pandas中创建一个日期范围
我们可以使用下面的语法来计算按周分组的销售额之和:
#convert date column to datetime and subtract one week
df['date'] = pd.to_datetime(df['date']) - pd.to_timedelta(7, unit='d')
#calculate sum of values, grouped by week
df.groupby([pd.Grouper(key='date', freq='W')])['sales'].sum()
date
2022-01-02 32
2022-01-09 44
2022-01-16 18
Freq: W-SUN, Name: sales, dtype: int64
下面是解释输出的方法:
- 在1/2/2022后一天开始的一周内,总共有32 笔销售
- 从2022年1月9日开始的一周内,共有44 笔销售
- 从2022年1月16日开始的一周内,共有18 笔销售
值得注意的是,在默认情况下,pandas假设一周从周日的第二天开始(W-SUN)
然而,根据文档,你可以改变Freq的这个值。
例如,如果你想让每个星期从星期一的后一天开始(即星期二),你可以指定Freq=W-MON。
我们可以使用类似的语法来计算按周分组的销售值的最大值。
#convert date column to datetime and subtract one week
df['date'] = pd.to_datetime(df['date']) - pd.to_timedelta(7, unit='d')
#calculate max of values, grouped by week
df.groupby([pd.Grouper(key='date', freq='W')])['sales'].max()
date
2022-01-02 9
2022-01-09 9
2022-01-16 7
Freq: W-SUN, Name: sales, dtype: int64
以下是如何解释输出结果的:
- 从1/2/2022后一天开始的一周内,单日的最大销售额为9
- 在2022年1月9日之后的一周内,单日最大销售额为9
- 2022年1月16日之后的一天开始的一周内,单日最大销售额为7
注意:你可以在这里找到pandas中groupby操作的完整文档。
其他资源
下面的教程解释了如何在pandas中执行其他常见的操作: