Wykonałem tutaj kilka pytań, które dotyczą sposobu konwersji wektorów znaków na klasy datetime. Często widzę dwie metody, strptime i as.POSIXct / as.POSIXlt. Przyjrzałem się 2 funkcjom, ale nie jestem pewien, jaka jest różnica.
strptime
function (x, format, tz = "")
{
y <- .Internal(strptime(as.character(x), format, tz))
names(y$year) <- names(x)
y
}
<bytecode: 0x045fcea8>
<environment: namespace:base>
jako 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>
Wykonanie mikroznaku, aby sprawdzić, czy istnieją różnice w wydajności:
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 wydaje się nieco szybszy. więc co daje? dlaczego miałyby istnieć 2 podobne funkcje lub czy są między nimi różnice, które przegapiłem?
r
date
time
benchmarking
RJ-
źródło
źródło
as.POSIXct
ias.POSIXlt
na wektorach znakowych, spójrz odpowiednio naas.POSIXct.default
ias.POSIXlt.character
.Odpowiedzi:
Cóż, funkcje robią różne rzeczy.
Po pierwsze, istnieją dwie wewnętrzne implementacje daty / czasu:
POSIXct
która przechowuje sekundy od epoki UNIX (+ niektóre inne dane) iPOSIXlt
która przechowuje listę dnia, miesiąca, roku, godziny, minuty, sekundy itd.strptime
to funkcja umożliwiająca bezpośrednią konwersję wektorów znakowych (o różnych formatach) naPOSIXlt
format.as.POSIXlt
konwertuje różne typy danych naPOSIXlt
. Stara się być inteligentna i rozsądna - w przypadku charakteru działa jak opakowaniestrptime
.as.POSIXct
konwertuje różne typy danych naPOSIXct
. Stara się też być inteligentnym i rozsądnym - w przypadku charakterustrptime
najpierw biegnie , a potem dokonuje konwersji zPOSIXlt
naPOSIXct
.To ma sens
strptime
, ponieważ jest to szybsze, ponieważstrptime
obsługuje tylko wprowadzanie znaków, podczas gdy inne próbują określić, której metody użyć, na podstawie typu danych wejściowych. Powinno być również trochę bezpieczniejsze, ponieważ otrzymanie nieoczekiwanych danych po prostu spowodowałoby błąd, zamiast próbować zrobić inteligentną rzecz, która może nie być tym, czego chcesz.źródło
Istnieją dwa typy POSIXt, POSIXct i POSIXlt. „ct” może oznaczać czas kalendarzowy, przechowuje liczbę sekund od początku. „lt” lub czas lokalny przechowuje datę jako listę atrybutów czasu (takich jak „godzina” i „poniedziałek”). Wypróbuj te przykłady:
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
źródło