Saya telah mengikuti sejumlah pertanyaan di sini yang menanyakan tentang cara mengonversi vektor karakter ke kelas waktu. Saya sering melihat 2 metode, strptime dan metode as.POSIXct / as.POSIXlt. Saya melihat 2 fungsi tetapi tidak jelas apa perbedaannya.
strptime
function (x, format, tz = "")
{
y <- .Internal(strptime(as.character(x), format, tz))
names(y$year) <- names(x)
y
}
<bytecode: 0x045fcea8>
<environment: namespace:base>
sebagai.POSIXct
function (x, tz = "", ...)
UseMethod("as.POSIXct")
<bytecode: 0x069efeb8>
<environment: namespace:base>
sebagai.POSIXlt
function (x, tz = "", ...)
UseMethod("as.POSIXlt")
<bytecode: 0x03ac029c>
<environment: namespace:base>
Melakukan microbenchmark untuk melihat apakah ada perbedaan performa:
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 tampaknya sedikit lebih cepat. jadi apa yang memberi? mengapa ada 2 fungsi serupa atau ada perbedaan di antara keduanya yang saya lewatkan?
r
date
time
benchmarking
RJ-
sumber
sumber
as.POSIXct
danas.POSIXlt
pada vektor karakter, lihatas.POSIXct.default
danas.POSIXlt.character
, masing-masing.Jawaban:
Nah, fungsinya melakukan hal yang berbeda.
Pertama, ada dua implementasi internal tanggal / waktu
POSIXct
:, yang menyimpan detik sejak zaman UNIX (+ beberapa data lain), danPOSIXlt
, yang menyimpan daftar hari, bulan, tahun, jam, menit, detik, dll.strptime
adalah fungsi untuk secara langsung mengubah vektor karakter (dari berbagai format) kePOSIXlt
format.as.POSIXlt
mengonversi berbagai tipe data menjadiPOSIXlt
. Ia mencoba menjadi cerdas dan melakukan hal yang masuk akal - dalam kasus karakter, ia bertindak sebagai pembungkusstrptime
.as.POSIXct
mengonversi berbagai tipe data menjadiPOSIXct
. Ia juga mencoba menjadi cerdas dan melakukan hal yang masuk akal - dalam kasus karakter, ia berjalanstrptime
terlebih dahulu, kemudian melakukan konversi dariPOSIXlt
menjadiPOSIXct
.Masuk akal jika
strptime
lebih cepat, karenastrptime
hanya menangani input karakter sementara yang lain mencoba menentukan metode mana yang akan digunakan dari tipe input. Ini juga harus sedikit lebih aman karena menyerahkan data yang tidak terduga hanya akan memberikan kesalahan, daripada mencoba melakukan hal cerdas yang mungkin bukan yang Anda inginkan.sumber
Ada dua tipe POSIXt, POSIXct dan POSIXlt. "ct" dapat berarti waktu kalender, ini menyimpan jumlah detik sejak asal. "lt", atau waktu lokal, menyimpan tanggal sebagai daftar atribut waktu (seperti "hour" dan "mon"). Coba contoh ini:
sumber