2013-05-02 6 views
8

sto tirando le stringhe di data e ora da un grande file CSV, che simile a questa:Rubino: Come estrarre un'ora (o giorno) da una stringa data-ora

"11/19/2008 21:56" 

mi piacerebbe per estrarre solo l'ora, così posso costruire un istogramma di tutte le ore per trovare quelli più frequenti. Allo stesso modo, mi piacerebbe estrarre i giorni della settimana (nomi) dalle date e costruire un istogramma dei giorni più frequenti.

Sono nuovo a Ruby, alzò lo sguardo le informazioni, per cominciare provato varie forme di quanto segue, ma senza fortuna:

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

Potete si prega di avvisare un modo semplice (e trasparente) per realizzare il sopra? Inoltre, qualsiasi suggerimento su come rappresentare i risultati sarebbe fantastico. Sto pensando a un array di hash per le ore (24 voci) e uno per i giorni (7 voci)? Quale sarebbe l'algoritmo più accurato per caricarli mentre eseguo l'iterazione delle stringhe data-ora, e quindi magari riordinandoli con più frequenti in cima? Grazie!!

+0

La stringa datetime deve essere formattata in questo modo? Oppure puoi averlo in altri formati? –

+0

Perché ho sfogliato i documenti di Ruby qui: http://www.ruby-doc.org/stdlib-1.9.3/libdoc/date/rdoc/DateTime.html e non ho trovato qualcosa che accetti quel formato. –

+0

sì, è così che arriva dal file CSV fornito – pete

risposta

12

Questo è il punto di partenza:

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)> 

formati di data come "2008/11/19" presentare un problema durante l'analisi, perché il valore predefinito è quello di utilizzare questo formato:

'%d/%m/%Y' 

Data esplode quando vede un valore mese di 19. '%m/%d/%Y' non è così popolare in tutto il mondo come '%d/%m/%Y', motivo per cui Ruby lo utilizza automaticamente.

Una volta che avete il timestamp analizzato, si può facilmente estrarre parti da esso:

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

notare che wday valori torna dal 0..6, non 1..7, dove 0 = Sunday:

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

ActiveSupport Rails' ha un sacco di useful methods come parte del suo supporto Date, DateTime e Time. Usarli è facile, ed è facile sceglierne quale vuoi se decidi di aggiungerli al codice Ruby plain-ol.

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

Se può essere in altri formati, ma sempre l'unica parte con un ":" e due cifre su ogni lato, è possibile utilizzare

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

E per il giorno, qualcosa di simile

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