[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


답변