首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >找出一天中最多人登记的时间

找出一天中最多人登记的时间
EN

Stack Overflow用户
提问于 2020-11-17 12:53:06
回答 3查看 85关注 0票数 0

我正在做最上面的工作,有一项任务是,给出一个日期时间列表,例如:

代码语言:javascript
复制
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"
]

找出一天中最多人注册的时间。使用注册日期和时间,我们想知道什么是高峰注册时间。

我想知道公式是什么,或者一步一步地计算它。顺便说一句,这是红宝石

谢谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-11-17 12:58:34

有很多方法可以解决这个问题。这里有一个:将每个日期映射到只包含年份/月/日/小时(即不包括分钟或秒)的字符串,然后tally结果。然后,您可以查看最常见的结果(或者其他您想知道的关于聚合数据的信息)。

代码语言:javascript
复制
dates
  .map { |date| DateTime.strptime(date, '%m/%d/%Y %H:%M') }
  .tally
票数 2
EN

Stack Overflow用户

发布于 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]

票数 2
EN

Stack Overflow用户

发布于 2020-11-17 19:55:15

我想你希望找到一天中有最多的注册时间,接管所有的日期在dates

步骤1:使用 Enumerable#tally 将小时数映射到注册人数

代码语言:javascript
复制
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),后面紧跟一个冒号,(?=:)是一个正前瞻”。

中间计算是:

代码语言:javascript
复制
dates.map { |date| date[/\d+(?=:)/] }
  #=> ["15", "16", "17", "1", "16", "18", "21", "11", "13", "20",
  #    "19", "21", "16", "20"]

tally在Rubyv.2.7中首次亮相。若要支持早期版本,请将tally替换为

代码语言:javascript
复制
each_with_object(Hash.new(0)) { |s,h| h[s] += 1 }

步骤2:使用 Enumerable#max 按小时确定最大注册人数

代码语言:javascript
复制
peak_nbr = h.max_by(&:last).last
  #=> 3 

这表明每小时注册的最大人数是3

中间计算是:

代码语言:javascript
复制
h.max_by(&:last)
  #=> ["16", 3]

如果一个人只想要有最大数量的注册人的任何一个小时(即使他们是与拥有最多注册人的小时相联系),你可以简单地停止这个中间计算。

步骤3:使用 Hash#select 确定注册人的时间

代码语言:javascript
复制
h.select { |_hr,nbr| nbr == peak_nbr }
  #=> {"16"=>3}

这表明"16"是拥有最大注册人数(3)的唯一一个小时。如果也有3注册人在,比如说,小时"12",这个散列将是{"16"=>3, "12"=>3}。要获得高峰时间,请写

代码语言:javascript
复制
h.select { |_hr,nbr| nbr == peak_nbr }.keys
  #=> ["16"]

我编写了第一个块变量_hr,这是向读取器发出的下划线信号,即在块计算中不使用该块变量。这是常见的做法(就像使用_作为变量名一样)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64875661

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档