Data nyata jarang datang dengan satu format tanggal yang rapi: hasil ekspor sistem lama bisa mencampur teks ISO, urutan hari/bulan/tahun, dan tanggal yang lengkap dengan jam pada satu kolom yang sama. pandas menyiapkan tiga parameter pd.to_datetime() untuk situasi ini: format untuk menentukan pola penguraian, dayfirst untuk mengatur arah pembacaan angka ambigu, dan errors untuk memilih reaksi ketika ada teks yang tidak bisa diurai. Chapter ini mempraktikkan ketiganya pada data yang sengaja dibuat berantakan. Setelah chapter ini, kolom tanggal apa pun seharusnya tidak lagi menghentikan pekerjaan kita.

Mengurai Format Campuran dengan format=“mixed” #

Series campur pada baris 4-8 berisi tiga gaya penulisan sekaligus: ISO 2026-01-05, gaya Indonesia 17/01/2026, dan 2026/01/15 09:30. Memberikan satu format tunggal jelas tidak mungkin, karena itu baris 11 memakai format="mixed": pandas menentukan format untuk setiap elemen secara terpisah. Nilai "17/01/2026" terurai dengan benar menjadi 17 Januari karena angka 17 tidak mungkin menjadi bulan, sehingga pandas tidak perlu diberi petunjuk tambahan. Hasil akhirnya adalah Series datetime64[us] berisi tiga titik waktu Januari 2026.

python
import pandas as pd

# Data hasil ekspor sistem lama: format tanggal tidak seragam
campur = pd.Series([
    "2026-01-05",         # ISO: tahun-bulan-hari
    "17/01/2026",         # gaya Indonesia: hari/bulan/tahun
    "2026/01/15 09:30",   # tahun di depan, ada jam
])

# format="mixed": pandas menentukan format tiap baris secara terpisah
hasil = pd.to_datetime(campur, format="mixed")
print(hasil)

# dayfirst=True membaca bagian pertama sebagai hari, bukan bulan
angka = pd.Series(["03/04/2026", "05/04/2026"])
print("\nTanpa dayfirst :", pd.to_datetime(angka).tolist())
print("Dengan dayfirst:", pd.to_datetime(angka, dayfirst=True).tolist())

# errors="coerce": teks yang tidak bisa diurai menjadi NaT, bukan error
rusak = pd.Series(["2026-02-01", "bukan tanggal", "2026-02-03"])
print("\nerrors=coerce:")
print(pd.to_datetime(rusak, errors="coerce"))

# errors="raise" (default): program berhenti saat ada teks tidak valid
try:
    pd.to_datetime(rusak)
except ValueError as exc:
    print("\nerrors=raise memunculkan ValueError:")
    print(str(exc).splitlines()[0])

Output yang Dihasilkan:

text
0   2026-01-05 00:00:00
1   2026-01-17 00:00:00
2   2026-01-15 09:30:00
dtype: datetime64[us]

Tanpa dayfirst : [Timestamp('2026-03-04 00:00:00'), Timestamp('2026-05-04 00:00:00')]
Dengan dayfirst: [Timestamp('2026-04-03 00:00:00'), Timestamp('2026-04-05 00:00:00')]

errors=coerce:
0   2026-02-01
1          NaT
2   2026-02-03
dtype: datetime64[us]

errors=raise memunculkan ValueError:
time data "bukan tanggal" doesn't match format "%Y-%m-%d". You might want to try:

Mari kita telaah bagian-bagian penting skrip di atas:

  1. Baris 4-11: tiga format berbeda diurai dengan format="mixed"; blok output pertama menampilkan 5 Januari, 17 Januari, dan 15 Januari pukul 09:30.
  2. Baris 15-17: perbandingan dayfirst pada teks yang benar-benar ambigu ("03/04/2026").
  3. Baris 20-22: errors="coerce" mengubah teks rusak menjadi NaT alih-alih menghentikan program.
  4. Baris 25-29: errors="raise" (bawaan) dibungkus try/except agar pesan ValueError-nya bisa dicetak tanpa membuat skrip berhenti.

Jika seluruh teks berformat ISO8601 tetapi tingkat detailnya berbeda-beda (ada yang memuat jam, ada yang tidak), argumen format="ISO8601" juga tersedia sebagai pilihan yang lebih ketat daripada "mixed".

Mengarahkan Pembacaan dengan dayfirst #

Teks "03/04/2026" ambigu sejati: 3 April atau 4 Maret, keduanya sah secara kalender. Tanpa petunjuk, pandas memilih gaya AS sehingga pd.to_datetime(angka) menghasilkan 4 Maret dan 4 Mei (blok output “Tanpa dayfirst”). Argumen dayfirst=True membalik urutan tersebut menjadi 3 April dan 5 April, sesuai kebiasaan penulisan Indonesia. Perhatikan bahwa dayfirst hanya berperan ketika format tidak diberikan secara eksplisit; jika format sudah ditulis, format itulah yang dipatuhi.

Menampung Teks Rusak dengan errors #

Kolom tanggal hasil input manual hampir pasti memuat salah ketik. Parameter errors menentukan reaksi pandas terhadap baris seperti "bukan tanggal":

Nilai errorsPerilaku saat ada teks yang gagal diurai
"raise" (bawaan)Memunculkan ValueError dan menghentikan program
"coerce"Baris yang gagal menjadi NaT, baris lain tetap berhasil

Baris 20-22 memakai "coerce" dan hasilnya terlihat di output: "2026-02-01" dan "2026-02-03" tetap menjadi waktu, sementara "bukan tanggal" menjadi NaT. Baris 25-29 lalu mendemonstrasikan perilaku bawaan "raise" di dalam blok try/except; pesan yang muncul menyebut teks penyebab masalah beserta format yang dicoba pandas. Pola kerja yang sehat: pakai "coerce" saat membersihkan data, lalu periksa baris NaT dengan ser.isna(), bukan membiarkannya tanpa diketahui.

Dokumentasi resmi yang relevan: pandas.to_datetime , User Guide: Time series , dan What’s new in pandas 3.0.0 .

Dengan kolom tanggal kini benar-benar bertipe datetime64, kita siap memindahkannya ke posisi yang membuka seluruh fitur deret waktu: index DataFrame — topik Chapter Datetime Index.