Tanggal "05/01/2026" dapat dibaca 5 Januari oleh orang Indonesia, tetapi 1 Mei oleh sistem yang mengikuti urutan bulan-hari gaya Amerika. Konversi teks ke datetime yang salah arah akan merusak seluruh analisis di belakangnya, sehingga cara pandas mengurai string layak dipahami dengan sengaja. Chapter ini membedah pd.to_datetime(): inferensi otomatis beserta jebakannya, penentuan format eksplisit, dan konversi tanggal yang lengkap dengan jam. Contoh tetap memakai data penjualan toko yang sama seperti chapter sebelumnya.

Titik Awal: Kolom Tanggal Berupa Teks #

Rekap penjualan berikut menyimpan tanggal sebagai teks gaya Indonesia, yaitu hari/bulan/tahun. Baris 9 mencetak penjualan.dtypes dan menunjukkan ketiga kolom masih berupa str dan int64 — belum ada yang bisa dihitung secara kalender. Skrip lengkapnya seperti di bawah ini, dan setiap langkahnya kita bedah setelah output.

Inferensi Otomatis dan Jebakannya #

Tanpa argumen format, pandas mencoba menebak pola tanggal dari data. Baris 12 memanggil pd.to_datetime() tanpa format, dan hasilnya di blok output: nilai "05/01/2026" menjadi 2026-05-01, yaitu 1 Mei. pandas mengikuti konvensi gaya AS (bulan dahulu) untuk teks yang ambigu, sehingga data Indonesia yang berarti 5 Januari terbaca salah. Inferensi memang nyaman, tetapi untuk urutan hari/bulan/tahun kita wajib memberi tahu pandas secara eksplisit.

python
import pandas as pd

# Rekap penjualan toko: tanggal ditulis gaya Indonesia, hari/bulan/tahun
penjualan = pd.DataFrame({
    "tanggal": ["05/01/2026", "06/01/2026", "07/01/2026", "08/01/2026"],
    "item": ["Beras 5 kg", "Minyak 2 L", "Gula 1 kg", "Tepung 1 kg"],
    "terjual": [12, 8, 15, 10],
})
print(penjualan.dtypes)

# Tanpa format eksplisit, pandas membaca bagian pertama sebagai bulan (gaya AS)
salah_baca = pd.to_datetime(penjualan["tanggal"])
print("\nTanpa format :", salah_baca.iloc[0], "|", salah_baca.iloc[1])

# Format eksplisit: %d = hari, %m = bulan, %Y = tahun 4 digit
penjualan["tanggal"] = pd.to_datetime(penjualan["tanggal"], format="%d/%m/%Y")
print("Dengan format:", penjualan["tanggal"].iloc[0], "|", penjualan["tanggal"].iloc[1])
print("\nSetelah konversi:")
print(penjualan.dtypes)
print(penjualan)

# Format lain yang umum: tahun di depan, lengkap dengan jam dan menit
waktu = pd.to_datetime(
    ["2026/01/05 09:30", "2026/01/06 14:05"], format="%Y/%m/%d %H:%M"
)
print("\nHasil format %Y/%m/%d %H:%M:")
print(waktu)

Output yang Dihasilkan:

text
tanggal      str
item         str
terjual    int64
dtype: object

Tanpa format : 2026-05-01 00:00:00 | 2026-06-01 00:00:00
Dengan format: 2026-01-05 00:00:00 | 2026-01-06 00:00:00

Setelah konversi:
tanggal    datetime64[us]
item                  str
terjual             int64
dtype: object
     tanggal         item  terjual
0 2026-01-05   Beras 5 kg       12
1 2026-01-06   Minyak 2 L        8
2 2026-01-07    Gula 1 kg       15
3 2026-01-08  Tepung 1 kg       10

Hasil format %Y/%m/%d %H:%M:
DatetimeIndex(['2026-01-05 09:30:00', '2026-01-06 14:05:00'], dtype='datetime64[us]', freq=None)

Mari kita telaah bagian-bagian penting skrip di atas:

  1. Baris 4-8: DataFrame penjualan dibangun dengan kolom tanggal berisi empat string dd/mm/yyyy.
  2. Baris 12-13: konversi tanpa format menghasilkan pembacaan gaya AS; salah_baca.iloc[0] menunjukkan 2026-05-01, bukan 2026-01-05.
  3. Baris 16: konversi ulang dengan format="%d/%m/%Y"; hasilnya ditugaskan kembali ke kolom tanggal, sehingga penjualan.dtypes di baris 19 kini melaporkan datetime64[us].
  4. Baris 20: print(penjualan) menampilkan tabel yang kolom tanggalnya sudah menjadi waktu dan nilai Januari terbaca dengan benar.

Kode Format yang Umum Dipakai #

Argumen format menerima kode bergaya strftime dari modul datetime Python. Kombinasi "%d/%m/%Y" berarti hari, tanda garis miring, bulan, tanda garis miring, lalu tahun empat digit — persis seperti teks pada kolom kita. Kode yang paling sering terpakai:

KodeArtiContoh pada data kita
%dHari, dua digit05
%mBulan, dua digit01
%YTahun, empat digit2026
%HJam 00-2309
%MMenit, dua digit30

Baris lain dari teks yang tidak cocok dengan format akan membuat pd.to_datetime() mengeluh — perilaku itu diatur parameter errors yang dibahas pada Chapter berikutnya.

Tanggal Lengkap dengan Jam #

Baris 23-25 memakai format "%Y/%m/%d %H:%M" untuk teks seperti "2026/01/05 09:30". Hasilnya berupa DatetimeIndex ber-dtype datetime64[us] yang menyimpan pukul 09:30 dan 14:05, sehingga perbandingan jam antar-transaksi sudah bisa dilakukan. Jika data memuat detik, tambahkan kode %S pada format yang sama.

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

Satu format seragam memang ideal, tetapi data nyata sering bercampur antar-sumber. Chapter berikutnya menyiapkan alat untuk situasi itu: parameter format="mixed", dayfirst, dan errors.