2010-04-08 3 views
2

Compte tenu de ce hachage en Ruby:hachage groupe de dates par semaine/mois/année

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

où la clé de hachage est une valeur de date et hachage est un entier, comment puis-je transformer ce hachage dans un nouveau hachage où les clés sont des semaines/mois/années (avec agrégation)?

Permettez-moi de montrer un exemple avec des semaines, le résultat final devrait ressembler à:

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

avec mois:

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

avec les années:

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

où la clé est un numéro de semaine (mois/année), et la valeur est un total des heures de travail dans cette semaine/mois/année. Je suis en train d'écrire une petite application de suivi des heures de travail et je voudrais regrouper ces données.

Merci.

Répondre

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 
} 

ou, un peu plus exotiques:

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

Mladen, vous a sauvé ma journée, je vous remercie. – Valentin