Kolom tanggal adalah tipe data paling kaya informasi yang paling sering dibiarkan menganggur. Sebagai teks, “2026-01-03” tidak memberi tahu model apa pun — padahal di baliknya tersimpan keterangan bahwa hari itu Sabtu, awal bulan, dan dua hari setelah tahun baru. Pembuatan fitur tanggal membongkar satu kolom tanggal menjadi banyak kolom numerik dan boolean yang langsung bisa dipakai model. Pada chapter ini kita gunakan aksesor dt dari pandas untuk mengekstrak komponen kalender, menandai akhir pekan dan hari libur, lalu menghitung selisih waktu terhadap tanggal acuan.
Komponen Kalender Mingguan #
Data kita adalah catatan penjualan harian Toko Kopi Kita selama sepuluh hari akhir Desember sampai awal Januari. Pertanyaan pertama yang bisa dijawak kolom tanggal: hari apa itu, dan apakah akhir pekan? Kita ekstrak dengan aksesor dt:
import pandas as pd
transaksi = pd.DataFrame({
"tanggal": pd.to_datetime([
"2025-12-26", "2025-12-27", "2025-12-28", "2025-12-29",
"2025-12-30", "2025-12-31", "2026-01-01", "2026-01-02",
"2026-01-03", "2026-01-04",
]),
"gelas_terjual": [145, 160, 170, 150, 155, 190, 95, 130, 175, 165],
})
transaksi["nama_hari"] = transaksi["tanggal"].dt.day_name()
transaksi["hari_dalam_minggu"] = transaksi["tanggal"].dt.dayofweek
transaksi["is_weekend"] = transaksi["hari_dalam_minggu"] >= 5
print(transaksi)Output yang Dihasilkan:
tanggal gelas_terjual nama_hari hari_dalam_minggu is_weekend
0 2025-12-26 145 Friday 4 False
1 2025-12-27 160 Saturday 5 True
2 2025-12-28 170 Sunday 6 True
3 2025-12-29 150 Monday 0 False
4 2025-12-30 155 Tuesday 1 False
5 2025-12-31 190 Wednesday 2 False
6 2026-01-01 95 Thursday 3 False
7 2026-01-02 130 Friday 4 False
8 2026-01-03 175 Saturday 5 True
9 2026-01-04 165 Sunday 6 TrueMari kita bedah baris per baris:
- Baris 4 (
pd.to_datetime([...])): daftar teks tanggal diubah menjadi tipedatetime64. Langkah ini wajib — aksesordtmenolak bekerja pada kolom bertipe objek/string, dan pandas tidak pernah menebak sendiri. - Baris 12 (
dt.day_name()): mengambil nama hari dalam Inggris — Jumat sampai Minggu. Kolom ini cocok untuk dibaca manusia; untuk model, angka lebih tepat. - Baris 13 (
dt.dayofweek): mengubah nama hari menjadi angka 0-6 dengan Senin = 0 sampai Minggu = 6, sesuai konvensi ISO. Sekarang “urutan hari” menjadi hal yang bisa dihitung model. - Baris 14 (
>= 5): perbandingan sederhana menghasilkan kolom booleanis_weekend— Sabtu (5) dan Minggu (6) bernilaiTrue. Perhatikan datanya: kedua akhir pekan memang mencatat penjualan tertinggi (160-175 gelas), pola yang kini terlihat berkat kolom baru ini.
Pola menarik juga muncul pada baris ke-7: 1 Januari hanya menjual 95 gelas padahal hari kerja biasa berkisar 130-155. Ada kejadian khusus hari itu — dan penandanya adalah hari libur.
Bulan, Kuartal, Hari Libur, dan Selisih Waktu #
Tiga feature berikutnya mengambil skala yang lebih besar. dt.month dan dt.quarter menandai posisi dalam kalender tahunan; daftar hari libur kita simpan sebagai kumpulan tanggal lalu dicocokkan dengan isin(); dan selisih waktu dihitung terhadap satu tanggal acuan:
import pandas as pd
transaksi = pd.DataFrame({
"tanggal": pd.to_datetime([
"2025-12-26", "2025-12-27", "2025-12-28", "2025-12-29",
"2025-12-30", "2025-12-31", "2026-01-01", "2026-01-02",
"2026-01-03", "2026-01-04",
]),
})
hari_libur = pd.to_datetime(["2025-12-25", "2026-01-01"])
acuan = pd.Timestamp("2026-01-01")
fitur = pd.DataFrame({
"tanggal": transaksi["tanggal"],
"bulan": transaksi["tanggal"].dt.month,
"quarter": transaksi["tanggal"].dt.quarter,
"is_hari_libur": transaksi["tanggal"].isin(hari_libur),
"selisih_dari_tahun_baru": (transaksi["tanggal"] - acuan).dt.days,
})
print(fitur)Output yang Dihasilkan:
tanggal bulan quarter is_hari_libur selisih_dari_tahun_baru
0 2025-12-26 12 4 False -6
1 2025-12-27 12 4 False -5
2 2025-12-28 12 4 False -4
3 2025-12-29 12 4 False -3
4 2025-12-30 12 4 False -2
5 2025-12-31 12 4 False -1
6 2026-01-01 1 1 True 0
7 2026-01-02 1 1 False 1
8 2026-01-03 1 1 False 2
9 2026-01-04 1 1 False 3Apa yang dilakukan tiap baris penting:
- Baris 11 (
hari_libur = ...): daftar hari libur didefinisikan eksplisit — Natal dan Tahun Baru. Daftar ini sengaja sederhana dan statis; pada proyek nyata kita mengelolanya sebagai berkas kecil yang diperbarui tiap tahun. - Baris 12 (
acuan = pd.Timestamp(...)): titik pembanding untuk menghitung selisih. Acuan boleh tanggal apa pun yang bermakna bagi masalah — awal tahun, tanggal peluncuran produk, atau hari prediksi dibuat. - Baris 18 (
isin(hari_libur)): memeriksa setiap tanggal terhadap daftar libur sekaligus, menghasilkan kolom boolean. Baris 1 Januari bernilaiTrue— penjelas resmi anjloknya penjualan 95 gelas pada tabel sebelumnya. - Baris 19 (
(tanggal - acuan).dt.days): pengurangan dua kolom datetime menghasilkan durasi bertipetimedelta;.dt.daysmengambil bilangan bulat harinya. Nilainya bertanda: -6 berarti enam hari sebelum tahun baru, +3 berarti tiga hari setelahnya. Model kini bisa belajar efek “menjauhi atau mendekati momen tertentu”.
Rangkuman #
pd.to_datetimemengubah teks tanggal menjadi tipedatetime64; tanpa langkah ini, seluruh aksesordttidak bisa dipakai.- Komponen mingguan:
dt.day_name()untuk nama hari,dt.dayofweekuntuk angka 0-6 (Senin = 0), dan perbandingan>= 5untukis_weekend. - Komponen tahunan dan penanda:
dt.month,dt.quarter, sertaisin(daftar_libur)untuk kolom boolean hari libur. - Selisih waktu dihitung dengan pengurangan tanggal lalu
.dt.days; pilih tanggal acuan yang bermakna bagi masalah, dan nilainya boleh negatif.
Satu kolom tanggal kini menjadi tujuh feature yang informatif. Tetapi untuk deret waktu, masih ada sumber informasi yang lebih dekat lagi: nilai-nilai kemarin, kemarin lusanya, dan rata-rata beberapa hari terakhir. Kita bangun fitur lag dan window pada chapter berikutnya.