Berkas Excel

Membaca berkas Excel dengan read_excel, pemilihan sheet, dan penanganan sel kosong.

Daftar isi

Berkas Excel masih menjadi format pertukaran data yang lazim karena banyak laporan disusun dalam bentuk tersebut. Topik ini membahas penulisan DataFrame ke berkas Excel dengan beberapa sheet melalui to_excel, pembacaan kembali dengan read_excel, pemilihan sheet melalui sheet_name, perilaku sel kosong yang berubah menjadi NaN, serta pengaturan header ketika laporan memuat baris judul. Contoh yang dipakai adalah log sensor singkat enam baris dari tiga ruangan laboratorium yang sama dengan contoh lain di jalur ini.

Metode to_excel menulis satu DataFrame menjadi satu sheet, dan beberapa sheet sekaligus ditulis melalui objek ExcelWriter di dalam satu blok with. Buat berkas latihan dua sheet berikut terlebih dahulu.

python Contoh: menulis dua sheet dengan ExcelWriter
import pandas as pd

log = pd.DataFrame({
    "waktu": pd.date_range("2026-01-05 07:00", periods=6, freq="15min"),
    "ruang": ["Lab A", "Lab B", "Ruang Arsip", "Lab A", "Lab B", "Lab A"],
    "suhu_c": [23.4, 24.1, None, 22.8, None, 24.6],
    "lembap_pct": [58.2, 61.3, 63.8, 57.5, 66.1, 60.4],
    "status_sensor": ["normal", "normal", "kalibrasi", "normal", "rusak", "normal"],
})
ringkas = pd.DataFrame({
    "ruang": ["Lab A", "Lab B", "Ruang Arsip"],
    "rata_suhu_c": [23.6, 24.1, 22.8],
})
with pd.ExcelWriter("log_ruangan.xlsx", engine="openpyxl") as writer:
    log.to_excel(writer, sheet_name="log", index=False)
    ringkas.to_excel(writer, sheet_name="ringkasan", index=False, startrow=1)
    writer.sheets["ringkasan"]["A1"] = "Ringkasan per ruangan"
print(pd.ExcelFile("log_ruangan.xlsx").sheet_names)
text Keluaran
['log', 'ringkasan']

Objek ExcelWriter mengumpulkan seluruh penulisan, dan berkasnya baru disimpan ketika blok with selesai. Parameter sheet_name memberi nama setiap sheet, sedangkan index=False mencegah kolom index ikut tertulis. Pada sheet kedua, startrow=1 menurunkan tabel satu baris sehingga baris pertama kosong, lalu sel A1 diisi judul laporan melalui writer.sheets. Mesin penulis disebut eksplisit melalui engine="openpyxl" karena pandas memilih mesin yang tersedia di lingkungan secara otomatis, sedangkan openpyxl yang terpasang di lingkungan latihan menyediakan antarmuka penulisan sel tunggal yang dipakai di sini.

Membaca ulang dengan read_excel#

Fungsi read_excel membaca sheet pertama secara bawaan dan mengenalkan tipe setiap kolom secara otomatis. Baca ulang sheet log tanpa parameter tambahan untuk mengamati hasilnya.

python Contoh: membaca sheet pertama
import pandas as pd

df = pd.read_excel("log_ruangan.xlsx")
print(df.dtypes)
print(df.head(3))
print(df.isna().sum())
text Keluaran
waktu            datetime64[us]
ruang                       str
suhu_c                  float64
lembap_pct              float64
status_sensor               str
dtype: object
                waktu        ruang  suhu_c  lembap_pct status_sensor
0 2026-01-05 07:00:00        Lab A    23.4        58.2        normal
1 2026-01-05 07:15:00        Lab B    24.1        61.3        normal
2 2026-01-05 07:30:00  Ruang Arsip     NaN        63.8     kalibrasi
waktu            0
ruang            0
suhu_c           2
lembap_pct       0
status_sensor    0
dtype: int64

Tipe kolom dikenali dengan benar tanpa pengaturan apa pun, yaitu datetime64[us] untuk waktu, str untuk teks, dan float64 untuk angka. Dua sel suhu yang ditulis sebagai kosong kembali sebagai NaN, dan isna().sum() membuktikan jumlahnya. Perilaku ini menjadikan nilai hilang relatif aman pada Excel, karena sel yang dibiarkan kosong konsisten terbaca NaN dan tidak merusak tipe kolomnya.

Memilih sheet dengan sheet_name#

Parameter sheet_name menerima nama sheet, posisi indeksnya, atau None untuk membaca seluruh sheet sekaligus. Blok berikut membaca sheet yang sama melalui dua bentuk penyebutan berbeda.

python Contoh: sheet dengan nama dan dengan indeks
import pandas as pd

print(pd.read_excel("log_ruangan.xlsx", sheet_name="ringkasan"))
print()
print(pd.read_excel("log_ruangan.xlsx", sheet_name=1))
text Keluaran
  Ringkasan per ruangan   Unnamed: 1
0                 ruang  rata_suhu_c
1                 Lab A         23.6
2                 Lab B         24.1
3           Ruang Arsip         22.8

  Ringkasan per ruangan   Unnamed: 1
