Різниця між as.POSIXct / as.POSIXlt і strptime для перетворення векторів символів у POSIXct / POSIXlt


94

Тут я дотримувався ряду питань, які задають питання про те, як перетворити вектори символів у класи дати та часу. Я часто бачу 2 методи, strptime і методи as.POSIXct / as.POSIXlt. Я розглянув 2 функції, але незрозуміло, в чому різниця.

strptime

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

як.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>

Виконайте мікровідповідність, щоб перевірити, чи є різниця в продуктивності:

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 здається трохи швидшим. так що дає? чому б існувало 2 подібні функції чи є відмінності між ними, які я пропустив?


4
Якщо ви хочете побачити, який код викликається під час виклику as.POSIXctта as.POSIXltна символьних векторах, подивіться на as.POSIXct.defaultі as.POSIXlt.character, відповідно.
Джошуа Ульріх

Відповіді:


154

Ну, функції роблять різні речі.

По-перше, є дві внутрішні реалізації дати / часу:, POSIXctяка зберігає секунди з епохи UNIX (+ деякі інші дані), і POSIXlt, яка зберігає список дня, місяця, року, години, хвилини, секунди тощо.

strptimeце функція безпосереднього перетворення символьних векторів (різних форматів) у POSIXltформатування.

as.POSIXltперетворює різні типи даних в POSIXlt. Він намагається бути розумним і робити розумне - у випадку характеру він виконує роль обгортки strptime.

as.POSIXctперетворює різні типи даних в POSIXct. Він також намагається бути розумним і робити розумне - у випадку характеру він запускається strptimeспочатку, а потім перетворює з POSIXltна POSIXct.

Це має сенс, що strptimeце швидше, оскільки strptimeобробляє лише введення символів, тоді як інші намагаються визначити, який метод використовувати з типу введення. Це також повинно бути трохи безпечнішим, оскільки передача несподіваних даних просто призведе до помилки, замість того, щоб намагатися робити розумні речі, які можуть бути не такими, як ви хочете.


чудова відповідь. чи існує консенсус щодо того, яка найкраща практика для збирання даних для цілей моделювання або візуалізації даних?
dre

22

Існує два типи POSIXt, POSIXct і POSIXlt. "ct" може означати календарний час, він зберігає кількість секунд з моменту початку. "lt", або місцевий час, зберігає дату як список атрибутів часу (наприклад, "година" та "пн"). Спробуйте ці приклади:

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.