2013-05-02 21 views
8

ja pociąga za sznurki Date-Time z dużego pliku CSV, który wygląda tak:Ruby: Jak wyodrębnić godzinę (lub dzień) z ciągiem daty i czasu

"11/19/2008 21:56" 

chciałbym wyodrębnić tylko godzinę, więc mogę zbudować histogram wszystkich godzin, aby znaleźć najczęstsze. Podobnie, chciałbym wyodrębnić dni tygodnia (nazwiska) z dat i zbudować histogram najczęstszych dni.

Jestem nowym Ruby, spojrzał informacje, na początek próbowałem różnych form dalszej części, ale bez powodzenia:

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

Czy mógłbyś doradzić proste (i jasne) sposób, aby wykonać powyżej? Również wszelkie sugestie dotyczące sposobu przedstawienia wyników byłyby wspaniałe. Myślę, że jedna tablica hash na godziny (24 wpisy) i jeden na dni (7 wpisów)? Jaki byłby najczystszy algorytm ładowania ich podczas iteracji przez ciągi daty i czasu, a następnie może przesuwać je ponownie najczęściej na wierzchu? Dzięki!!

+0

Czy łańcuch datetime musi być sformatowany w ten sposób? Lub możesz go mieć w innych formatach? –

+0

Ponieważ przeglądałem dokumenty Ruby tutaj: http://www.ruby-doc.org/stdlib-1.9.3/libdoc/date/rdoc/DateTime.html i nie znalazłem czegoś, co akceptuje ten format. –

+0

tak, tak to przychodzi z pliku CSV – pete

Odpowiedz

12

jest punktem wyjścia:

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

Data formaty jak „19.11.2008” stanowić problem podczas analizowania ponieważ domyślnie używać tego formatu:

'%d/%m/%Y' 

Data wysadza gdy widzi wartość miesięczny 19. '%m/%d/%Y' nie jest tak popularny na całym świecie jak '%d/%m/%Y', dlatego domyślnie Ruby to.

Po datownik analizowany, można łatwo wyodrębnić części z niej:

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

Zauważ, że wday zostaje przywrócone wartości od 0..6, nie 1..7, gdzie 0 = Sunday:

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

ActiveSupport szyn ma wiele useful methods jako część obsługi daty, daty i czasu. Korzystanie z nich jest łatwe i łatwo jest wybrać, które chcesz, jeśli zdecydujesz się dodać je do prostego "kodu Ruby.

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

Jeśli może być w innych formatach, ale zawsze tylko część z „:” oraz dwie cyfry po każdej stronie, można użyć

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

I za dnia, coś podobnego

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