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

95

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?

RJ-
źródło
4
Jeśli chcesz zobaczyć, jaki kod jest wywoływany podczas wywoływania as.POSIXcti as.POSIXltna wektorach znakowych, spójrz odpowiednio na as.POSIXct.defaulti as.POSIXlt.character.
Joshua Ulrich

Odpowiedzi:

155

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

Po pierwsze, istnieją dwie wewnętrzne implementacje daty / czasu: POSIXctktóra przechowuje sekundy od epoki UNIX (+ niektóre inne dane) i POSIXltktóra przechowuje listę dnia, miesiąca, roku, godziny, minuty, sekundy itd.

strptimeto funkcja umożliwiająca bezpośrednią konwersję wektorów znakowych (o różnych formatach) na POSIXltformat.

as.POSIXltkonwertuje różne typy danych na POSIXlt. Stara się być inteligentna i rozsądna - w przypadku charakteru działa jak opakowanie strptime.

as.POSIXctkonwertuje różne typy danych na POSIXct. Stara się też być inteligentnym i rozsądnym - w przypadku charakteru strptimenajpierw biegnie , a potem dokonuje konwersji z POSIXltna POSIXct.

To ma sens strptime, ponieważ jest to szybsze, ponieważ strptimeobsł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.

Fhnuzoag
źródło
świetna odpowiedź. Czy istnieje konsensus co do najlepszej praktyki kompilowania danych do celów modelowania lub wizualizacji danych?
dre
23

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
kuong
źródło