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

Я следил за рядом вопросов, которые спрашивают о том, как преобразовать векторы символов в классы даты и времени. Я часто вижу 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>
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>

Делаем микробенчмарк, чтобы увидеть, есть ли различия в производительности:

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 похожих функции или есть различия между ними, которые я пропустил?

 Joshua Ulrich22 мая 2012 г., 12:38
Если вы хотите увидеть, какой код вызывается при вызовеas.POSIXct а такжеas.POSIXlt на символьных векторах, посмотрите наas.POSIXct.default а такжеas.POSIXlt.characterсоответственно.

Ответы на вопрос(2)

Существует два типа POSIXt, POSIXct и POSIXlt. & Quot; кт & Quot; может стоять за календарное время, он хранит количество секунд с начала координат. «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
Решение Вопроса

Ну, функции делают разные вещи.

Во-первых, есть две внутренние реализации даты / времени:POSIXct, который хранит секунды, начиная с эпохи UNIX (+ некоторые другие данные), иPOSIXlt, который хранит список дня, месяца, года, часа, минуты, секунды и т. д.

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

as.POSIXlt преобразует различные типы данных вPOSIXlt, Он пытается быть умным и делать разумные вещи - в случае персонажа он действует как обертка дляstrptime.

as.POSIXct преобразует различные типы данных вPOSIXct, Он также пытается быть разумным и делать разумные вещи - в случае с персонажем, он работаетstrptime сначала выполняется преобразование изPOSIXlt вPOSIXct.

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

 26 дек. 2018 г., 16:54
отличный ответ. существует ли консенсус относительно того, какой метод является наилучшим для составления данных для целей моделирования или визуализации данных?

Ваш ответ на вопрос