如何在Pandas DataFrame中按周分组统计累计距离超15的周数
解决按周统计距离超标的问题
我来帮你搞定这个问题!你其实完全不用把问题复杂化,核心就是找对分组的方式,剩下的统计就很简单了。
首先,你的DataFrame里的start列是带UTC时区的datetime,而且已经按升序排好,这很好——我们直接用这个列来分组就行,甚至不需要提前创建day_of_week列(当然留着也不影响)。
核心思路
要按周分组,必须结合年份+周数来分组(不然不同年份的第1周会被合并成一组,结果就错了)。同时因为你定义dayofweek=0是周一,所以我们要选以周一为周起始的分组方式,和你的星期定义对齐。
方案一:用strftime分组(直观易懂)
def count_weeks_over_15(df): # 按UTC时间的年份 + 周数(%W代表周一为周起始)分组,计算每周距离总和 weekly_distance = df.groupby( [df['start'].dt.year, df['start'].dt.strftime('%W')] )['distance'].sum() # 统计总和超过15的周的数量 return (weekly_distance > 15).sum() # 调用函数,传入你的DataFrame over_limit_count = count_weeks_over_15(format_datetime_df) print(over_limit_count)
方案二:用isocalendar分组(更规范的ISO周)
Pandas的isocalendar会返回标准的ISO周信息(周一为周起始,和你的dayofweek定义完全匹配),用这个分组更严谨:
def count_weeks_over_15(df): # 提取年份和ISO周数作为分组键 weekly_groups = df['start'].dt.isocalendar()[['year', 'week']] # 分组求和并统计超标数量 weekly_distance = df.groupby(weekly_groups)['distance'].sum() return (weekly_distance > 15).sum()
为什么你的例子会分成两组?
你提到的day_of_week序列3、3、5、1、5,对应的日期应该分属两个不同的周:
- 前三个值(3=周四、3=周四、5=周六)属于同一个周(周一到周日)
- 后两个值(1=周二、5=周六)属于下一个周
用上面的分组方式,会自动把它们分成两组,分别计算总和后判断是否超过15,完全符合你的需求。
额外说明
- 因为
start列带UTC时区,Pandas的dt属性会自动基于UTC时间计算年份和周数,不用担心时区偏差 - 你之前已经按
start升序排序,这对分组没有影响——groupby会自动把同组的数据归到一起,不管原始顺序
内容的提问来源于stack exchange,提问作者MatthewS
相关产品推荐
相关产品推荐

