групповой хэш дат по неделям / месяцам / годам - PullRequest
2 голосов
/ 08 апреля 2010

Учитывая, что этот хеш в ruby:

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}

где ключ - номер недели (месяц / год), а значение - совокупность рабочих часов в течение этой недели / месяца / года.

Я пишу небольшие рабочие часыприложение отслеживания и хотел бы сгруппировать эти данные.

Спасибо.

1 Ответ

4 голосов
/ 08 апреля 2010
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}}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...