Setelah index DataFrame bertipe DatetimeIndex, pandas memperbolehkan kita memakai teks tanggal sebagai “alamat” untuk memilih baris — tanpa membuat filter manual atau perulangan. Kita bisa meminta satu hari, rentang beberapa hari, satu bulan penuh, bahkan satu tahun, cukup dengan menulis string tanggal ke df.loc. Chapter ini mempraktikkan pola-pola pemilihan tersebut pada dataset penjualan harian Toko Sembako Berkah yang sama dengan chapter sebelumnya, termasuk boolean mask untuk kondisi yang tidak bisa diekspresikan sebagai string.

Memilih Satu Tanggal dan Rentang Tanggal #

Baris 8 memilih satu tanggal dengan df.loc["2026-01-05", "penjualan"] dan hasilnya satu angka: 150. Baris 12 memilih rentang "2026-01-05":"2026-01-08" dan pandas mengembalikan empat baris — batas awal dan batas akhir ikut diambil. Perilaku inklusif ini berbeda dari slicing list Python yang melewatkan batas akhir, dan justru lebih nyaman untuk rentang tanggal karena tidak perlu mengurangi satu detik atau satu hari. String tanggal boleh ditulis lengkap YYYY-MM-DD atau singkat YYYYMMDD.

python
import pandas as pd

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)

# Satu tanggal tertentu
print("Penjualan 5 Januari:", df.loc["2026-01-05", "penjualan"])

# Rentang tanggal: batas awal dan akhir ikut diambil (inklusif)
print("\nRentang 5-8 Januari:")
print(df.loc["2026-01-05":"2026-01-08"])

# Partial string indexing: satu bulan penuh cukup dengan "2026-01"
januari = df.loc["2026-01"]
print("\nJumlah baris Januari:", len(januari))
print(januari.tail(3))

# Rentang antar bulan: dari Januari sampai Februari
print("\nJumlah baris Jan-Feb:", len(df.loc["2026-01":"2026-02"]))

# Boolean mask untuk kondisi yang tidak bisa ditulis sebagai string tanggal
akhir_pekan = df[df.index.dayofweek >= 5]
print("\nJumlah baris Sabtu-Minggu:", len(akhir_pekan))
print(akhir_pekan.head(4))

Output yang Dihasilkan:

text
Penjualan 5 Januari: 150

Rentang 5-8 Januari:
            penjualan
tanggal              
2026-01-05        150
2026-01-06        170
2026-01-07        190
2026-01-08        210

Jumlah baris Januari: 31
            penjualan
tanggal              
2026-01-29        210
2026-01-30        230
2026-01-31        250

Jumlah baris Jan-Feb: 59

Jumlah baris Sabtu-Minggu: 26
            penjualan
tanggal              
2026-01-03        250
2026-01-04        270
2026-01-10        250
2026-01-11        270

Mari kita telaah bagian-bagian penting skrip di atas:

  1. Baris 8: pemilihan satu tanggal mengembalikan satu nilai penjualan, yaitu 150 untuk hari Senin 5 Januari.
  2. Baris 12: slicing "2026-01-05":"2026-01-08" mengembalikan empat baris dengan batas inklusif.
  3. Baris 15-17: df.loc["2026-01"] diikuti len() melaporkan 31 baris — seluruh Januari — dan januari.tail(3) menampilkan tiga hari terakhirnya.
  4. Baris 20: rentang antar-bulan "2026-01":"2026-02" melaporkan 59 baris (31 + 28).
  5. Baris 23-25: boolean mask df.index.dayofweek >= 5 mengambil 26 baris Sabtu-Minggu.

Partial String Indexing untuk Bulan dan Tahun #

Teknik pada baris 15 dan 20 disebut partial string indexing: string yang diberikan tidak harus tanggal lengkap, dan pandas memilih semua baris yang cocok dengan bagian yang ditulis. Pola "2026-01" berarti seluruh Januari 2026, sedangkan "2026" saja akan memilih seluruh tahun 2026. Rentang juga bisa ditulis sebagai dua string bulan, seperti "2026-01":"2026-02" yang menghasilkan 59 baris tanpa perlu menyebut tanggal terakhir Februari. Ringkasan pola yang dipakai pada skrip:

PolaContoh penulisanHasil pada dataset kita
Satu tanggaldf.loc["2026-01-05", "penjualan"]satu nilai: 150
Rentang tanggaldf.loc["2026-01-05":"2026-01-08"]4 baris, batas ikut diambil
Satu bulandf.loc["2026-01"]31 baris
Rentang bulandf.loc["2026-01":"2026-02"]59 baris
Kondisi kustomdf[df.index.dayofweek >= 5]26 baris Sabtu-Minggu

Boolean Mask untuk Kondisi Kustom #

Tidak semua pertanyaan bisa ditulis sebagai string tanggal. Pertanyaan “ambil semua hari akhir pekan” diterjemahkan menjadi mask boolean pada baris 23: df.index.dayofweek >= 5 bernilai True untuk Sabtu (5) dan Minggu (6), lalu df[mask] menyaring barisnya. Pola yang sama berlaku untuk kondisi lain, misalnya df[df.index.month == 2] untuk Februari atau df[df["penjualan"] > 280] untuk hari-hari dengan penjualan tinggi. Boolean mask juga tetap berlaku pada DataFrame yang indexnya bukan datetime, sehingga teknik ini bisa dipakai di mana saja.

Dokumentasi resmi yang relevan: pandas.DataFrame.loc , User Guide: Time series , dan User Guide: Indexing and selecting data .

Memilih baris per periode adalah separuh cerita deret waktu; separuh lainnya adalah mengubah granularitas datanya sendiri. Chapter berikutnya memperkenalkan resample() untuk meringkas data harian menjadi bulanan dan mengembalikannya lagi ke harian.