Да, вам вообще не нужно разбирать даты, если они отформатированы одинаково. Знание ваших данных - один из самых мощных инструментов, которые вы можете иметь.
Если строки даты и времени все в одном и том же формате (гггг-мм-дд ЧЧ: ММ: СС), вы можете сделать что-то вроде
data_array.group_by{|datetime| datetime[0..9]}
Это даст вам хэш, такой как строки даты в качестве ключей и массив дат в качестве значений
{
"2007-05-06" => [...],
"2007-05-07" => [...],
...
}
Таким образом, вы должны получить длину каждого массива
data_array.group_by{|datetime| datatime[0..9]}.each do |date_string, date_array|
puts "#{date_string} occurred #{date_array.length} times."
end
Конечно, этот метод тратит память на массивы дат, когда они вам не нужны.
так как насчет
Более эффективный метод памяти
date_counts = {}
date_array.each do |date_string|
date = date_string[0..9]
date_counts[date] ||= 0 # initialize count if necessary
date_counts[date] += 1
end
Вы получите хеш со строками даты в качестве ключей и счетчиками в качестве значений
{
"2007-05-06" => 123,
"2007-05-07" => 456,
...
}
Собираем все вместе
date_counts = {}
date_array.each do |date_string|
date = date_string[0..9]
date_counts[date] ||= 0 # initialize count if necessary
date_counts[date] += 1
end
Date.parse('2007-03-23').upto Date.parse('2011-10-06') do |date_to_count|
puts "#{date_to_count} occurred #{date_counts[date_to_count.to_s].to_i} times."
end