Różnica między as.POSIXct / as.POSIXlt i strptime do konwersji wektorów znaków na POSIXct/POSIXlt

Wykonałem kilka pytań, które pytają o to, jak przekonwertować wektory znaków do klas datetime. Często widzę 2 metody, strptime i as.POSIXct / as.Metody POSIXlt. Spojrzałem na 2 funkcje, ale nie wiem, 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>

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>

Wykonanie mikrobenchmarka, aby sprawdzić, czy występują 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 się dzieje? dlaczego czy byłyby 2 podobne funkcje, czy są różnice między nimi, które przegapiłem?

Author: RJ-, 2012-05-22

2 answers

Cóż, funkcje robią różne rzeczy.

Po pierwsze, istnieją dwie wewnętrzne implementacje daty/czasu: POSIXct, która przechowuje sekundy od epoki Uniksa (+inne dane), oraz POSIXlt, która przechowuje listę dnia, miesiąca, roku, Godziny, Minuty, Sekundy itp.

strptime jest funkcją do bezpośredniej konwersji wektorów znaków (różnych formatów) do formatu POSIXlt.

as.POSIXlt konwertuje różne typy danych do POSIXlt. Stara się być inteligentny i robić sensowne rzeczy - w przypadku znaku działa on jako wrapper do strptime.

as.POSIXct konwertuje różne typy danych do POSIXct. Stara się też być inteligentny i robić sensowne rzeczy - w przypadku znaku najpierw uruchamia strptime, potem dokonuje konwersji z POSIXlt na POSIXct.

Ma sens, że strptime jest szybszy, ponieważ strptime obsługuje tylko wprowadzanie znaków, podczas gdy inni próbują określić, której metody użyć z typu wejściowego. Powinno być również nieco bezpieczniejsze w tym, że wręczenie nieoczekiwane dane po prostu dałyby błąd, zamiast próbować zrobić inteligentną rzecz, która może nie być tym, czego chcesz.

 127
Author: Fhnuzoag,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-29 20:20:55

Istnieją dwa typy POSIXt, POSIXct i POSIXlt. "ct" może oznaczać czas kalendarzowy, przechowuje liczbę sekund od początku. "lt", czyli czas lokalny, przechowuje datę jako listę atrybutów czasu(takich jak "godzina "i " mon"). 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
 11
Author: kuong,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-27 16:24:27