as.POSIXct / as.POSIXlt和将字符向量转换为POSIXct / POSIXlt的strptime之间的区别

我在这里问了一些关于如何将字符向量转换为date时间类的问题。 我经常看到2种方法,strptime和as.POSIXct / as.POSIXlt方法。 我看了2个function,但不清楚有什么不同。

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> 

做一个microbenchmark,看看是否有性能差异:

 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似乎稍快。 那么给了什么? 为什么会有两个相似的function,或者我错过了它们之间的差异?

那么,function做不同的事情。

首先,有两个date/时间的内部实现: POSIXct ,自UNIX时代以后存储秒(+其他数据), POSIXlt存储日,月,年,时,分,秒等列表

strptime是一种将字符向量(各种格式)直接转换为POSIXlt格式的POSIXlt

as.POSIXlt将各种数据types转换为POSIXlt 。 它试图变得聪明,做一些明智的事情 – 就性格而言,它就是一个strptime行为。

as.POSIXct将各种数据types转换为POSIXct 。 它也试图变得聪明并做出明智的事情 – 就性格而言,它首先运行,然后从POSIXlt转换到POSIXct

strptime更快,因为strptime只处理字符input,而其他的则试图从inputtypes中决定使用哪种方法。 也应该有点安全,因为交给意想不到的数据只会给出一个错误,而不是试图去做那些可能不是你想要的东西。

有两种POSIXttypes,POSIXct和POSIXlt。 “ct”代表日历时间,它存储从原点开始的秒数。 “lt”或当地时间,将date保留为时间属性列表(如“小时”和“星期一”)。 试试这些例子:

 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/%YT %H:%M:%S",tz="Europe/Paris") day.time1 day.time1$year day.time2=as.POSIXlt(day,format="%d/%m/%YT %H:%M:%S",tz="Europe/Paris") day.time2 day.time2$year