[r] 문자 벡터를 POSIXct / POSIXlt로 변환하기위한 as.POSIXct / as.POSIXlt와 strptime의 차이점
여기서 문자 벡터를 datetime 클래스로 변환하는 방법에 대해 묻는 여러 질문을 따랐습니다. 나는 종종 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 개의 유사한 기능이 있거나 내가 놓친 기능간에 차이점이 있습니까?
답변
음, 함수는 다른 일을합니다.
첫째, 날짜 / 시간의 두 가지 내부 구현이 있습니다. POSIXct
는 UNIX 시대 이후 초 (+ 일부 다른 데이터) POSIXlt
를 저장하는이고 일, 월, 년,시, 분, 초 등의 목록을 저장하는.
strptime
다양한 형식의 문자형 벡터를 형식으로 직접 변환하는 함수 POSIXlt
입니다.
as.POSIXlt
다양한 데이터 유형을 POSIXlt
. 그것은 지능적이고 현명한 일을하려고 노력합니다. 캐릭터의 경우 strptime
.
as.POSIXct
다양한 데이터 유형을 POSIXct
. 또한 지적하고 분별있는 일을하려고 – 문자의 경우는 실행 strptime
후, 처음부터 변환을 수행 POSIXlt
하는 POSIXct
.
그것은 의미하게 strptime
때문에, 빠른을 strptime
다른 사람이 입력 유형에서 사용할 방법을 결정하기 위해 시도하는 동안 만 문자 입력을 처리합니다. 또한 예기치 않은 데이터가 전달되면 원하는 것이 아닌 지능적인 작업을 시도하는 대신 오류가 발생할 수 있다는 점에서 조금 더 안전해야합니다.
답변
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