12

我正在从一个大的 CSV 文件中提取日期时间字符串,如下所示:

"11/19/2008 21:56"

我只想提取小时,所以我可以构建所有小时的直方图以找到最频繁的时间。同样,我想从日期中提取星期几(名称)并构建最常见日期的直方图。

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

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

您能否建议一种简单(清晰)的方法来完成上述操作?此外,任何如何表示结果的建议都会很棒。我在想一个小时的哈希数组(24 个条目)和一个天的哈希数组(7 个条目)?当我遍历日期时间字符串时,加载它们的最简洁的算法是什么,然后可能以最频繁的方式重新排序它们?谢谢!!

4

2 回答 2

14

这是起点:

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'.

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

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 有很多有用的方法作为它的 Date、DateTime 和 Time 支持的一部分。使用它们很容易,如果你决定将它们添加到普通的 Ruby 代码中,很容易挑选你想要的。

于 2013-05-02T01:23:45.190 回答
3
"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"
于 2013-05-02T01:14:46.130 回答