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

Ruby如何按created_at字段将调查回复分组为以周一为起点的2周间隔

实现方案(Ruby/Rails 环境适用)

步骤1:确定时间边界

先拿到所有调查回复的时间范围,计算首个分组的起始日期(最早时间所在周的周一):

# 提取所有回复的日期(空数据直接返回空结果)
all_dates = SurveyResponse.pluck(:created_at).map(&:to_date)
return {} if all_dates.empty?

# 计算首个分组起点:最早日期所在周的周一
start_date = all_dates.min.beginning_of_week(:monday)

步骤2:按两周间隔分组统计

通过计算每条记录与起始日的周数差,自动归属到对应的两周区间:

grouped_records = SurveyResponse.all.group_by do |item|
  current_date = item.created_at.to_date
  # 计算当前日期距离起始日的周数,按2周取整得到区间偏移
  weeks_offset = (current_date - start_date).to_i / 7
  interval_weeks = (weeks_offset / 2) * 2
  # 返回当前记录所属区间的起始日期
  start_date + interval_weeks.weeks
end

步骤3:转换为要求的输出格式

把日期key转为月/日格式,统计每个区间的回复数量:

result = grouped_records.transform_keys { |d| d.strftime("%-m/%-d") }
                        .transform_values(&:count)

输出和你要求的格式完全一致:

{"10/1" => 4, "10/15" => 6, "10/29" => 3}

补充说明

如果是纯Ruby环境没有Rails的beginning_of_week方法,可以用以下代码手动计算周一:

def get_monday_of_week(date)
  date - (date.wday - 1) % 7
end
# 替换之前的start_date计算逻辑即可
start_date = get_monday_of_week(all_dates.min)

内容的提问来源于stack exchange,提问作者nm12

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 23:45:03