0

好的,所以我对此很陌生,我希望我能正确解释这一点。我正在使用 Ruby,并且我有一个程序,它采用 CSV 文件并在其上执行一些各种功能。我在这里关心的是时间部分。我取了一列数据,它是一个字符串,并使用此方法将其转换为 DateTime 并只给我小时部分:

def hour_reg(regdate)
  regdate.to_s
  time_stamp = DateTime.strptime("#{regdate}", "%m/%d/%y %H:%M").hour
  time_stamp
end

那部分工作正常。所以现在我试图把我刚刚得到的那个小时转换成一个 HASH,它显示一天中的小时(1 到 24),以及每小时出现的次数。例如,如果 1 小时(对于凌晨 1 点)出现 3 次不同的时间,它将在散列中显示:{1 => 3}。这是迭代 TIMES 列的代码的样子,由 ":regdate" 指示

contents.each do |row|
  id = row[0]
  name = row[:first_name]
  zipcode = clean_zipcode(row[:zipcode])
  **reg_time = hour_reg(row[:regdate])**
end

基本上我想要每小时的频率。有人能帮忙吗?我有很多麻烦

4

1 回答 1

0

您将需要创建一个包含 1-24 个键的哈希,初始化为 0。

h = { 1 => 0, 2 => 0, ...}

然后这样做以增加哈希值。我假设 hour_reg 方法返回一个整数。

h[hour_reg(row[:regdate])] += 1 

您还可以将 hour_reg 方法简化为:

def hour_reg(regdate)
  DateTime.strptime("#{regdate}", "%m/%d/%y %H:%M").hour
end

更新我的答案以反映评论中的讨论:

#get contents from CSV file
contents = CSV.open 'event_attendees.csv', headers: true, header_converters: :symbol 

# create Hash h with 1-24 keys initialized to 0
h = {}
(1..24).each {|x| h[x] = 0}

contents.each do |row| 
  reg_time = hour_reg(row[:regdate]).to_i 
  h[reg_time] += 1 
end

小时频率存储在“h”哈希中。如果需要,您可以将上述“内容”块简化为一行:

contents.each do {|row| h[hour_reg(row[:regdate]).to_i] += 1}
于 2013-05-22T18:09:12.927 回答