我正在做最上面的工作,有一项任务是,给出一个日期时间列表,例如:
dates = [
"11/12/08 15:00", "11/12/08 16:05", "11/12/08 17:18", "11/13/08 1:32",
"11/13/08 16:40", "11/13/08 18:17", "11/13/08 21:19", "11/16/08 11:44",
"11/16/08 13:54", "11/16/08 20:20", "11/17/08 19:41", "11/19/08 21:56",
"11/20/08 16:25", "11/23/08 20:44"
]找出一天中最多人注册的时间。使用注册日期和时间,我们想知道什么是高峰注册时间。
我想知道公式是什么,或者一步一步地计算它。顺便说一句,这是红宝石
谢谢!
发布于 2020-11-17 12:58:34
有很多方法可以解决这个问题。这里有一个:将每个日期映射到只包含年份/月/日/小时(即不包括分钟或秒)的字符串,然后tally结果。然后,您可以查看最常见的结果(或者其他您想知道的关于聚合数据的信息)。
dates
.map { |date| DateTime.strptime(date, '%m/%d/%Y %H:%M') }
.tally发布于 2020-11-17 13:13:28
如果您的约会格式总是相同的,并且您想要一天中最常见的时间(不关心有多少天),
那你就可以
dates.group_by {|s| s.match(/\d{1,2}\/\d{1,2}\/\d{1,2} (\d{1,2}):\d{1,2}/)[1]}.max_by {|k,v| v.size}[0]
这实际上只是循环你所有的日期,把时间用同一个时间组合在一起,然后选出最常见的时间。
编辑:或者使用汤姆·洛德的答案中的DateTime让它更加可读性:
dates.group_by {|date| DateTime.strptime(date, '%m/%d/%Y %H:%M').hour }.max_by {|k,v| v.size}[0]
发布于 2020-11-17 19:55:15
我想你希望找到一天中有最多的注册时间,接管所有的日期在dates。
步骤1:使用 Enumerable#tally 将小时数映射到注册人数
h = dates.map { |date| date[/\d+(?=:)/] }.tally
#=> {"15"=>1, "16"=>3, "17"=>1, "1"=>1, "18"=>1, "21"=>2, "11"=>1,
# "13"=>1, "20"=>2, "19"=>1}正则表达式/\d+(?=:)/读到:“匹配一个或多个(+)数字(\d),后面紧跟一个冒号,(?=:)是一个正前瞻”。
中间计算是:
dates.map { |date| date[/\d+(?=:)/] }
#=> ["15", "16", "17", "1", "16", "18", "21", "11", "13", "20",
# "19", "21", "16", "20"]tally在Rubyv.2.7中首次亮相。若要支持早期版本,请将tally替换为
each_with_object(Hash.new(0)) { |s,h| h[s] += 1 }步骤2:使用 Enumerable#max 按小时确定最大注册人数
peak_nbr = h.max_by(&:last).last
#=> 3 这表明每小时注册的最大人数是3。
中间计算是:
h.max_by(&:last)
#=> ["16", 3]如果一个人只想要有最大数量的注册人的任何一个小时(即使他们是与拥有最多注册人的小时相联系),你可以简单地停止这个中间计算。
步骤3:使用 Hash#select 确定注册人的时间
h.select { |_hr,nbr| nbr == peak_nbr }
#=> {"16"=>3}这表明"16"是拥有最大注册人数(3)的唯一一个小时。如果也有3注册人在,比如说,小时"12",这个散列将是{"16"=>3, "12"=>3}。要获得高峰时间,请写
h.select { |_hr,nbr| nbr == peak_nbr }.keys
#=> ["16"]我编写了第一个块变量_hr,这是向读取器发出的下划线信号,即在块计算中不使用该块变量。这是常见的做法(就像使用_作为变量名一样)。
https://stackoverflow.com/questions/64875661
复制相似问题