2014-06-19 7 views
10

Mam zestaw danych, w którym time.start zmienia się od 5:00:00 do 28:59:59 (tj. 01.01.2013 28:00:00 to tak naprawdę 02.01.2013 04 : 00: 00). Daty są w formacie %d.%m.%Y.05:00:00 - 28:59:59 format czasu

 Date Time.start 
01.01.2013 22:13:07 
01.01.2013 22:52:23 
01.01.2013 23:34:06 
01.01.2013 23:44:25 
01.01.2013 27:18:48 
01.01.2013 28:41:04 

Chcę przekonwertować go na normalny format daty.

dates$date <- paste(dates$Date,dates$Time.start, sep = " ") 
dates$date <- as.POSIXct(strptime(dates$date, "%m.%d.%Y %H:%M:%S")) 

Ale oczywiście mam NA do czasu> 23:59:59

Jak należy zmodyfikować mojego kodu?

+0

Przypomina mi zakresów czasu dla japońskiego programu telewizyjnego planowanie, które staje się głupie, gdy korzystają z non-24 godzin (np. "późna noc 3:00" oznacza 3 nad ranem następnego dnia). – JAB

+0

Rzeczywiście, widzisz reklamy w barach, które są otwarte do "25:00" na 1:00 itd. –

+0

Normalizuj, kompensując -5 godzin w bazie danych i dodawaj +5, kiedy faktycznie korzystasz z danych. :) '[Z -5, jesteś w zakresie 00:00:00 - 23:59:59.]' – CodeAngry

Odpowiedz

8

Np. dodać czas w sekundach daty:

df <- read.table(header=T, text="  Date Time.start 
01.01.2013 22:13:07 
01.01.2013 22:52:23 
01.01.2013 23:34:06 
01.01.2013 23:44:25 
01.01.2013 27:18:48 
01.01.2013 28:41:04", stringsAsFactors=FALSE) 

as.POSIXct(df$Date, format="%d.%m.%Y") + 
    sapply(strsplit(df$Time.start, ":"), function(t) { 
    t <- as.integer(t) 
    t[3] + t[2] * 60 + t[1] * 60 * 60 
    }) 

# [1] "2013-01-01 22:13:07 CET" "2013-01-01 22:52:23 CET" "2013-01-01 23:34:06 CET" 
# [4] "2013-01-01 23:44:25 CET" "2013-01-02 03:18:48 CET" "2013-01-02 04:41:04 CET" 
+0

Co powiesz na użycie 'scan' do bezpośredniego odczytu w intach z dat. Bez żadnych ograniczeń i bez przymusu. Naprawdę podoba mi się ten twój pomysł. – asb

+0

Twoje rozwiązanie jest szybsze niż @akrun. Mam ramkę danych z 180 000 wierszy i utworzenie 2,5 s dla utworzenia wektora w porównaniu do 31 sekund za pomocą komendy 'with' – BiXiC

+0

Teraz mam problem z funkcją dla tego skryptu. = (http://stackoverflow.com/questions/24308718/050000-285959-time-format-funkcja – BiXiC

8

Wystarczy modyfikacja rozwiązania lukeAs:

with(df, as.POSIXct(Date, format="%d.%m.%Y")+ 
colSums(t(read.table(text=Time.start, sep=":",header=F))*c(3600,60,1))) 
[1] "2013-01-01 22:13:07 EST" "2013-01-01 22:52:23 EST" 
[3] "2013-01-01 23:34:06 EST" "2013-01-01 23:44:25 EST" 
[5] "2013-01-02 03:18:48 EST" "2013-01-02 04:41:04 EST" 
2

Korzystanie lubridate:

with(dates, mdy(Date) + hms(Time.start)) 

Generuje:

[1] "2013-01-01 22:13:07 UTC" "2013-01-01 22:52:23 UTC" 
[3] "2013-01-01 23:34:06 UTC" "2013-01-01 23:44:25 UTC" 
[5] "2013-01-02 03:18:48 UTC" "2013-01-02 04:41:04 UTC"