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:

python
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:

text
     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        True

Mari kita bedah baris per baris:

  1. Baris 4 (pd.to_datetime([...])): daftar teks tanggal diubah menjadi tipe datetime64. Langkah ini wajib — aksesor dt menolak bekerja pada kolom bertipe objek/string, dan pandas tidak pernah menebak sendiri.
  2. Baris 12 (dt.day_name()): mengambil nama hari dalam Inggris — Jumat sampai Minggu. Kolom ini cocok untuk dibaca manusia; untuk model, angka lebih tepat.
  3. 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.
  4. Baris 14 (>= 5): perbandingan sederhana menghasilkan kolom boolean is_weekend — Sabtu (5) dan Minggu (6) bernilai True. 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:

python
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:

text
     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                        3

Apa yang dilakukan tiap baris penting:

  1. 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.
  2. 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.
  3. Baris 18 (isin(hari_libur)): memeriksa setiap tanggal terhadap daftar libur sekaligus, menghasilkan kolom boolean. Baris 1 Januari bernilai True — penjelas resmi anjloknya penjualan 95 gelas pada tabel sebelumnya.
  4. Baris 19 ((tanggal - acuan).dt.days): pengurangan dua kolom datetime menghasilkan durasi bertipe timedelta; .dt.days mengambil 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_datetime mengubah teks tanggal menjadi tipe datetime64; tanpa langkah ini, seluruh aksesor dt tidak bisa dipakai.
  • Komponen mingguan: dt.day_name() untuk nama hari, dt.dayofweek untuk angka 0-6 (Senin = 0), dan perbandingan >= 5 untuk is_weekend.
  • Komponen tahunan dan penanda: dt.month, dt.quarter, serta isin(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.

Referensi #

  1. pandas — pandas.to_datetime
  2. pandas — Time Series Data