我正在接收这种格式的数据:
{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 中做到这一点?
我正在接收这种格式的数据:
{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 中做到这一点?
这也可以
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 对象,请删除。
我会这样:
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}
如果只给你一个长字符串:
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)