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.
Menulis dua sheet dengan to_excel#
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.
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)['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.
import pandas as pd
df = pd.read_excel("log_ruangan.xlsx")
print(df.dtypes)
print(df.head(3))
print(df.isna().sum())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: int64Tipe 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.
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)) 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.8Bentuk 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.
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)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.
import pandas as pd
df = pd.read_excel("log_ruangan.xlsx", sheet_name="ringkasan")
print(df.columns.tolist())
print(df.head(3))['Ringkasan per ruangan', 'Unnamed: 1']
Ringkasan per ruangan Unnamed: 1
0 ruang rata_suhu_c
1 Lab A 23.6
2 Lab B 24.1Nilai 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.
import pandas as pd
df = pd.read_excel("log_ruangan.xlsx", sheet_name="ringkasan", header=1)
print(df.columns.tolist())
print(df)['ruang', 'rata_suhu_c']
ruang rata_suhu_c
0 Lab A 23.6
1 Lab B 24.1
2 Ruang Arsip 22.8Nilai 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_excelmenulis satu DataFrame per sheet, dan beberapa sheet ditulis bersama melaluiExcelWriterdi dalam blokwith.read_excelmembaca sheet pertama secara bawaan, mengenali tipe kolom secara otomatis, dan mengubah sel kosong menjadiNaN.sheet_namemenerima nama sheet, posisi indeksnya, atauNoneyang mengembalikan kamus berisi seluruh sheet.headermenunjuk baris yang dipakai sebagai nama kolom, danheader=1diperlukan ketika laporan memuat baris judul.
Referensi#
- pandas.read_excel — pandas documentation
— Parameter
read_excel, termasuksheet_name,header, dan pilihan mesin pembaca. - pandas.DataFrame.to_excel — pandas documentation
— Parameter
to_excel, termasuksheet_name,startrow, danindex. - IO tools (text, CSV, HDF5, …) — pandas documentation — Panduan resmi baca tulis data yang memuat bagian khusus berkas Excel.