2010-04-08 2 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

Смежные вопросы