我有一组数字附在日期上。我需要做的是把这些数字按日历周分组。一般来说,这种方法很好......除非有一周没有数字。
这是数字的哈希:
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
显示为数组项。
答案 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,它将一组天数作为一个单元来处理。带上一只雄鹅。我也喜欢它的一些反馈。