0                 ruang  rata_suhu_c
1                 Lab A         23.6
2                 Lab B         24.1
3           Ruang Arsip         22.8

Bentuk pertama menyebut sheet dengan namanya, sedangkan bentuk kedua menyebut posisinya, yaitu 1 untuk sheet kedua. Keduanya menghasilkan tabel yang sama persis karena posisi mengikuti urutan sheet di dalam berkas. Header yang kacau pada keluaran di atas berasal dari baris judul yang sengaja ditulis pada sheet ini, dan penanganannya dibahas pada bagian berikutnya.

python Contoh: membaca seluruh sheet sekaligus
import pandas as pd

semua = pd.read_excel("log_ruangan.xlsx", sheet_name=None)
print(type(semua).__name__)
print(list(semua.keys()))
print(semua["log"].shape)
text Keluaran
dict
['log', 'ringkasan']
(6, 5)

Hasil berupa dict memetakan nama sheet ke DataFrame-nya, sehingga sheet mana pun dapat diakses lewat kuncinya. Bentuk semua["log"].shape pada keluaran menunjukkan tabel log tetap utuh dengan enam baris dan lima kolom. Pola ini menghindari pembacaan berkas Excel berulang kali untuk setiap sheet yang dibutuhkan.

Baris judul dan parameter header#

Parameter header menentukan baris Excel yang dipakai sebagai nama kolom, dan laporan dengan baris judul menjadikannya wajib diatur. Baca sheet ringkasan tanpa pengaturan terlebih dahulu untuk melihat kerusakannya.

python Contoh: sheet berjudul tanpa pengaturan header
import pandas as pd

df = pd.read_excel("log_ruangan.xlsx", sheet_name="ringkasan")
print(df.columns.tolist())
print(df.head(3))
text Keluaran
['Ringkasan per ruangan', 'Unnamed: 1']
  Ringkasan per ruangan   Unnamed: 1
0                 ruang  rata_suhu_c
1                 Lab A         23.6
2                 Lab B         24.1

Nilai bawaan header=0 memakai baris pertama sebagai nama kolom, padahal baris itu hanya memuat judul di sel A1. Akibatnya judul menjadi nama kolom pertama, kolom kedua diberi nama Unnamed: 1, dan baris header asli turun menjadi data. Kerusakan seperti ini tidak menimbulkan error, sehingga tabel yang tampak berisi justru mudah lolos sampai ke analisis.

python Contoh: header pada baris kedua
import pandas as pd

df = pd.read_excel("log_ruangan.xlsx", sheet_name="ringkasan", header=1)
print(df.columns.tolist())
print(df)
text Keluaran
['ruang', 'rata_suhu_c']
         ruang  rata_suhu_c
0        Lab A         23.6
1        Lab B         24.1
2  Ruang Arsip         22.8

Nilai header=1 memakai baris kedua sebagai nama kolom dan baris judul dikesampingkan. Tabel yang kembali kini bersih dengan dua kolom bernama ruang dan rata_suhu_c. Aturan yang sama berlaku seperti pada read_csv, sehingga pengalaman menata header CSV langsung dipindahkan ke Excel.

Kapan Excel dipilih#

Excel layak dipilih ketika keluaran ditujukan kepada pembaca manusia yang mengharapkan laporan siap buka, terutama karena satu berkas dapat memuat beberapa sheet berisi data dan ringkasannya sekaligus. Laporan ringkasan per ruangan pada contoh di atas adalah bentuk khasnya, dan penulisan judul di sel A1 memang berasal dari kebiasaan menyusun laporan seperti itu. Untuk tahap kerja data, format ini bukan pilihan terbaik. Ukuran berkasnya membengkak karena tiap sel disimpan terpisah, pembacaannya lebih lambat daripada CSV maupun Parquet, dan isinya tidak dapat diperiksa dengan editor teks. Perbedaan versi Excel serta mesin pembacanya juga menambah sumber variasi yang tidak dihadapi format teks.

Karena itu, bagi peran masing-masing format dengan jelas. Gunakan Parquet sebagai format kerja antartahap karena tipenya utuh dan ukurannya kecil, seperti dibahas pada topik Basis Data dan Parquet. Gunakan CSV ketika data dipertukarkan dengan alat atau pihak luar yang menuntut format paling umum. Gunakan Excel hanya pada tahap akhir, yaitu ketika hasil analisis dibungkus menjadi laporan yang dibaca manusia, dan susun sheetnya rapi karena judul dan baris kosong akan dihadapi kembali saat berkas itu dibaca ulang.

Ringkasan#

  • to_excel menulis satu DataFrame per sheet, dan beberapa sheet ditulis bersama melalui ExcelWriter di dalam blok with.
  • read_excel membaca sheet pertama secara bawaan, mengenali tipe kolom secara otomatis, dan mengubah sel kosong menjadi NaN.
  • sheet_name menerima nama sheet, posisi indeksnya, atau None yang mengembalikan kamus berisi seluruh sheet.
  • header menunjuk baris yang dipakai sebagai nama kolom, dan header=1 diperlukan ketika laporan memuat baris judul.

Referensi#