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
相关产品推荐
相关产品推荐

