ruby - 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"...}
我能怎么做?
解决方案
您可以使用正则表达式或仅使用 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"}
推荐阅读
- javascript - 创建对象时未设置类属性
- python - graphlab 错误没有名为“依赖项”的模块
- c# - 在 WPF 中将子对象设置为以编程方式创建的对象
- jitsi-meet - 如何根据需要或认为合适在 Jitsi 中添加新功能
- python - KivyMD MDTabs 无法处理
- javascript - Javascript - 文本字段不应自动填充保存的用户名
- python - 我需要帮助调试 Pub/Sub Google Cloud Functions
- python - UnboundLocalError:分配前引用的局部变量“batch_outputs”
- excel - 将 VBA 宏应用于多行
- html - 如何按数字升序对 SelectListItem 值进行排序