You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 10:47:44