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.
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:
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 270Mari kita telaah bagian-bagian penting skrip di atas:
- Baris 8: pemilihan satu tanggal mengembalikan satu nilai
penjualan, yaitu 150 untuk hari Senin 5 Januari. - Baris 12: slicing
"2026-01-05":"2026-01-08"mengembalikan empat baris dengan batas inklusif. - Baris 15-17:
df.loc["2026-01"]diikutilen()melaporkan 31 baris — seluruh Januari — danjanuari.tail(3)menampilkan tiga hari terakhirnya. - Baris 20: rentang antar-bulan
"2026-01":"2026-02"melaporkan 59 baris (31 + 28). - Baris 23-25: boolean mask
df.index.dayofweek >= 5mengambil 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:
| Pola | Contoh penulisan | Hasil pada dataset kita |
|---|---|---|
| Satu tanggal | df.loc["2026-01-05", "penjualan"] | satu nilai: 150 |
| Rentang tanggal | df.loc["2026-01-05":"2026-01-08"] | 4 baris, batas ikut diambil |
| Satu bulan | df.loc["2026-01"] | 31 baris |
| Rentang bulan | df.loc["2026-01":"2026-02"] | 59 baris |
| Kondisi kustom | df[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.