Kolom tanggal yang masih berupa teks hanya bisa dibandingkan huruf demi huruf: mencari transaksi sebelum 1 Maret, mengurutkan data per minggu, atau menghitung selisih dua tanggal menjadi pekerjaan yang rawan salah. pandas menyediakan tipe data khusus bernama datetime64 yang menyimpan waktu sebagai angka, sehingga operasi semacam itu menjadi sederhana dan konsisten. Pada Chapter ini kita mengenal dtype datetime64, objek Timestamp untuk satu titik waktu, nilai NaT untuk data waktu yang hilang, serta accessor .dt untuk membongkar komponen waktu. Seluruh contoh diuji pada pandas 3.0.6, sehingga perilaku yang kita amati adalah perilaku versi terbaru.
Kenapa Waktu Membutuhkan Dtype Tersendiri #
Ketika tanggal tersimpan sebagai string, perbandingan dilakukan terhadap urutan karakter, bukan urutan kalender. String "2026-03-01" dianggap lebih kecil daripada "2026-1-5" karena urutan karakternya memang demikian, padahal secara kalender kedua penulisan itu merujuk bulan yang sama. dtype datetime64 menghindari masalah tersebut dengan menyimpan setiap nilai sebagai jarak dari sebuah titik acuan, sehingga urutan angka selalu sama dengan urutan waktu. Setelah kolom ber-dtype datetime64, pandas membuka sejumlah kemampuan:
- Mengurutkan dan membandingkan tanggal sesuai kalender.
- Melakukan aritmetika waktu, misalnya menambah 7 hari ke setiap baris.
- Mengambil komponen seperti tahun, bulan, dan nama hari.
- Menjalankan fitur deret waktu seperti
resample()danrolling().
Dua kemampuan terakhir menjadi inti chapter-chapter berikutnya; untuk saat ini kita fokus mengenali dtype-nya terlebih dahulu.
Mengubah Kolom Teks Menjadi datetime64 #
Fungsi pd.to_datetime() adalah pintu masuk utama untuk mengubah teks menjadi waktu. Skrip berikut membangun tabel pesanan toko dengan kolom tanggal berupa string, mengonversi kolom tersebut, lalu menampilkan dtype sebelum dan sesudah konversi.
import pandas as pd
# Catatan pesanan toko: kolom tanggal masih berupa teks (dtype str)
pesanan = pd.DataFrame({
"id_pesanan": ["TRX-001", "TRX-002", "TRX-003"],
"tanggal": ["2026-01-05", "2026-01-06", "2026-01-08"],
"item": ["Beras 5 kg", "Minyak 2 L", "Gula 1 kg"],
"total": [68000, 39000, 17500],
})
print("Sebelum konversi:")
print(pesanan.dtypes)
# pd.to_datetime mengubah kolom teks menjadi dtype datetime64
pesanan["tanggal"] = pd.to_datetime(pesanan["tanggal"])
print("\nSetelah konversi:")
print(pesanan.dtypes)
# Satu nilai waktu direpresentasikan oleh objek Timestamp
t = pd.Timestamp("2026-01-15")
print("\nTimestamp:", t)
print("tahun:", t.year, "| bulan:", t.month, "| hari:", t.day)
print("nama hari:", t.day_name(), "| resolusi:", t.unit)
# Nilai waktu yang hilang direpresentasikan sebagai NaT
waktu = pd.to_datetime(pd.Series(["2026-01-05", None, "2026-02-14"]))
print("\nSeries waktu berisi NaT untuk data hilang:")
print(waktu)
# Komponen waktu diakses lewat accessor .dt
valid = pd.to_datetime(pd.Series(["2026-01-05", "2026-02-14", "2026-03-01"]))
print("\nBulan:", valid.dt.month.tolist())
print("Nama hari:", valid.dt.day_name().tolist())
print("Awal bulan:", valid.dt.is_month_start.tolist())Output yang Dihasilkan:
Sebelum konversi:
id_pesanan str
tanggal str
item str
total int64
dtype: object
Setelah konversi:
id_pesanan str
tanggal datetime64[us]
item str
total int64
dtype: object
Timestamp: 2026-01-15 00:00:00
tahun: 2026 | bulan: 1 | hari: 15
nama hari: Thursday | resolusi: us
Series waktu berisi NaT untuk data hilang:
0 2026-01-05
1 NaT
2 2026-02-14
dtype: datetime64[us]
Bulan: [1, 2, 3]
Nama hari: ['Monday', 'Saturday', 'Sunday']
Awal bulan: [False, False, True]Mari kita telaah bagian-bagian penting skrip di atas:
- Baris 4-9: DataFrame
pesanandibangun dari dictionary; kolomtanggalberisi string, sehinggapesanan.dtypesmenampilkanstruntuk kolom tersebut (blok output pertama). - Baris 14:
pd.to_datetime()mengurai teks tanggal menjadi nilai waktu, dan hasilnya ditugaskan kembali ke kolomtanggal. Inilah pola paling umum: konversi, lalu penugasan ulang. - Baris 16:
pesanan.dtypeskini menampilkandatetime64[us]untuk kolomtanggal, sementara kolom lain tidak berubah.
Perhatikan akhiran [us]: pandas 3.0 menyimpan waktu dengan resolusi mikrodetik, bukan nanosecond seperti pada tutorial lama.
Satu Titik Waktu: Timestamp dan NaT #
Elemen terkecil dari dtype datetime64 adalah objek Timestamp, padanan datetime.datetime bawaan Python di dunia pandas. Baris 19 membuat satu Timestamp dari string, dan baris 21-22 menunjukkan bahwa komponen seperti t.year, t.month, serta t.day_name() dapat diakses langsung dari objek tersebut. Nilai waktu yang hilang direpresentasikan sebagai NaT (Not a Time), padanan NaN untuk waktu; pada baris 25, Series yang berisi None dikonversi dan pandas mengisi baris itu dengan NaT. Seperti NaN, nilai NaT tidak menghentikan perhitungan, tetapi akan merambat sebagai NaT pada hasil agregasi.
Membongkar Komponen Waktu dengan .dt #
Untuk Series ber-dtype datetime64, pandas menyediakan accessor .dt yang memaparkan komponen waktu sebagai Series baru. Baris 30-33 memakai .dt.month untuk bulan, .dt.day_name() untuk nama hari, dan .dt.is_month_start sebagai penanda awal bulan; hasilnya tampil sebagai list Python pada blok output terakhir. Accessor .dt hanya bekerja pada kolom; pada Chapter Datetime Index kita akan melihat bahwa index datetime menyediakan properti yang sama tanpa .dt.
Dokumentasi resmi yang relevan untuk chapter ini: pandas.Timestamp , pandas.Series.dt , dan User Guide: Time series .
Setelah tipe data waktunya dikenali, langkah berikutnya adalah mengubah teks tanggal yang formatnya belum tentu seragam — pekerjaan yang menjadi fokus Chapter Konversi String ke Datetime.