如何按周对数据进行分组,并在没有数据时显示0

时间:2014-04-13 19:20:01

标签: ruby hash

我有一组数字附在日期上。我需要做的是把这些数字按日历周分组。一般来说,这种方法很好......除非有一周没有数字。

这是数字的哈希:

chart_numbers = {"2014-02-20"=>1, "2014-02-23"=>4, "2014-02-24"=>1, "2014-03-06"=>1, "2014-03-14"=>3, "2014-03-15"=>1, "2014-03-17"=>1, "2014-03-20"=>1, "2014-03-21"=>1, "2014-03-24"=>1, "2014-03-25"=>1, "2014-03-28"=>1, "2014-04-05"=>1, "2014-04-07"=>1}

以下是“周”时间戳(这些用于javascript图表库)。如您所见,有9个时间戳。

chart_weekly_timestamps = [1392595199, 1393199999, 1393804799, 1394409599, 1395014399, 1395619199, 1396223999, 1396828799, 1397433599]

最后,这是代码chart_numbers并将其汇总到日历周。

chart_week = Hash[ chart_numbers.map { |h, v| [h, v] } ].group_by { |h, v| Date.parse(h).cweek }.values.map{ |v| v.sum { |vv| vv.last } }.map{ |v| v.round(0) }  %>

该输出是:[5, 1, 1, 4, 3, 3, 1, 1]

问题出在哪里。该阵列中只有8个项目。但是我需要将它与上面的时间戳匹配,它有9个数组项。

所以我需要做的是当一周没有数据时,我需要将0显示为数组项。

2 个答案:

答案 0 :(得分:0)

这是构建所需数组的一种方法。

<强>代码

require 'date'

a = chart_numbers.map { |d,n| [Date.parse(d).cweek, n] }
h = (a.min_by(&:first).first..(a.max_by(&:first).first)).each_with_object({}) \
      { |(w,_),h| h[w] = 0 }
a.each { |w,n| h[w] += n }    
h.values

对于1.9之前的Ruby版本,将.sort添加到最后一行的末尾。

<强>解释

我修改了chart_numbers中的最后一个日期以生成无人任职的一周 并且还将偏移量为7的日期移至偏移量1,因此不会对它们进行排序。

chart_numbers =
  {"2014-02-20"=>1, "2014-03-20"=>1, "2014-02-23"=>4, "2014-02-24"=>1,
   "2014-03-06"=>1, "2014-03-14"=>3, "2014-03-15"=>1, "2014-03-17"=>1, 
   "2014-03-21"=>1, "2014-03-24"=>1, "2014-03-25"=>1, "2014-03-28"=>1,
   "2014-04-05"=>1, "2014-04-17"=>1}

将日期转换为星期,将chart_numbers转换为数组。

a = chart_numbers.map { |d,n| [Date.parse(d).cweek, n] }
  #=> [[8 , 1], [12, 1], [8 , 4], [9 , 1], [10, 1], [11, 3], [11, 1],
  #    [12, 1], [12, 1], [13, 1], [13, 1], [13, 1], [14, 1], [16, 1]]

注意没有第15周。现在使用8到16之间的键创建一个哈希值,所有值都为零。

h = (a.min_by(&:first).first..(a.max_by(&:first).first)).each_with_object({}) \
      { |(w,_),h| h[w] = 0 }
  #=> {8=>0, 9=>0, 10=>0, 11=>0, 12=>0, 13=>0, 14=>0, 15=>0, 16=>0}

添加原始哈希值:

a.each { |w,n| h[w] += n }

所以现在

h #=> {8=>5, 9=>1, 10=>1, 11=>4, 12=>3, 13=>3, 14=>1, 15=>0, 16=>1}

检索哈希值:

h.values
  #=> [5, 1, 1, 4, 3, 3, 1, 0, 1]

答案 1 :(得分:-1)

我最近发布了一个gem OrderedWeek,它将一组天数作为一个单元来处理。带上一只雄鹅。我也喜欢它的一些反馈。