0

我正在接收这种格式的数据:

{2013-09-13 22:55:56 UTC=>1, 2013-09-15 13:14:19 UTC=>1, 2013-09-16 13:05:39 UTC=>1, 2013-09-16 19:12:44 UTC=>1}

我每天都需要group他们,到这个形状:

{2013-09-13=>1, 2013-09-15=>1, 2013-09-16=>2}

如何在 Ruby 中做到这一点?

4

3 回答 3

2

这也可以

 hsh = {"2013-09-13 22:55:56 UTC"=>1, "2013-09-15 13:14:19 UTC"=>1, "2013-09-16 13:05:39 UTC"=>1, "2013-09-16 19:12:44 UTC"=>1}

 hsh.inject(Hash.new(0)) {|h,(k,v)| h[k.to_date.to_s] += v; h}
 # => {"2013-09-13"=>1, "2013-09-15"=>1, "2013-09-16"=>2} 

.to_s如果您希望键是 Date 对象,请删除。

于 2013-09-18T18:59:20.323 回答
0

我会这样:

require 'date'

hsh = {'2013-09-13 22:55:56 UTC'=>1, '2013-09-15 13:14:19 UTC'=>1, '2013-09-16 13:05:39 UTC' =>1, '2013-09-16 19:12:44 UTC'=>1}

hsh.map{|k,v| Date.parse(k).to_s}.each_with_object(Hash.new(0)){|a,h| h[a]+=1 }
# => {"2013-09-13"=>1, "2013-09-15"=>1, "2013-09-16"=>2}
hsh.each_with_object(Hash.new(0)){|(k,_),h| h[Date.parse(k).to_s]+=1 }
# => {"2013-09-13"=>1, "2013-09-15"=>1, "2013-09-16"=>2}
于 2013-09-18T18:46:12.443 回答
0

如果只给你一个长字符串:

str = "2013-09-13 22:55:56 UTC=>1, 2013-09-15 13:14:19 UTC=>1,
2013-09-16 13:05:39 UTC=>1, 2013-09-16 19:12:44 UTC=>1"

这会起作用:

result = [] 
str.scan(/\d\d\d\d-\d\d-\d\d/).group_by {|i| i}.each {|key,value| result << "#{key}=>#{value.size.to_s}"}
result

可以换成group_by {|i| i}...group_by(&:dup)

于 2013-09-18T21:28:12.147 回答