Ruby:如何从日期时间字符串中提取一小时(或一天)

时间:2013-05-02 01:01:29

标签: ruby sorting datetime

我从大型CSV文件中提取日期时间字符串,如下所示:

"11/19/2008 21:56"

我想提取小时,所以我可以建立一个所有小时的直方图来找到最常见的小时。同样,我想从日期中提取一周中的几天(姓名)并建立一个最常见日子的直方图。

我是Ruby的新手,查看了这些信息,对于初学者尝试了以下各种形式,但没有运气:

require 'date'
puts DateTime.strptime("11/19/2008 21:56", '%I')

您能否建议一种简单(清晰)的方法来完成上述工作?此外,任何建议如何表示结果将是伟大的。我正在考虑一个小时(24个条目)和一个日期(7个条目)的哈希数组?当我遍历日期时间字符串时,加载它们的最新算法是什么,然后可能最频繁地对它们进行重新排序?谢谢!

2 个答案:

答案 0 :(得分:12)

这是起点:

dt = "11/19/2008 21:56"
require 'date'
DateTime.strptime(dt, '%m/%d/%Y %H:%M') # => #<DateTime: 2008-11-19T21:56:00+00:00 ((2454790j,78960s,0n),+0s,2299161j)>

“11/19/2008”等日期格式在解析时出现问题,因为默认情况下使用此格式:

'%d/%m/%Y'

当日期值为19时,日期会爆发。 '%m/%d/%Y'在全球范围内并不像'%d/%m/%Y'那样受欢迎,这就是Ruby默认的原因。

解析时间戳后,您可以轻松地从中提取部分:

datetime = DateTime.strptime(dt, '%m/%d/%Y %H:%M')
datetime.hour # => 21
datetime.wday # => 3

请注意,wday会返回0..6的值,而非1..7,其中0 = Sunday

%w[Sunday Monday Tuesday Wednesday Thursday Friday Saturday][datetime.wday] 
# => "Wednesday"

Rails的ActiveSupport有很多useful methods作为其Date,DateTime和Time支持的一部分。使用它们很简单,如果您决定将它们添加到普通的Ruby代码中,那么很容易选择它们。

答案 1 :(得分:2)

"11/19/2008 21:56".split[1]
 => "21:56" 

如果可以采用其他格式,但始终是唯一一部分带有“:”且每边两位数的部分,则可以使用

"11/19/2008 21:56"[/\d{2}:\d{2}/]
 => "21:56"

白天,类似的东西

 "11/19/2008 21:56"[/\d{2}\/\d{2}\/\d{4}/]
 => "11/19/2008"