Tanggal di R adalah hitungan hari yang memakai kostum
Untuk mengubah string menjadi tanggal sungguhan, pakai as.Date(); untuk mendapatkan hari ini, pakai Sys.Date(). Di balik keduanya ada trik sederhana: class Date di R hanyalah sebuah angka, yaitu jumlah hari sejak 1 Januari 1970, yang memakai kostum sehingga dicetak seperti tanggal kalender. Kamu bisa melepas kostumnya dengan unclass():
Angka 20672 itu adalah hitungan hari mentahnya, dan itulah yang membuat semua hal lain di halaman ini bekerja: perbandingan, pengurangan, dan deret semuanya hanya matematika integer di baliknya. Kostumnyalah yang membuatnya bisa dipakai: angka yang sama dicetak sebagai tanggal, diformat sebagai tanggal, dan digambar di sumbu tanggal.
as.Date() dengan senang hati mengurai tata letak ISO "YYYY-MM-DD" tanpa bantuan, salah satu dari beberapa alasan bagus untuk menyimpan tanggal dengan cara itu di file-mu. Satu kebiasaan yang perlu dibangun sejak awal: parsing yang gagal mengembalikan NA diam-diam, bukan error, jadi selalu lihat sekilas hasilnya setelah mengurai sesuatu yang baru.
String yang hanya terlihat seperti tanggal tetaplah string: "2026-08-07" < "2026-11-01" kebetulan dibandingkan dengan benar karena urutan ISO sama dengan urutan abjad, tapi "07/08/2026" diurutkan secara ngawur. Konversi dulu, baru bandingkan.
Mengurai tata letak lain dengan format =
Dunia tidak menulis tanggal dalam format ISO. Untuk semua bentuk lainnya, as.Date() menerima argumen format =: sebuah resep yang menggambarkan string yang masuk, disusun dari kode %.
Ketiganya menghasilkan hari yang sama. Resepnya harus cocok persis dengan string-nya, termasuk pemisahnya: "%d/%m/%Y" tidak akan bisa mengurai "07-08-2026". Kode yang benar-benar akan kamu pakai:
| Kode | Arti | Contoh |
|---|---|---|
%Y | Tahun 4 digit | 2026 |
%y | Tahun 2 digit | 26 |
%m | Nomor bulan | 08 |
%d | Tanggal dalam bulan | 07 |
%b | Nama bulan singkat | Aug |
%B | Nama bulan lengkap | August |
%a | Nama hari singkat | Fri |
%A | Nama hari lengkap | Friday |
%H | Jam (00-23) | 14 |
%M | Menit | 30 |
%S | Detik | 05 |
Jebakan klasiknya adalah "07/08/2026" itu sendiri: hari/bulan/tahun di sebagian besar dunia, bulan/hari/tahun di Amerika Serikat, dan R tidak bisa menebak mana yang dimaksud file-mu. Lebih buruk lagi, tebakan yang salah sering kali "berhasil" (kedua cara baca sama-sama tanggal yang valid) sampai tanggal 13 suatu bulan muncul dan hasil parsing-nya NA (tidak ada bulan ke-13). Ketahui konvensi datamu sebelum menulis resepnya.
Memformat tanggal untuk output
format() adalah bayangan cermin as.Date(): kode % yang sama, berjalan ke arah sebaliknya, Date masuk, string keluar.
Pakai ini untuk judul laporan, label, dan nama file: format(Sys.Date(), "%Y-%m-%d") menghasilkan nama yang terurut secara kronologis. Dua detail yang perlu diketahui: %d menambahkan nol di depan ("August 07"), dan %B/%A menghasilkan nama dalam bahasa pengaturan sistemmu; sesi yang diatur ke bahasa Jerman mencetak "Freitag", bukan "Friday". Simpan pemformatan di ujung-ujung skripmu, untuk dibaca manusia; di dalam skrip, biarkan tanggal tetap sebagai Date.
Aritmetika tanggal dan deret
Karena Date adalah hitungan hari, aritmetika bekerja seperti yang kamu harapkan. Mengurangkan dua tanggal menghasilkan objek difftime:
Tiga kebiasaan yang bisa diambil dari blok itu. Pertama, bungkus difftime dengan as.numeric() sebelum memakainya dalam perhitungan, karena difftime membawa atribut satuan yang bisa mengejutkan perhitungan berikutnya. Kedua, saat satuannya penting, nyatakan dengan difftime(units = ) alih-alih menerima apa pun yang dipilih R. Ketiga, menambahkan angka biasa berarti menambahkan hari; tidak ada + 1 month di base R, karena "satu bulan" bukan jumlah hari yang tetap.
Untuk melangkah sesuai kalender, pakai seq(), yang memahami "day", "week", "month", "quarter", dan "year":
Deret bulanan adalah alat standar untuk periode laporan dan pembagian sumbu. Satu keanehan: mulai deret bulanan pada tanggal 31, maka R tetap menghitung hari sungguhan melewati bulan-bulan yang tidak punya tanggal 31, sehingga entri "Februari" jatuh di awal Maret. Jadikan tanggal 1 sebagai patokan deret bulanan dan turunkan tanggal lainnya dari situ.
Mengambil bagian-bagian tanggal
Base R punya dua pengambil praktis dan satu idiom umum. weekdays() dan months() mengembalikan nama; untuk angka, lakukan perjalanan bolak-balik lewat format():
Langkah format() lalu as.integer() terlihat berputar-putar, tapi itulah idiom standar base R, dan sudah tervektorisasi: berikan satu kolom penuh berisi tanggal dan kamu mendapat satu kolom penuh berisi tahun. Itulah yang kamu inginkan setelah mengimpor dataset bertanggal dari file CSV: uraikan kolom tanggalnya sekali dengan as.Date(), lalu turunkan kolom tahun dan bulan untuk pengelompokan.
Saat hari saja tidak cukup: POSIXct, dan lubridate
Date tidak mengenal jam. Begitu datamu punya timestamp (entri log, pembacaan sensor, "pesanan dibuat pukul 14.32"), kamu butuh POSIXct, class tanggal-waktu di R: detik sejak 1970, bukan hari, dan memperhitungkan zona waktu.
Semuanya tetap berlaku: kode % yang sama (sekarang termasuk %H, %M, %S) bekerja untuk parsing dan format(), pengurangan menghasilkan difftime, Sys.time() berarti "sekarang". Beban barunya adalah zona waktu: berikan tz = secara eksplisit saat parsing, karena kalau tidak, dua sesi di zona berbeda akan membaca string yang sama sebagai dua titik waktu yang berbeda. Dan tahan diri untuk tidak menyimpan data kalender sebagai POSIXct "untuk berjaga-jaga": ulang tahun yang disimpan sebagai tengah malam di suatu zona bisa tercetak sebagai hari sebelumnya di zona lain, bug yang benar-benar menyiksa untuk dilacak. Hari utuh: Date. Titik waktu: POSIXct.
Terakhir, package lubridate adalah wajah yang lebih ramah untuk semua hal di atas yang dipakai sebagian besar kode tidyverse, layak dipakai begitu mekanisme dasarnya sudah kamu pahami:
library(lubridate)
ymd("2026-08-07") # order-based parsing: no format string
mdy("08/07/2026") # ...you just say which order the parts come in
dmy("7 August 2026")
floor_date(Sys.Date(), "month") # snap to the start of the period
ymd(), mdy(), dan dmy() mengganti resep format dengan pernyataan sederhana tentang urutan bagiannya, dan floor_date() menyelesaikan "kelompokkan timestamp ini per bulan" dalam satu pemanggilan. lubridate berjalan di atas class Date/POSIXct yang sama: setir yang lebih baik, bukan mesin yang berbeda.
Yang kamu bawa pulang
Dateadalah hitungan hari sejak 1970-01-01 yang didandani agar tercetak seperti tanggal;unclass()menampilkan angkanya.as.Date("2026-08-07")langsung mengurai ISO; bentuk lain butuh resepformat =dari kode%, dan parsing yang gagal mengembalikanNAdiam-diam.format(date, "...")adalah kebalikannya: kode yang sama, menghasilkan string untuk ditampilkan.- Pengurangan menghasilkan difftime; atur
units =secara eksplisit dan pakaias.numeric()sebelum menghitung.+ nmenambahkan hari; untuk bulan, pakaiseq(by = "month"). weekdays(),months(), dan idiomas.integer(format(...))mengambil bagian-bagian tanggal, sudah tervektorisasi.Dateuntuk hari utuh,POSIXct(dengantzeksplisit) untuk timestamp; lubridate membuat keduanya lebih ramah.
Berikutnya: apa yang harus dilakukan saat R membentakmu, yaitu membaca pesan error dan melakukan debug secara metodis.
Pertanyaan yang sering diajukan
Bagaimana cara mengubah string menjadi tanggal di R?
Dengan as.Date(). Kalau string-nya berformat ISO, langsung berhasil: as.Date("2026-08-07"). Tata letak lain butuh resep format = yang disusun dari kode %: as.Date("07/08/2026", format = "%d/%m/%Y"). Parsing yang gagal mengembalikan NA, bukan error, jadi periksa hasilnya.
Bagaimana cara mendapatkan tanggal hari ini di R?
Sys.Date() mengembalikan hari ini sebagai objek Date; Sys.time() mengembalikan tanggal dan waktu saat ini sebagai POSIXct. Keduanya berasal dari jam dan pengaturan zona waktu komputermu.
Bagaimana cara menghitung selisih dua tanggal di R?
Kurangkan keduanya: as.Date("2026-08-07") - as.Date("2026-01-01") menghasilkan difftime sebesar 218 hari. Bungkus dengan as.numeric() untuk memakai angkanya dalam perhitungan, atau panggil difftime(d1, d2, units = "weeks") untuk memilih sendiri satuannya alih-alih membiarkan R yang memilih.
Apa perbedaan Date dan POSIXct di R?
Date menyimpan hari utuh (di dalamnya: jumlah hari sejak 1970-01-01) dan tidak tahu apa-apa soal jam atau zona waktu. POSIXct menyimpan satu titik waktu (detik sejak 1970) dan memperhitungkan zona waktu. Pakai Date untuk data kalender seperti ulang tahun dan tenggat; pakai POSIXct hanya saat jam dalam sehari penting, seperti timestamp dan log.