as.POSIXct / as.POSIXlt和strptime之间差值转换字符向量POSIXct

2019-05-14 10:34发布

我在这里遵循了一些问题,询问有关如何字符向量转换成datetime类。 我经常看到2种方法,该strptime和as.POSIXct / as.POSIXlt方法。 我看着两个功能,但我不清楚有什么区别。

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个类似的功能还是有,我错过了它们之间的差异?

Answer 1:

那么,功能做不同的事情。

首先,有的日期/时间两个内部实现: POSIXct ,其存储自秒UNIX纪元(+某些其他数据),和POSIXlt ,其存储日,月,年,小时,分钟,秒等的列表

strptime是(多种格式)字符向量直接转换为功能POSIXlt格式。

as.POSIXlt转换多种数据类型到的POSIXlt 。 它试图要读书做合理的事情-在字符的情况下,它作为一个包装strptime

as.POSIXct转换多种数据类型到的POSIXct 。 它还试图成为智能,做合理的事情-在字符的情况下,它运行strptime第一,然后做从转换POSIXltPOSIXct

这是有道理的strptime更快,因为strptime只处理字符输入,而其他人试图确定从输入型使用的方法。 这也应该是在被手意外的数据多了一点安全将只给一个错误,而不是试图做你想做的,可能不是聪明的事情。



Answer 2:

有两种类型的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


文章来源: Difference between as.POSIXct/as.POSIXlt and strptime for converting character vectors to POSIXct/POSIXlt