2016-05-06 4 views
-1

Ich habe ein Datenframe, in dem eine Spalte eine Reihe von Datumsangaben auflistet. Seltsamerweise ist der Datentyp für diese Spalte "Ganzzahl". Ich muss die Spalte auf einen richtigen Datetime-Datentyp wie POSIXct zwingen, damit ich diese Zeitstempel von denen in einem anderen Feld subtrahieren kann. Wenn ich jedoch versuche, diese Datetime-Werte in POSIXct zu zwingen, verlieren sie die Zeitkomponente. Wenn ich versuche, die Datumsangaben zu berechnen, ohne zuerst einen anderen Datentyp zu verwenden, verhält sich R so, als ob die Zeitkomponente des Zeitstempels nicht vorhanden wäre (es wird davon ausgegangen, dass jedes Datum eine Zeit von Mitternacht hat). Was ist los und wie repariere ich es, damit R den Zeitstempel erkennt?R erkennt keine Zeitkomponente von Datetime-Werten

> dates[1] 
[1] 2016-05-05T16:46:21-04:00 
48 Levels: 2016-05-03T06:45:42-04:00 2016-05-03T06:45:43-04:00 ... 2016-05-05T16:50:00-04:00 
> typeof(dates) 
[1] "integer" 
> as.POSIXct(dates[1]) 
[1] "2016-05-05 EDT" 
> as.character(dates[1]) 
[1] "2016-05-05T16:46:21-04:00" 
> as.POSIXct(as.character(dates[1])) 
[1] "2016-05-05 EDT" 
+0

Die '48 Levels' ist ein Hinweis, dass R es als Faktoren behandelt. Wenn Sie 'read.csv' verwendet haben, verwenden Sie' stringAsFactors = F' – rbm

+0

Sie haben ein nicht standardisiertes Datum-Uhrzeit-Format. R wird wahrscheinlich etwas Hilfe brauchen 'as.POSIXct (" 2016-05-05T16: 46: 21-04: 00 ", format ="% Y-% m-% dT% H:% M:% S ")' –

Antwort

2

können Sie verwenden as.POSIXct mit dem tz Argument der Zeitstempel mit dem richtigen Maß an Kontrolle zu konvertieren.

Wenn die Zeitzonen sind alle UTC-04: 00 und das ist Ihre lokale Zeitzone, können Sie verwenden:

dates = as.POSIXct(dates, format="%Y-%m-%dT%H:%M:%S", tz=Sys.timezone()) 

Wenn sie sind alle UTC-04: 00 und das ist nicht Ihre lokale Zeitzone, aber Sie kennen den genauen Standort, dann können Sie die entsprechende Zeitzone aus der tz database angeben:

dates = as.POSIXct(dates, format="%Y-%m-%dT%H:%M:%S", tz="America/Port_of_Spain") 

Alternativ Sie eine generische GMT-4 Zeitzone verwenden:

dates = as.POSIXct(dates, format="%Y-%m-%dT%H:%M:%S", tz="Etc/GMT-4") 

[EDIT: Mit Dank an Roland für seinen Kommentar unten. Ich verwendete ursprünglich strptime, die die gleiche Syntax verwendet, aber ein POSIXlt Objekt zurückgibt.]

+1

Sie können 'as.POSIXct' auf die gleiche Weise verwenden. Es gibt Ihnen ein POSIXct-Objekt, das im Allgemeinen gegenüber POSIXlt vorzuziehen ist, was 'strptime' zurückgibt. – Roland

+0

Danke, ich habe meine Antwort entsprechend geändert. – ajrwhite

+0

Das hat perfekt funktioniert. Vielen Dank! – user3786999