Pandas dt: Ekstrak Bagian Tanggal dan Waktu
TL;DR
Accessor .dt di pandas ngasih kamu akses ke komponen tanggal dan waktu dari kolom bertipe datetime, satu kolom penuh sekaligus. Contohnya df['tgl'].dt.year ngambil tahun, .dt.month ngambil bulan, dan .dt.day_name() ngasih nama hari. Kolomnya harus bertipe datetime dulu, jadi ubah pakai pd.to_datetime kalau masih teks. Setelah itu, tiap bagian waktu bisa dipakai buat grouping dan analisa pola.
Accessor .dt di pandas ngeluarin bagian tanggal dan waktu dari kolom datetime. Tahun, bulan, hari, jam, nama hari, semuanya bisa diambil jadi kolom sendiri.
Ini yang bikin analisa pola waktu gampang. Mau tau penjualan naik di hari apa? Ekstrak nama hari dulu pakai .dt, baru dikelompokkan.
Kamu bakal lihat cara pastiin kolom bertipe datetime, ambil komponen dengan .dt, plus contoh analisa penjualan per hari yang ngasih temuan nyata.
Apa itu accessor .dt di pandas?
Accessor .dt adalah pintu masuk ke properti tanggal dan waktu untuk kolom yang bertipe datetime. Kamu tulis df['kolom'].dt.komponen, dan pandas ngeluarin bagian itu buat tiap baris. Contohnya .dt.year ngasih tahun, .dt.hour ngasih jam. Cara kerjanya mirip accessor .str buat teks, tapi ini khusus buat waktu.
Syarat utamanya, kolomnya harus beneran datetime, bukan teks. Kalau masih teks, .dt langsung error.
Gimana cara ubah kolom jadi datetime dulu?
Data tanggal dari CSV sering kebaca sebagai teks. Sebelum pakai .dt, ubah dulu pakai pd.to_datetime(). Fungsi ini nerjemahin teks tanggal jadi tipe datetime asli yang bisa dihitung dan dipecah.
import pandas as pd
df = pd.read_csv('transaksi.csv')
df['tanggal'] = pd.to_datetime(df['tanggal'])
print(df['tanggal'].dtype) # datetime64[ns]
Kalau formatnya nggak umum, kasih tau pola-nya lewat argumen format, misalnya format='%d/%m/%Y' buat tanggal gaya Indonesia. Buat bahasan lengkap konversi ini, ada artikel pandas to_datetime.
Gimana cara ambil tahun, bulan, dan hari?
Setelah kolomnya datetime, ambil komponen pakai properti .dt. Ketiganya ngasih angka: .dt.year buat tahun penuh, .dt.month buat nomor bulan 1 sampai 12, dan .dt.day buat tanggal 1 sampai 31. Tiap properti balik satu kolom angka.
df['tahun'] = df['tanggal'].dt.year
df['bulan'] = df['tanggal'].dt.month
df['tanggal_ke'] = df['tanggal'].dt.day
Bikin kolom terpisah kayak gini enak buat grouping. Mau total penjualan per bulan? Grup pakai kolom bulan yang baru dibikin. Buat agregasi lanjutannya, pandas groupby yang ngerjain.
Gimana cara ambil nama hari dan jam?
Buat nama hari, ada dua pilihan. .dt.dayofweek ngasih angka 0 sampai 6, di mana 0 itu Senin. .dt.day_name() ngasih nama hari dalam teks kayak 'Monday'. Buat jam, pakai .dt.hour yang ngasih angka 0 sampai 23.
df['hari_angka'] = df['tanggal'].dt.dayofweek # 0=Senin
df['nama_hari'] = df['tanggal'].dt.day_name() # Monday
df['jam'] = df['tanggal'].dt.hour
Perhatiin day_name pakai tanda kurung karena dia method, bukan properti. Sedangkan year dan month nggak pakai kurung. Salah satu ini sering bikin error di kode pemula. Referensi lengkap semua komponen ada di dokumentasi time series pandas.
Contoh kasus: penjualan per hari toko_berkah
Toko_berkah punya 9.600 transaksi dengan kolom waktu lengkap. Pemiliknya ngerasa akhir pekan lebih ramai, tapi belum pernah ngecek angkanya. Aku bantu ekstrak nama hari, lalu hitung rata-rata omzet per hari.
df['tanggal'] = pd.to_datetime(df['tanggal'])
df['nama_hari'] = df['tanggal'].dt.day_name()
rata_per_hari = (
df.groupby('nama_hari')['omzet']
.mean()
.sort_values(ascending=False)
)
print(rata_per_hari)
Hasilnya sebagian bener, sebagian ngagetin. Sabtu memang puncak dengan rata-rata omzet harian Rp 5,8 juta. Tapi juara keduanya bukan Minggu, melainkan Jumat dengan Rp 5,1 juta. Minggu malah turun ke urutan empat.
Selisih Sabtu dan hari paling sepi (Selasa) nyampe 47%. Temuan ini bikin pemiliknya geser jadwal restok dari Minggu malam ke Kamis malam, biar stok penuh pas Jumat dan Sabtu ramai. Buat ngitung frekuensi transaksi per hari, pandas value_counts juga kepakai.
Kesalahan umum saat pakai .dt
Jebakan pertama: pakai .dt di kolom yang masih teks. Errornya bilang objek nggak punya atribut dt. Ini paling sering. Selalu ubah pakai pd.to_datetime dulu, dan cek dtype-nya harus datetime64.
Jebakan kedua: bingung day_name butuh kurung, tapi year nggak. day_name dan month_name itu method, jadi pakai kurung. Sedangkan year, month, day, hour itu properti, nggak pakai kurung. Salah satu bikin error atau hasil aneh.
Jebakan ketiga: salah kira dayofweek mulai dari Minggu. Di pandas, dayofweek mulai dari Senin sebagai 0 dan Minggu sebagai 6. Kalau kamu ngira Minggu itu 0 kayak di beberapa tool lain, filter akhir pekan kamu bakal salah hari.
Jebakan keempat: lupa .dt cuma buat Series, bukan satu nilai. Kalau kamu udah ambil satu elemen tanggal, akses langsung propertinya tanpa .dt, misalnya nilai.year. .dt cuma dipakai pas ngolah seluruh kolom.
FAQ
Kenapa .dt saya error 'has no attribute dt'?
Karena kolomnya belum bertipe datetime, masih teks atau object. Accessor .dt cuma jalan di kolom yang tipenya datetime64. Ubah dulu pakai pd.to_datetime, lalu cek dengan df['kolom'].dtype. Kalau hasilnya datetime64[ns], berarti udah benar dan .dt bisa dipakai. Kalau masih object, konversinya belum berhasil, cek format tanggalnya.
Apa beda dayofweek dan day_name di pandas?
dayofweek ngasih angka 0 sampai 6 buat hari, dengan Senin sebagai 0 dan Minggu sebagai 6. day_name ngasih nama hari dalam bentuk teks seperti Monday. Pakai dayofweek kalau kamu mau ngefilter atau ngurutin secara numerik, misalnya nyaring akhir pekan. Pakai day_name kalau mau nampilin hasil yang gampang dibaca manusia di laporan.
Kenapa day_name pakai kurung tapi year nggak?
Karena day_name dan month_name itu method yang harus dipanggil dengan tanda kurung, sedangkan year, month, day, dan hour itu properti yang diakses langsung tanpa kurung. Aturan sederhananya, yang ngasih nama teks biasanya method, yang ngasih angka biasanya properti. Kalau kamu lupa kurung di day_name, pandas malah ngasih objek method, bukan hasilnya.
Gimana cara ambil nama bulan dalam bahasa Indonesia?
Secara default day_name dan month_name ngasih teks bahasa Inggris. Buat bahasa Indonesia, tambahin argumen locale, misalnya .dt.month_name(locale='id_ID'), tapi ini butuh locale itu terpasang di sistem kamu. Cara yang lebih pasti, ambil nomor bulan pakai .dt.month lalu petakan sendiri ke nama Indonesia pakai dictionary atau map.
Bisa nggak ambil minggu ke berapa atau kuartal?
Bisa. Pakai .dt.quarter buat ngambil kuartal 1 sampai 4, dan .dt.isocalendar().week buat nomor minggu dalam setahun. Komponen ini berguna buat laporan periodik seperti omzet per kuartal atau tren mingguan. Sama seperti komponen lain, kolomnya harus bertipe datetime dulu sebelum diakses.
Penutup
Accessor .dt bikin analisa pola waktu di pandas jadi ringkas. Inget tiga hal: ubah ke datetime dulu pakai to_datetime, pakai kurung buat day_name tapi nggak buat year, dan dayofweek mulai dari Senin sebagai 0.
Mau latihan olah data waktu sampai lancar? Coba praktek langsung di NgulikSQL dan materi Python-nya.
Lanjut baca: pandas to_datetime buat konversi kolom tanggal dan pandas groupby buat agregasi.
Mau praktek langsung? Mulai latihan SQL gratis
Latihan interaktif, langsung di browser.
Artikel terkait
Uji Chi-Square: Konsep dan Contoh Praktis (2026)
Mau tau apakah metode bayar berhubungan sama tipe pelanggan? Uji chi-square jawabannya. Ini konsep, rumus, cara hitung di Python, plus contoh data toko nyata.
Korelasi Spearman: Kapan Dipakai vs Pearson
Korelasi Spearman kerja di peringkat, bukan nilai asli. Ini bedanya dengan Pearson, kapan pakai yang mana, dan cara hitungnya di Excel dan Python.
Korelasi Pearson: Cara Menghitung dan Membaca
Korelasi Pearson ngukur seberapa kuat dua angka bergerak bareng. Ini cara hitung dan baca nilainya dengan contoh dataset toko Indonesia.