如何使用Pandas按周频率对日期分组并求和count1、count2?
Pandas按日/周聚合求和解决方案
我来帮你搞定这个按时间频率聚合求和的问题,你遇到的报错大概率是因为日期列格式不对,或者分组方式没选对,下面一步步来解决:
第一步:先确保日期列是datetime类型
这是最容易踩的坑!如果你的date列是字符串格式,Pandas根本没法识别成时间维度,分组肯定报错。先执行这行代码转换:
import pandas as pd # 转换date列为datetime类型 df['date'] = pd.to_datetime(df['date'])
按日求和的两种方法
方法1:用resample(推荐,更灵活)
不用修改原DataFrame的索引,直接指定on='date'参数即可:
# 按日对count1、count2求和 daily_sum = df.resample('D', on='date')[['count1', 'count2']].sum().reset_index()
'D'代表日频率,执行后会得到每天的求和结果,哪怕某天没有数据也会显示(值为0,如果你想过滤空值可以加.dropna())。
方法2:用groupby按日期分组
如果只需要有数据的日期求和,可以用这个:
daily_sum = df.groupby(df['date'].dt.date)[['count1', 'count2']].sum().reset_index()
按周求和的两种方法(重点解决你的报错)
按周分组需要注意一周的起始日,Pandas默认是周日作为一周开始,如果你需要周一作为起始,要额外指定。
方法1:resample指定周频率
同样不用改索引,直接用on='date':
# 默认周日为一周起始,结果的date列是每周日的日期 weekly_sum = df.resample('W', on='date')[['count1', 'count2']].sum().reset_index() # 如果需要周一作为一周起始,用'W-MON' weekly_sum_monday = df.resample('W-MON', on='date')[['count1', 'count2']].sum().reset_index()
比如你的数据里,2019-12-09到2019-12-11属于第一周(周日起始的话,这周截止到12-15),2019-12-18到12-21属于第二周,求和结果会自动分组计算。
方法2:groupby按年+周数分组(避免跨年周混淆)
如果你的数据跨年度,直接按周数分组会把不同年份的同周数合并,所以推荐按年+周数组合分组:
# 按年和ISO周数分组求和 weekly_sum = df.groupby( [df['date'].dt.year, df['date'].dt.isocalendar().week] )[['count1', 'count2']].sum().reset_index() # 可选:把年和周转换成直观的周起始日期(比如周一) weekly_sum['week_start_date'] = pd.to_datetime( weekly_sum.apply(lambda x: f"{x['year']}-W{x['week']}-1", axis=1), format="%Y-W%W-%w" )
常见报错排查
- 如果还是报错,先检查
df['date']的类型:执行print(df['date'].dtype),如果显示object说明没转成datetime,再重新执行第一步的转换。 - 用resample时如果报错"Only valid with DatetimeIndex, TimedeltaIndex or PeriodIndex",说明你没指定
on='date',也没把date设为索引,二选一即可。
内容的提问来源于stack exchange,提问作者Hisham
相关产品推荐
相关产品推荐

