234100.14176395803, "2020-11-07 00:0-6ren">
gpt4 book ai didi

ruby-on-rails - 如何按年/月和总和值对 ruby​​ 文字散列进行分组

转载 作者:行者123 更新时间:2023-12-04 08:38:05 25 4
gpt4 key购买 nike

我有以下哈希值,我想按年/月分组并对值求和:

range = {
"2020-11-06 00:00:00 +0000" => 234100.14176395803,
"2020-11-07 00:00:00 +0000" => 57731.63072153537,
"2020-11-08 00:00:00 +0000" => 68903.8902730576,
"2020-11-09 00:00:00 +0000" => 180971.98008691627,
........
"2021-02-01 00:00:00 +0000" => 169004.96299567595,
"2021-02-02 00:00:00 +0000" => 183363.9687217272,
"2021-02-03 00:00:00 +0000" => 200400.2505103338
}

我能够做组: hash = Hash[range.collect { |k,v| [k.to_date.strftime("%Y-%m"), v]}]但我无法得到值的总和,值结果和散列收集只是最后一天。
{
"2020-11" => 155346.83103528828,
"2020-12" => 175424.41029800082,
"2021-01" => 55366.44438577791,
"2021-02" => 200400.2505103338
}
使用reduce方法 hash.values.reduce(:+)我可以获得总值(value),但我逐月需要它们。

最佳答案

首先,我们需要将其分组为几个月。这可以使用 .group_by 最简单地完成。 .

hash = Hash[range.group_by { |k,_v| k.to_date.strftime("%Y-%m")}]
使用您已经提供的相同代码,只需 group_by而不是 collect .
{
"2020-11"=>[
["2020-11-06 00:00:00 +0000", 234100.14176395803],
["2020-11-07 00:00:00 +0000", 57731.63072153537],
["2020-11-08 00:00:00 +0000", 68903.8902730576],
["2020-11-09 00:00:00 +0000", 180971.98008691627]
],
"2021-02"=>[
["2021-02-01 00:00:00 +0000", 169004.96299567595],
["2021-02-02 00:00:00 +0000", 183363.9687217272],
["2021-02-03 00:00:00 +0000", 200400.2505103338]
]
}
现在我们需要 sum (相当于 reduce(:+) 你尝试了一些好处)它们在一起。我们需要修改散列的每个值,并对值中每个元素的最后一个元素求和。
hash.transform_values {|a| a.sum(&:last) }
返回
{
"2020-11" => 541707.6428454673,
"2021-02" => 552769.1822277369
}

关于ruby-on-rails - 如何按年/月和总和值对 ruby​​ 文字散列进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64700975/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com