

Rubyで日付でGroupした下記のようなデータがあります。

[code]

    {"[2021, 12, 28, 1]":2,
     "[2021, 12, 28, 2]":2,
     "[2021, 12, 28, 3]":2,
     "[2021, 12, 28, 4]":4,
     "[2021, 12, 28, 7]":2,
     "[2021, 12, 28, 5]":1}
    
[/code]

このデータを下記のように変換したいのですがスマートに変換できる良いアルゴリズムや手法がありましたら、ご教授いただけますと幸いです。

[code]

    {["2021年12月28日", 1]:2,
     ["2021年12月28日", 2]:2,
     ["2021年12月28日", 3]:2,
     ["2021年12月28日", 4]:4,
     ["2021年12月28日", 7]:2,
     ["2021年12月28日", 5]:1}
    
[/code]

よろしくお願いいたします。


CC BY-SA 4.0
2021-12-28T04:26:35.330
85367
2021-12-29T07:58:22.967
2021-12-28T07:06:53.830
41000
41000
question
ruby array
Rubyの配列操作についての質問


２番目のブロック

[code]

    {["2021年12月28日", 1]:2,
     ["2021年12月28日", 2]:2,
     ["2021年12月28日", 3]:2,
     ["2021年12月28日", 4]:4,
     ["2021年12月28日", 7]:2,
     ["2021年12月28日", 5]:1}
    
[/code]

は厳密にはRubyの正しい文法ではないと思うのですが、下記のHashを意味しているのであろうと仮定します。

[code]

    {["2021年12月28日", 1] => 2,
     ["2021年12月28日", 2] => 2,
     ["2021年12月28日", 3] => 2,
     ["2021年12月28日", 4] => 4,
     ["2021年12月28日", 7] => 2,
     ["2021年12月28日", 5] => 1}
    
[/code]

質問に書かれたことを、素直に実現しようとすると例えばこんな感じではないでしょうか。

[code]

    require 'date'
    
    a ={"[2021, 12, 28, 1]":2,
        "[2021, 12, 28, 2]":2,
        "[2021, 12, 28, 3]":2,
        "[2021, 12, 28, 4]":4,
        "[2021, 12, 28, 7]":2,
        "[2021, 12, 28, 5]":1}
        
    a2 = a.transform_keys do |k|
      e = eval(k.to_s)
      raise "#{e}" if e.size != 4 # 念のためチェック
      n = e.pop
      d = Date.new(*e)
      [d.strftime("%Y年%m月%d日"), n]
    end
    
[/code]

でも、質問のような変形をする必要性が出てくる状況は、少し不自然という気します。なので、この変形をしなくても済む方向性で見直した方がいいかもしれません。


CC BY-SA 4.0
2021-12-29T07:39:30.090
85394
2021-12-29T07:45:48.397
2021-12-29T07:45:48.397
32772
32772
85367
answer

[code]

    a = {
      "[2021, 12, 28, 1]":2, "[2021, 12, 28, 2]":2, "[2021, 12, 28, 3]":2,
      "[2021, 12, 28, 4]":4, "[2021, 12, 28, 7]":2, "[2021, 12, 28, 5]":1
    }
    
    b = a.transform_keys{|k|
          *i, n = k.to_s.scan(/\d+/)
          [i.zip("年月日".chars).join, n.to_i]}
    
    p b
    
    #
    {
      ["2021年12月28日", 1]=>2,
      ["2021年12月28日", 2]=>2,
      ["2021年12月28日", 3]=>2,
      ["2021年12月28日", 4]=>4,
      ["2021年12月28日", 7]=>2,
      ["2021年12月28日", 5]=>1
    }
    
[/code]


CC BY-SA 4.0
2021-12-29T07:58:22.967
85395
2021-12-29T07:58:22.967
47127
85367
answer