首页 > 解决方案 > Ruby,如何减少字符串格式的日期数组,仅保留月份和数组索引

问题描述

我需要绘制一个图表,在 X 轴上我有日期......我有一个这样的数组......

data = ["2020-02-15",
 "2020-02-16",
 "2020-02-17",
 "2020-02-18",
 "2020-02-19",
 "2020-02-20",
 "2020-02-21",
 "2020-02-22",
 "2020-02-23",
 "2020-02-24",
 "2020-02-25",
 "2020-02-26",
 "2020-02-27",
 "2020-02-28",
 "2020-02-29" ... ]

该数组有大约 500 个元素...我无法绘制 500 个标签,我只需要月份。

我的标签有这种格式

g.labels = {0 => '2003', 2 => '2004', 4 => '2005', 6 => '2006'}

键是索引,值是月份。

所以我用

x = Hash[(0...data.size).zip data]

结果是

{0=>"2020-02-15",
 1=>"2020-02-16",
 2=>"2020-02-17",
 3=>"2020-02-18",
 4=>"2020-02-19",
 5=>"2020-02-20"}

现在我必须只保留一个月。因为第一个值是“2020-02-15”,所以我从 2 月 15 日开始,然后我必须保持 3 月 15 日,等等......

结果必须是

{0=>"February",
 30=>"March",
 61=>"April"...}

我能怎么做?

标签: ruby

解决方案


您可以使用正则表达式或仅使用 Date 类:

[8] pry(main)> h
=> {0=>"2020-02-15", 1=>"2020-02-16", 2=>"2020-02-17", 3=>"2020-02-18", 4=>"2020-02-19", 5=>"2020-02-20"}
[10] pry(main)> h.each do |k,v|
[10] pry(main)*   puts "date #{k} month number is #{Date.parse(v).month}"
[10] pry(main)* end
date 0 month number is 2
date 1 month number is 2
date 2 month number is 2
date 3 month number is 2
date 4 month number is 2
date 5 month number is 2

或按名称:

[11] pry(main)> h.each do |k,v|
[11] pry(main)*   puts "date #{k} month number is #{Date.parse(v).strftime("%B")}"
[11] pry(main)* end
date 0 month number is February
date 1 month number is February
date 2 month number is February
date 3 month number is February
date 4 month number is February
date 5 month number is February

由于您想使用数组 tou 不需要使用 has 表示法:

[18] pry(main)> h.values
=> ["2020-02-15", "2020-02-16", "2020-02-17", "2020-02-18", "2020-02-19", "2020-02-20"]
[19] pry(main)> h.values.map { |d| Date.parse(d).month }
=> [2, 2, 2, 2, 2, 2]

或者您可以映射散列并修改散列本身:

[20] pry(main)> h
=> {0=>"2020-02-15", 1=>"2020-02-16", 2=>"2020-02-17", 3=>"2020-02-18", 4=>"2020-02-19", 5=>"2020-02-20"}
[21] pry(main)> h.update(h){ |_,d| Date.parse(d).month }
=> {0=>2, 1=>2, 2=>2, 3=>2, 4=>2, 5=>2}
[22] pry(main)> h
=> {0=>2, 1=>2, 2=>2, 3=>2, 4=>2, 5=>2}

[24] pry(main)> h.transform_values! { |v| Date.parse(v).month }
=> {0=>2, 1=>2, 2=>2, 3=>2, 4=>2, 5=>2}

但我建议创建一个新的哈希

[26] pry(main)> h.transform_values { |v| Date.parse(v).month }
=> {0=>2, 1=>2, 2=>2, 3=>2, 4=>2, 5=>2}
[27] pry(main)> h
=> {0=>"2020-02-15", 1=>"2020-02-16", 2=>"2020-02-17", 3=>"2020-02-18", 4=>"2020-02-19", 5=>"2020-02-20"}

最后是你的结果:

[28] pry(main)> h.transform_values { |v| Date.parse(v).strftime("%B") }
=> {0=>"February", 1=>"February", 2=>"February", 3=>"February", 4=>"February", 5=>"February"}

您还可以过滤哈希值:

[29] pry(main)> h.select { |k,v| Date.parse(v).day == 15 }.transform_values { |v| Date.parse(v).strftime("%B") }
=> {0=>"February"}

推荐阅读