Karakter vektörlerini POSIXct / POSIXlt'ye dönüştürmek için as.POSIXct / as.POSIXlt ve strptime arasındaki fark


97

Burada karakter vektörlerinin datetime sınıflarına nasıl dönüştürüleceğini soran bir dizi soruyu takip ettim. Sıklıkla 2 yöntem görüyorum, strptime ve as.POSIXct / as.POSIXlt yöntemleri. 2 fonksiyona baktım ama farkın ne olduğu belirsiz.

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>

Performans farklılıkları olup olmadığını görmek için bir mikro kıyaslama yapmak:

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 biraz daha hızlı görünüyor. peki ne verir? neden 2 benzer işlev olsun veya aralarında kaçırdığım farklılıklar var mı?


4
Eğer çağrılan hangi kodun görmek istiyorsanız çağrılırken as.POSIXctve as.POSIXltkarakter vektörler, bakmak üzerinde as.POSIXct.defaultve as.POSIXlt.charactersırasıyla.
Joshua Ulrich

Yanıtlar:


156

İşlevler farklı şeyler yapar.

İlk olarak, iki dahili tarih / saat uygulaması vardır: POSIXctUNIX döneminden bu yana saniyeleri depolayan (+ diğer bazı veriler) ve POSIXltgün, ay, yıl, saat, dakika, saniye vb.

strptimekarakter vektörlerini (çeşitli formatlarda) POSIXltformata doğrudan dönüştürmek için bir işlevdir .

as.POSIXltçeşitli veri türlerini POSIXlt. Zeki olmaya ve mantıklı olanı yapmaya çalışır - karakter durumunda, bir sarmalayıcı görevi görür strptime.

as.POSIXctçeşitli veri türlerini POSIXct. Aynı zamanda zeki ve mantıklı bir şey yapmaya çalışır - karakterinin durumunda, ishal strptime, sonra birinciden dönüşüm yapar POSIXltiçin POSIXct.

Bunun strptimedaha hızlı olması mantıklıdır , çünkü strptimeyalnızca karakter girdisini işlerken diğerleri girdi türünden hangi yöntemin kullanılacağını belirlemeye çalışır. Ayrıca, beklenmedik verilerin verilmesi, istediğiniz gibi olmayan akıllı şeyi yapmaya çalışmak yerine, yalnızca bir hata vereceği için biraz daha güvenli olmalıdır.


mükemmel cevap. Modelleme veya veri görselleştirme amacıyla verileri derlemek için en iyi uygulamanın hangisi olduğu konusunda bir fikir birliği var mı?
dre

23

İki POSIXt türü vardır, POSIXct ve POSIXlt. "ct" takvim zamanını ifade edebilir, başlangıç ​​noktasından itibaren saniye sayısını saklar. "lt" veya yerel saat, tarihi saat öznitelikleri listesi olarak tutar ("saat" ve "pazartesi" gibi). Şu örnekleri deneyin:

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.