2010-04-08 99 views
2

鑑於這種散列紅寶石:組哈希

h={ 
2010-03-01=>2 
2010-03-02=>4 
2010=03-03=>1 
.. 
.. 
n days with working hours 
} 

其中散列鍵是日期和哈希值是一個整數,我怎麼改變這個哈希到一個新的散列結果,其中密鑰是星期/月/年(聚合)?

讓我告訴與周爲例,最終的結果應該是這樣的:

h_weeks={7=>36, 8=>42, 9=>34 ..,..,n} 

伴月:

h_months={1=>170, 2=>180, 3=>146} 

多年:

h_years={2009=>950, 2010=>446} 

,其中關鍵是週數(月/年),價值是本週/月/年內的工作時間總和。

我正在寫一個小型的工作時間跟蹤應用程序,並想分組這些數據。

謝謝。

回答

4
h = { 
    Date.parse('2010-04-02') => 3, 
    Date.parse('2010-05-03') => 5, 
    Date.parse('2009-04-03') => 6 
} 
by_year = Hash.new(0) 
by_month = Hash.new(0) 
by_week = Hash.new(0) 
h.each{|d,v| 
    by_year[d.year] += v 
    by_month[d.month] += v 
    by_week[d.cweek] += v 
} 

,或者稍微更奇特:

aggregates = {} 
h.each{|d,v| 
    [:year, :month, :cweek].each{|period| 
    aggregates[period] ||= Hash.new(0) 
    aggregates[period][d.send(period)] += v 
    } 
} 
p aggregates 
#=>{:year=>{2010=>8, 2009=>6}, :month=>{4=>9, 5=>5}, :cweek=>{13=>3, 18=>5, 14=>6}} 
+0

姆拉登,你救了我的一天,謝謝。 – Valentin 2010-04-08 13:09:21