Unterschied zwischen as.POSIXct / as.POSIXlt und strptime zum Konvertieren von Zeichenvektoren in POSIXct / POSIXlt

93

Ich habe hier eine Reihe von Fragen beantwortet, in denen gefragt wird, wie Zeichenvektoren in Datums- / Uhrzeitklassen konvertiert werden sollen. Ich sehe oft 2 Methoden, die strptime und die as.POSIXct / as.POSIXlt Methoden. Ich habe mir die 2 Funktionen angesehen, bin mir aber nicht sicher, was der Unterschied ist.

strptime

function (x, format, tz = "") 
{
    y <- .Internal(strptime(as.character(x), format, tz))
    names(y$year) <- names(x)
    y
}
<bytecode: 0x045fcea8>
<environment: namespace:base>

as.POSIXct

function (x, tz = "", ...) 
UseMethod("as.POSIXct")
<bytecode: 0x069efeb8>
<environment: namespace:base>

as.POSIXlt

function (x, tz = "", ...) 
UseMethod("as.POSIXlt")
<bytecode: 0x03ac029c>
<environment: namespace:base>

Durchführen eines Mikrobenchmarks, um festzustellen, ob Leistungsunterschiede bestehen:

library(microbenchmark)
Dates <- sample(c(dates = format(seq(ISOdate(2010,1,1), by='day', length=365), format='%d-%m-%Y')), 5000, replace = TRUE)
df <- microbenchmark(strptime(Dates, "%d-%m-%Y"), as.POSIXlt(Dates, format = "%d-%m-%Y"), times = 1000)

Unit: milliseconds
                                    expr      min       lq   median       uq      max
1 as.POSIXlt(Dates, format = "%d-%m-%Y") 32.38596 33.81324 34.78487 35.52183 61.80171
2            strptime(Dates, "%d-%m-%Y") 31.73224 33.22964 34.20407 34.88167 52.12422

strptime scheint etwas schneller zu sein. Also, was gibt es? Warum sollte es 2 ähnliche Funktionen geben oder gibt es Unterschiede zwischen ihnen, die ich verpasst habe?

RJ-
quelle
4
Wenn Sie sehen wollen , was Code aufgerufen wird, wenn Sie anrufen as.POSIXctund as.POSIXltauf Zeichenvektoren, Blick auf as.POSIXct.defaultund as.POSIXlt.charactersind.
Joshua Ulrich

Antworten:

153

Nun, die Funktionen machen verschiedene Dinge.

Erstens gibt es zwei interne Implementierungen von Datum / Uhrzeit: POSIXctDiese speichern Sekunden seit der UNIX-Epoche (+ einige andere Daten) und POSIXltspeichern eine Liste von Tag, Monat, Jahr, Stunde, Minute, Sekunde usw.

strptimeist eine Funktion zum direkten Konvertieren von Zeichenvektoren (in verschiedenen Formaten) in das POSIXltFormat.

as.POSIXltkonvertiert eine Vielzahl von Datentypen in POSIXlt. Es versucht intelligent zu sein und das Vernünftige zu tun - im Falle eines Charakters wirkt es als Wrapper für strptime.

as.POSIXctkonvertiert eine Vielzahl von Datentypen in POSIXct. Es versucht auch, intelligent zu sein und das Vernünftige zu tun - im Falle eines Charakters läuft es strptimezuerst und führt dann die Konvertierung von POSIXltnach durch POSIXct.

Es ist sinnvoll, dass dies strptimeschneller ist, da strptimenur die Zeicheneingabe verarbeitet wird, während die anderen versuchen, anhand des Eingabetyps zu bestimmen, welche Methode verwendet werden soll. Es sollte auch ein bisschen sicherer sein, dass die Übergabe unerwarteter Daten nur einen Fehler darstellt, anstatt zu versuchen, das Intelligente zu tun, das möglicherweise nicht das ist, was Sie wollen.

Fhnuzoag
quelle
gute Antwort. Gibt es einen Konsens darüber, welche bewährten Methoden zum Zusammenstellen von Daten für Modellierungs- oder Datenvisualisierungszwecke geeignet sind?
Dre
22

Es gibt zwei POSIXt-Typen, POSIXct und POSIXlt. "ct" kann für die Kalenderzeit stehen und speichert die Anzahl der Sekunden seit dem Ursprung. "lt" oder Ortszeit speichert das Datum als Liste von Zeitattributen (wie "Stunde" und "Montag"). Probieren Sie diese Beispiele aus:

date.hour=strptime("2011-03-27 01:30:00", "%Y-%m-%d %H:%M:%S")

date=c("26/10/2016")

time=c("19:51:30")

day<-paste(date,"T", time)

day.time1=as.POSIXct(day,format="%d/%m/%Y T %H:%M:%S",tz="Europe/Paris")

day.time1

day.time1$year

day.time2=as.POSIXlt(day,format="%d/%m/%Y T %H:%M:%S",tz="Europe/Paris")

day.time2

day.time2$year
kuong
quelle