Datetime di Python
Atur tanggal dan waktu dengan datetime: parsing string tanggal, hitung selisih dengan timedelta, dan format output yang rapi.
Analogi singkat: kalender plus stopwatch
Modul datetime itu seperti punya kalender dan stopwatch dalam satu kotak perkakas. date mencatat tanggal (tahun, bulan, hari), datetime mencatat tanggal plus jam, dan timedelta mengukur jarak antara dua waktu, misalnya "3 hari 2 jam". Tiga alat ini menutup hampir semua kebutuhan tanggal di analisis data.
Kenapa konsep ini ada?
Data nyata penuh tanggal: tanggal transaksi, tanggal lahir pelanggan, timestamp log. Menyimpannya sebagai string ("08-10-2026") memang gampang dibaca manusia, tapi susah dihitung: berapa hari antara dua tanggal? Urutkan dari yang terlama bagaimana? Objek datetime menyimpan tanggal sebagai data terstruktur yang bisa dikurangi, dibandingkan, dan diformat ulang sesukamu.
Membuat dan memakai tanggal
from datetime import date, datetime, timedelta
# tanggal hari ini
hari_ini = date.today()
print(hari_ini) # 2026-10-08 (format bisa beda di komputermu)
# tanggal spesifik
lahir = date(2008, 5, 17)
print(lahir.year, lahir.month, lahir.day) # 2008 5 17
# tanggal + jam
sekarang = datetime.now()
print(sekarang.hour, sekarang.minute)
# selisih waktu dengan timedelta
tiga_hari_lalu = hari_ini - timedelta(days=3)
print(tiga_hari_lalu)
# bandingkan tanggal seperti angka biasa
print(lahir < hari_ini) # TrueParsing: string menjadi tanggal
Data dari CSV atau API datang sebagai string. strptime mengubahnya jadi objek tanggal:
from datetime import datetime
# pola: %d=tanggal, %m=bulan, %Y=tahun (4 digit)
tgl = datetime.strptime("08-10-2026", "%d-%m-%Y")
print(tgl) # 2026-10-08 00:00:00
# dengan jam: %H jam, %M menit
waktu = datetime.strptime("2026-10-08 14:30", "%Y-%m-%d %H:%M")
print(waktu.hour) # 14Catatan teknis: Pola format itu peka huruf besar/kecil:
%mbulan angka,%Mmenit,%Ytahun 4 digit,%ytahun 2 digit. Salah satu huruf saja, parsing gagal dengan ValueError.
Format: tanggal menjadi string cantik
Kebalikannya memakai strftime (f = format):
from datetime import datetime
sekarang = datetime(2026, 10, 8, 14, 30)
print(sekarang.strftime("%d/%m/%Y")) # 08/10/2026
print(sekarang.strftime("%A, %d %B %Y")) # Thursday, 08 October 2026
print(sekarang.strftime("%H:%M")) # 14:30
print(sekarang.strftime("%Y%m%d_%H%M%S")) # 20261008_143000 (bagus untuk nama file)Contoh 1: hitung umur dari tanggal lahir
from datetime import date
def hitung_umur(tgl_lahir_str):
lahir = datetime.strptime(tgl_lahir_str, "%d-%m-%Y").date()
hari_ini = date.today()
umur = hari_ini.year - lahir.year
# kurangi 1 kalau ulang tahun tahun ini belum lewat
if (hari_ini.month, hari_ini.day) < (lahir.month, lahir.day):
umur -= 1
return umur
print(hitung_umur("17-05-2008")) # 18
print(hitung_umur("20-12-2008")) # 17 (ultah belum lewat)Contoh 2: analisis jeda antar transaksi
from datetime import datetime
# timestamp transaksi sebagai string (seperti dari log)
log = [
"2026-10-08 09:00",
"2026-10-08 09:45",
"2026-10-08 11:30",
]
waktu = [datetime.strptime(t, "%Y-%m-%d %H:%M") for t in log]
for i in range(1, len(waktu)):
jeda = waktu[i] - waktu[i - 1] # hasilnya timedelta
menit = jeda.total_seconds() / 60
print("Jeda transaksi", i, ":", int(menit), "menit")
# Jeda transaksi 1 : 45 menit
# Jeda transaksi 2 : 105 menitMengurangi dua datetime langsung menghasilkan timedelta, dan total_seconds() mengubahnya jadi angka yang gampang diolah.
Kesalahan umum
SALAH: pola strptime tidak cocok dengan string
datetime.strptime("08/10/2026", "%d-%m-%Y") # ValueError: pemisah beda!BENAR: samakan pola dengan format string persis
datetime.strptime("08/10/2026", "%d/%m/%Y") # OKSALAH: mencampur date dan datetime
from datetime import date, datetime
date.today() - datetime.now() # TypeError: tidak bisa dikurangiBENAR: samakan tipenya dulu
from datetime import date, datetime
datetime.now().date() - date(2026, 10, 1) # OK, hasilnya timedeltaTantangan
Hitung Hari Menuju Ujian
Diberi tanggal ujian sebagai string format 'YYYY-MM-DD'. Parsing jadi date, lalu hitung selisih hari dari hari ini dengan timedelta. Cetak 'Tersisa X hari'.