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.

python
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:

text
            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:00

Mari kita telaah bagian-bagian penting skrip di atas:

  1. 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.
  2. Baris 9-11: type(df.index).__name__ melaporkan DatetimeIndex, df.index.dtype melaporkan datetime64[us], dan df.index.freq melaporkan <Day> karena index berasal dari date_range.
  3. Baris 14-23: tabel pesanan yang kolom tanggal-nya sudah datetime64 dipindahkan menjadi index dengan set_index("tanggal").
  4. 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 datetimeCara mengakses komponenContoh
Kolom (datetime64[us])accessor .dtdf["tanggal"].dt.month
Index (DatetimeIndex)properti langsungdf.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.