2014-04-13 52 views
0

我有一組附加日期的數字。我需要做的是將這些數字按日曆周分組。一般來說,這很好,除非有一週沒有數字。如何按星期對數據進行分組,並在沒有數據時顯示0

這裏的數字的散列:

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作爲數組項目。

+1

和從數據庫中檢索數據?另外,你是否知道'Hash [chart_numbers.map {| h,v | [h,v]}]'是一種浪費,因爲它所做的一切都會讓你回到原來的散列? –

+0

@Cupcake:是的......雖然我從中抽取這些數據的散列被其他一些事情所使用,所以修改查詢並不是那麼方便。 – Shpigford

+0

'chart_weekly_timestamps'與'chart_numbers'有什麼關係? –

回答

-1

我最近發佈了一個gem OrderedWeek,它可以將天數組作爲一個單位處理。採取甘德。我也喜歡它的一些反饋。

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 

對於Ruby版本之前到1.9,添加.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} 

檢索哈希值:您使用Ruby on Rails

h.values 
    #=> [5, 1, 1, 4, 3, 3, 1, 0, 1] 
相關問題