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.
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:
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:
- Baris 4-8: DataFrame
penjualandibangun dengan kolomtanggalberisi empat stringdd/mm/yyyy. - Baris 12-13: konversi tanpa
formatmenghasilkan pembacaan gaya AS;salah_baca.iloc[0]menunjukkan2026-05-01, bukan2026-01-05. - Baris 16: konversi ulang dengan
format="%d/%m/%Y"; hasilnya ditugaskan kembali ke kolomtanggal, sehinggapenjualan.dtypesdi baris 19 kini melaporkandatetime64[us]. - 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:
| Kode | Arti | Contoh pada data kita |
|---|---|---|
%d | Hari, dua digit | 05 |
%m | Bulan, dua digit | 01 |
%Y | Tahun, empat digit | 2026 |
%H | Jam 00-23 | 09 |
%M | Menit, dua digit | 30 |
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.