Berkas CSV terlihat paling mudah dibaca, tetapi berkas CSV yang nyata
membawa keberantakan yang tidak terlihat sampai datanya dipakai. Topik ini
memakai dataset latihan jalur ini, yaitu ukuran_udara.csv berisi log
pengukuran kualitas udara dua stasiun yang sengaja disimpan berantakan,
untuk memperlihatkan kasus tepi yang paling sering ditemui beserta
pengaturan pembacaannya. Setelah membacanya, satu berkas yang kacau dapat
dimuat menjadi tabel yang tipe dan waktunya benar dalam satu skrip pendek.
Kasus tepi yang paling sering ditemui#
Keberantakan berkas data nyata berulang pada pola yang sama, dan mengenali polanya membuat pembacaan menjadi soal pemilihan parameter, bukan kejutan berulang. Tabel berikut memetakan pola yang ada pada dataset latihan ini beserta parameter pandas yang menanganinya.
| Keberantakan | Wujud pada berkas latihan | Parameter atau perlakuan |
|---|---|---|
| Nilai hilang berlapis | sel kosong, teks kosong, kode -999.0 | na_values |
| Desimal koma | kelembapan 73,6 | baca sebagai teks, lalu str.replace |
| Format waktu campur | 2026-03-01 08:00 dan 01/03/2026 08:00 | to_datetime dengan format="mixed" |
| Nama tidak konsisten | stasiun a, STASIUN A, Stasiun A | str.strip, str.title, rapikan spasi |
| Baris ganda | dua baris identik | dibedah pada modul pembersihan |
| Outlier ekstrem | satu baris pm25 = 9999.0 | dibedah pada modul pembersihan |
Daftar tersebut juga mengajarkan batas topik ini, yaitu membaca berkas dengan benar sampai tipe dan waktunya lurus, sedangkan keputusan pembersihan yang lebih dalam, seperti menghapus baris ganda atau menangani outlier, adalah wilayah modul pembersihan dan wrangling.
Pembacaan naif dan apa yang bocor#
Pembacaan pertama yang dilakukan dengan sengaja naif memperlihatkan kerusakan yang biasanya tersembunyi di balik tampilan tabel yang tampak wajar.
"""Pembacaan pertama yang disengaja naif atas berkas yang berantakan."""
import pandas as pd
data = pd.read_csv("ukuran_udara.csv")
print(data.dtypes.to_string())
print()
print("pm25 unik (6 pertama) :", sorted(set(data["pm25"].astype(str)))[:6])
print("kelembapan (5 pertama):", data["kelembapan"].head(5).tolist())
print("bentuk tabel :", data.shape)waktu object
stasiun object
pm25 object
suhu_c float64
kelembapan object
kualitas object
pm25 unik (6 pertama) : ['-999.0', '24.3', '26.1', '27.2', '27.6', '30.1']
kelembapan (5 pertama): ['66.3', '71.1', nan, '73.5', '72.5']
bentuk tabel : (62, 6)Tiga kebocoran terlihat pada keluaran tersebut. Kolom waktu dan pm25
tersimpan sebagai object, yaitu teks, sehingga tidak dapat diurutkankronologis maupun dirata-rata. Kode -999.0 lolos masuk sebagai angka sah
yang kelak merusak setiap statistiknya. Kombinasi terakhir paling mudah
terlewat, yaitu kelembapan yang berisi campuran bilangan, sel kosong, dan
teks "73,6" berdesimal koma, sehingga kolomnya ditarik ke tipe teks.
Pembacaan yang disetel#
Pembacaan yang benar menetapkan perlakuan setiap keberantakan pada saat memuat, sehingga tabel yang keluar sudah layak dianalisis.
"""Pembacaan dengan pengaturan yang menangani keberantakan berkas."""
import pandas as pd
data = pd.read_csv(
"ukuran_udara.csv",
na_values=["kosong", "-999.0"],
dtype={"pm25": "string", "kelembapan": "string", "kualitas": "string"},
)
data["pm25"] = data["pm25"].astype("float")
data["kelembapan"] = data["kelembapan"].str.replace(",", ".", regex=False).astype("float")
data["stasiun"] = (
data["stasiun"].str.strip()
.str.replace(r"\s+", " ", regex=True)
.str.title()
)
data["waktu"] = pd.to_datetime(data["waktu"], format="mixed", dayfirst=True)
print(data.dtypes.to_string())
print()
print("stasiun :", sorted(data["stasiun"].unique()))
print("rentang :", data["waktu"].min(), "s.d.", data["waktu"].max())
print("pm25 : terisi =", data["pm25"].notna().sum(), "| maks =", data["pm25"].max())waktu datetime64[ns]
stasiun object
pm25 float64
suhu_c float64
kelembapan float64
kualitas string[python]
stasiun : ['Stasiun A', 'Stasiun B']
rentang : 2026-03-01 00:00:00 s.d. 2026-03-02 05:00:00
pm25 : terisi = 53 | maks = 9999.0Setiap baris pengaturan menjawab satu keberantakan. na_values menjadikan
teks kosong dan kode -999.0 sebagai data hilang, sementara sel kosong
sudah menjadi NaN secara bawaan. Kolom dibaca sebagai string lebih dahulu
agar desimal koma dapat diperbaiki sebelum konversi, dan nama stasiun
dirapikan dengan tiga langkah teks. Argumen format="mixed" dengan
dayfirst=True menguraikan dua format waktu sekaligus, yaitu ISO untuk
Stasiun A dan hari-lebih-dahulu untuk Stasiun B.
Keluaran akhirnya jujur, yaitu 53 dari 62 nilai pm25 terisi dan maksimumnya 9999.0, yang adalah outlier yang sengaja ditanam dan baru ditangani pada modul pembersihan. Angka-angka itu diketahui karena tipe kolom sudah lurus, bukan karena berkasnya bersih.
Excel dan JSON secara singkat#
Excel dibaca dengan pd.read_excel dan bergantung pada pustaka pembaca seperti
openpyxl. Kasus tepi utamanya ada pada peka huruf sheet, baris judul yang tidak
berada di baris pertama, serta angka yang sebenarnya berformat teks.
# tidak-dijalankan
data = pd.read_excel(
"laporan.xlsx",
sheet_name="rekap",
skiprows=3, # dua baris judul laporan dilewati
dtype={"kode_stasiun": str}, # kode stasiun jangan diubah jadi angka
)JSON dibaca dengan pd.read_json atau modul json bila strukturnya
bersarang. Argumen yang paling sering dibutuhkan adalah orient, karena JSON
nyata kadang berupa kamus berisi kamus alih-alih daftar baris. Prinsipnya sama
dengan CSV, yaitu periksa dtypes segera setelah memuat, karena JSON juga
diam-diam mengubah angka menjadi teks dan sebaliknya.
Kesalahan umum#
Kesalahan pertama adalah memakai dtype untuk kolom yang berisi nilai hilang
berlapis, misalnya memaksa float langsung pada kolom berisi teks kosong,
sehingga error konversi muncul di tengah pemuatan. Membaca sebagai string
lebih dahulu, lalu mengonversi setelah nilai tidak sah dinetralkan, membuat
prosesnya dapat diamati langkah demi langkah.
Kesalahan kedua adalah menguraikan tanggal tanpa menyebut format, sehingga
01/03/2026 dibaca sebagai bulan Maret tanggal satu alih-alih tanggal satu
Maret, dan kesalahannya tidak tampak pada tipe kolom yang tetap
datetime64. dayfirst dan pemeriksaan rentang min-max adalah penangkalnya.
Kesalahan ketiga adalah membaca berkas dengan encoding yang salah, yang
menampakkan diri sebagai UnicodeDecodeError atau karakter aneh seperti
’ di tengah teks. encoding="utf-8" adalah bawaan yang sehat, dan
encoding="latin-1" menjadi penyelamat pada berkas lama.
Ringkasan#
- Keberantakan berkas berulang pada pola tetap, dan sebagian besar dijawab parameter pembacaan, bukan perbaikan manual.
- Pembacaan naif menyembunyikan kerusakan pada tipe kolom, sehingga
dtypesselalu diperiksa segera setelah memuat. - Nilai hilang berlapis dinetralkan dengan
na_values, desimal koma diperbaiki lewat tipestring, dan waktu campur diuraikan denganformat="mixed"besertadayfirst. - Excel dan JSON membawa kasus tepi serupa, yaitu baris judul, sheet, dan orient, dengan prinsip pemeriksaan yang sama.
Referensi#
- IO tools (text, CSV, HDF5, …) — pandas documentation — dokumentasi resmi seluruh parameter pembacaan berkas.
- Time series / date functionality — pandas documentation
—
dokumentasi penguraian tanggal termasuk
format="mixed"dandayfirst. - codecs — Codec registry — Python documentation — daftar encoding standar Python untuk berkas lintas sumber.