Sự khác biệt giữa as.POSIXct / as.POSIXlt và strptime để chuyển đổi vectơ ký tự thành POSIXct / POSIXlt


94

Tôi đã theo dõi một số câu hỏi ở đây hỏi về cách chuyển đổi vectơ ký tự thành các lớp datetime. Tôi thường thấy 2 phương thức, phương thức strptime và as.POSIXct / as.POSIXlt. Tôi đã nhìn vào 2 chức năng nhưng không rõ sự khác biệt là gì.

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>

Thực hiện đánh dấu vi mô để xem liệu có sự khác biệt về hiệu suất hay không:

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 có vẻ nhanh hơn một chút. vậy cái gì cho? tại sao lại có 2 chức năng giống nhau hoặc có sự khác biệt giữa chúng mà tôi đã bỏ qua?


4
Nếu bạn muốn xem mã nào đang được gọi khi gọi as.POSIXctas.POSIXlttrên vectơ ký tự, hãy xem as.POSIXct.defaultas.POSIXlt.charactertương ứng.
Joshua Ulrich

Câu trả lời:


154

Chà, các chức năng làm những việc khác nhau.

Đầu tiên, có hai triển khai nội bộ của ngày / giờ POSIXct:, lưu trữ giây kể từ kỷ nguyên UNIX (+ một số dữ liệu khác) và POSIXltlưu trữ danh sách ngày, tháng, năm, giờ, phút, giây, v.v.

strptimelà chức năng chuyển đổi trực tiếp các vectơ ký tự (có nhiều dạng) sang POSIXltđịnh dạng.

as.POSIXltchuyển đổi nhiều loại dữ liệu sang POSIXlt. Nó cố gắng trở nên thông minh và làm những điều hợp lý - trong trường hợp của tính cách, nó hoạt động như một lớp bao bọc strptime.

as.POSIXctchuyển đổi nhiều loại dữ liệu sang POSIXct. Nó cũng cố gắng trở nên thông minh và làm điều hợp lý - trong trường hợp ký tự, nó chạy strptimetrước, sau đó thực hiện chuyển đổi từ POSIXltsang POSIXct.

Nó có nghĩa strptimelà nhanh hơn, vì strptimechỉ xử lý đầu vào ký tự trong khi những người khác cố gắng xác định phương thức nào sẽ sử dụng từ loại đầu vào. Cũng nên an toàn hơn một chút ở chỗ, việc được trao dữ liệu không mong muốn sẽ chỉ gây ra lỗi, thay vì cố gắng làm điều thông minh có thể không như ý bạn.


câu trả lời chính xác. có sự nhất trí về phương pháp tốt nhất để biên dịch dữ liệu cho mục đích mô hình hóa hoặc trực quan hóa dữ liệu không?
dre

22

Có hai loại POSIXt, POSIXct và POSIXlt. "ct" có thể đại diện cho lịch thời gian, nó lưu trữ số giây kể từ gốc. "lt", hoặc giờ địa phương, giữ ngày dưới dạng danh sách các thuộc tính thời gian (chẳng hạn như "giờ" và "mon"). Hãy thử các ví dụ sau:

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.