Tiga chapter pertama bagian ini mengubah teks tanggal menjadi kolom ber-dtype datetime64; chapter ini memindahkannya ke posisi yang lebih strategis: index DataFrame. Banyak fitur deret waktu pada pandas — memilih data per periode, resample(), hingga rolling() — hanya aktif ketika index bertipe DatetimeIndex. Chapter ini memperkenalkan dataset penjualan harian Toko Sembako Berkah periode Januari-Maret 2026 yang akan kita pakai terus sampai akhir bagian deret waktu, lalu menunjukkan dua cara membentuk index datetime beserta properti waktunya.
Menyiapkan Dataset Penjualan Harian #
Baris 5 membuat 90 tanggal harian (1 Januari sampai 31 Maret 2026) dengan pd.date_range(), lengkap dengan name="tanggal" dan frekuensi harian freq="D". Baris 6 menghitung nilai penjualan dengan satu list comprehension: t.dayofweek bernilai 0 untuk Senin sampai 6 untuk Minggu, sehingga 150 + t.dayofweek * 20 membuat penjualan mulai 150 pada hari Senin dan memuncak 270 pada hari Minggu; tambahan (t.month - 1) * 30 mengangkat penjualan 30 unit setiap bulan. Baris 7 menjadikan tanggal sebagai index langsung saat DataFrame dibentuk. Dataset fiktif ini sengaja dibuat berpola agar setiap angka pada output bisa diperiksa manual.
import pandas as pd
# Penjualan harian Toko Sembako Berkah, Januari-Maret 2026
# Pola: Senin paling sepi, Minggu paling ramai, naik tiap bulan
tanggal = pd.date_range("2026-01-01", "2026-03-31", freq="D", name="tanggal")
penjualan = [150 + t.dayofweek * 20 + (t.month - 1) * 30 for t in tanggal]
df = pd.DataFrame({"penjualan": penjualan}, index=tanggal)
print(df.head())
print("\ntipe index :", type(df.index).__name__)
print("dtype index:", df.index.dtype)
print("frekuensi :", df.index.freq)
# Index datetime juga bisa dibentuk dari kolom lewat set_index
pesanan = pd.DataFrame({
"tanggal": pd.to_datetime(["2026-01-05", "2026-01-06", "2026-01-08"]),
"item": ["Beras 5 kg", "Minyak 2 L", "Gula 1 kg"],
"total": [68000, 39000, 17500],
})
pesanan = pesanan.set_index("tanggal")
print()
print(pesanan)
print("tipe index :", type(pesanan.index).__name__)
print("frekuensi :", pesanan.index.freq)
# Properti waktu diakses langsung dari index, tanpa accessor .dt
print("\nNama hari 3 baris pertama:", df.index.day_name()[:3].tolist())
print("Bulan unik:", df.index.month.unique().tolist())
print("Rentang data:", df.index.min(), "sampai", df.index.max())Output yang Dihasilkan:
penjualan
tanggal
2026-01-01 210
2026-01-02 230
2026-01-03 250
2026-01-04 270
2026-01-05 150
tipe index : DatetimeIndex
dtype index: datetime64[us]
frekuensi : <Day>
item total
tanggal
2026-01-05 Beras 5 kg 68000
2026-01-06 Minyak 2 L 39000
2026-01-08 Gula 1 kg 17500
tipe index : DatetimeIndex
frekuensi : None
Nama hari 3 baris pertama: ['Thursday', 'Friday', 'Saturday']
Bulan unik: [1, 2, 3]
Rentang data: 2026-01-01 00:00:00 sampai 2026-03-31 00:00:00Mari kita telaah bagian-bagian penting skrip di atas:
- Baris 5-7: dataset 90 baris dibangun;
df.head()menampilkan lima hari pertama dengan nilai 210, 230, 250, 270, lalu 150 — Kamis sampai Senin minggu pertama. - Baris 9-11:
type(df.index).__name__melaporkanDatetimeIndex,df.index.dtypemelaporkandatetime64[us], dandf.index.freqmelaporkan<Day>karena index berasal daridate_range. - Baris 14-23: tabel
pesananyang kolomtanggal-nya sudahdatetime64dipindahkan menjadi index denganset_index("tanggal"). - Baris 26-28: properti waktu diakses langsung dari index, tanpa accessor
.dt.
Dua Cara Membentuk DatetimeIndex #
Cara pertama adalah membangun index bersamaan dengan DataFrame, seperti baris 7: date_range menghasilkan DatetimeIndex yang langsung dipakai sebagai index. Cara kedua adalah memindahkan kolom datetime yang sudah ada dengan set_index(), seperti baris 19 — pola ini paling sering dipakai pada data hasil read_csv() yang sudah lolos konversi pd.to_datetime(). Keduanya menghasilkan tipe index yang sama, tetapi berbeda pada atribut frekuensi: index buatan date_range membawa freq=<Day>, sedangkan index hasil set_index() melaporkan freq=None karena pandas tidak tahu pasti barisnya benar-benar berjarak satu hari. Frekuensi ini bersifat informasi; fitur pemilihan dan resampling tetap berjalan pada index yang tidak membawa freq.
Properti Waktu pada Index #
Index datetime mengekspos properti waktu secara langsung: df.index.day_name() mengembalikan nama hari, df.index.month mengembalikan nomor bulan per baris, dan df.index.min()/max() memberi batas rentang data. Bandingkan dengan konteks kolom yang memerlukan accessor .dt:
| Posisi datetime | Cara mengakses komponen | Contoh |
|---|---|---|
Kolom (datetime64[us]) | accessor .dt | df["tanggal"].dt.month |
Index (DatetimeIndex) | properti langsung | df.index.month |
Output terakhir menunjukkan tiga nama hari pertama (Thursday, Friday, Saturday — pandas memakai nama bahasa Inggris), bulan unik [1, 2, 3], dan rentang data dari 1 Januari sampai 31 Maret 2026. Properti-properti ini juga menjadi bahan boolean mask pada chapter berikutnya.
Dokumentasi resmi yang relevan: pandas.DataFrame.set_index , pandas.date_range , dan User Guide: Time series .
Index sudah terpasang; sekarang saatnya memanen manfaatnya. Chapter berikutnya memakai string tanggal sebagai “alamat” untuk memilih baris — dari satu hari sampai satu tahun.