簡體   English   中英

如何按年/月和總和值對 ruby​​ 文字散列進行分組

[英]How group ruby literal hash by year/moth and sum values

我有以下哈希值,我想按年/月分組並對值求和:

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]}] 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(:+)我可以獲得總值,但我逐月需要它們。

您可以通過each_with_object構建一個新的哈希:

range.each_with_object(Hash.new(0)) { |(k, v), h| h[k[0, 7]] += v }
#=> {"2020-11"=>541707.6428454672, ..., "2021-02"=>552769.1822277369}

除了k[0, 7]你也可以使用k.to_date.strftime('%Y-%m')

首先,我們需要將其分組為幾個月。 這可以使用.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
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM