【问题标题】:How group ruby literal hash by year/moth and sum values如何按年/月和总和值对 ruby​​ 文字散列进行分组
【发布时间】:2020-11-05 16:09:48
【问题描述】:

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

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(:+)我可以得到总值,但我需要逐年逐月。

【问题讨论】:

    标签: ruby-on-rails ruby ruby-hash


    【解决方案1】:

    首先我们需要把它分成几个月。这可以使用.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
    }
    

    【讨论】:

      【解决方案2】:

      您可以通过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.to_date.strftime('%Y-%m')代替k[0, 7]

      【讨论】:

        猜你喜欢
        • 2021-05-17
        • 2020-03-22
        • 2013-02-12
        • 1970-01-01
        • 2020-06-27
        • 1970-01-01
        • 2018-01-07
        • 2019-04-17
        • 1970-01-01
        相关资源
        最近更新 更多