我有一个哈希,其键是以"%W %Y"
格式表示日期的字符串:
{"11 2016"=>255000.0, "12 2016"=>255000.0, "13 2016"=>255000.0, "14 2016"=>255000.0, "15 2016"=>255000.0, "16 2016"=>255000.0, "17 2016"=>255000.0, "18 2016"=>255000.0, "19 2016"=>255000.0, "20 2016"=>255000.0}
我想将密钥转换为月/年格式以获得如下内容:
{"March 2016"=>255000.0, "March 2016"=>255000.0, "April 2016"=>255000.0, "April 2016"=>255000.0, "April 2016"=>255000.0, "May 2016"=>255000.0, "May 2016"=>255000.0, "May 2016"=>255000.0, "June 2016"=>255000.0, "June 2016"=>255000.0}
我试过了:
更新
def conv_to_month(hash)
dates_array = []
values = []
hash.each do |k, v|
date = Date.strptime(k, '%W %Y')
newdate = date.strftime('%B %Y')
puts newdate
dates_array << newdate
values << v
end
result = Hash[dates_array.zip(values)]
end
但是我收到了无效的日期错误,我不明白为什么。
答案 0 :(得分:3)
您可以通过strptime
解析日期字符串:
date = Date.strptime('11 2016', '%W %Y')
#=> #<Date: 2016-03-14>
并通过strftime
重新格式化生成的日期:
date.strftime('%B %Y')
#=> "March 2016"
但请注意,哈希只能包含一次密钥,因此您无法使用"March 2016"
的两个密钥(除非您启用compare_by_identity
) 。您可能希望使用数组,或者 - 或者 - 在打印字符串时使用给定的哈希并使用帮助器格式化字符串(格式通常与视图相关)。
答案 1 :(得分:0)
一种简单的方法是:
data = {"11 2016"=>255000.0, "12 2016"=>255000.0, "13 2016"=>255000.0, "14 2016"=>255000.0, "15 2016"=>255000.0, "16 2016"=>255000.0, "17 2016"=>255000.0, "18 2016"=>255000.0, "19 2016"=>255000.0, "20 2016"=>255000.0}
data.map {|k, v| month, year = k.split(' '); [[ Date::MONTHNAMES[month.to_i], year].join(' '), v]}.to_h
但在这种情况下,日期的第一部分必须正确对应月份数。像1将是1月,12将是12月。