Perbedaan antara as.POSIXct / as.POSIXlt dan strptime untuk mengonversi vektor karakter ke POSIXct / POSIXlt

94

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?

RJ-
sumber
4
Jika Anda ingin melihat kode apa yang dipanggil saat memanggil as.POSIXctdan as.POSIXltpada vektor karakter, lihat as.POSIXct.defaultdan as.POSIXlt.character, masing-masing.
Joshua Ulrich

Jawaban:

154

Nah, fungsinya melakukan hal yang berbeda.

Pertama, ada dua implementasi internal tanggal / waktu POSIXct:, yang menyimpan detik sejak zaman UNIX (+ beberapa data lain), dan POSIXlt, yang menyimpan daftar hari, bulan, tahun, jam, menit, detik, dll.

strptimeadalah fungsi untuk secara langsung mengubah vektor karakter (dari berbagai format) ke POSIXltformat.

as.POSIXltmengonversi berbagai tipe data menjadi POSIXlt. Ia mencoba menjadi cerdas dan melakukan hal yang masuk akal - dalam kasus karakter, ia bertindak sebagai pembungkus strptime.

as.POSIXctmengonversi berbagai tipe data menjadi POSIXct. Ia juga mencoba menjadi cerdas dan melakukan hal yang masuk akal - dalam kasus karakter, ia berjalan strptimeterlebih dahulu, kemudian melakukan konversi dari POSIXltmenjadiPOSIXct .

Masuk akal jika strptimelebih cepat, karena strptimehanya 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.

Fhnuzoag
sumber
jawaban yang bagus. Adakah kesepakatan tentang praktik terbaik untuk mengumpulkan data untuk tujuan pemodelan atau visualisasi data?
dre
22

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:

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
kuong
sumber