Membaca Berkas

Kasus tepi CSV, Excel, dan JSON, termasuk encoding dan pemisah yang tidak baku.

Daftar isi

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.

KeberantakanWujud pada berkas latihanParameter atau perlakuan
Nilai hilang berlapissel kosong, teks kosong, kode -999.0na_values
Desimal komakelembapan 73,6baca sebagai teks, lalu str.replace
Format waktu campur2026-03-01 08:00 dan 01/03/2026 08:00to_datetime dengan format="mixed"
Nama tidak konsistenstasiun a, STASIUN A, Stasiun Astr.strip, str.title, rapikan spasi
Baris gandadua baris identikdibedah pada modul pembersihan
Outlier ekstremsatu baris pm25 = 9999.0dibedah 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.

python baca_naif.py
"""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)
text Keluaran
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.

python baca_perbaikan.py
"""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())
text Keluaran
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.0

Setiap 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.

python Contoh: membaca sheet tertentu dengan baris judul di tengah
# 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 dtypes selalu diperiksa segera setelah memuat.
  • Nilai hilang berlapis dinetralkan dengan na_values, desimal koma diperbaiki lewat tipe string, dan waktu campur diuraikan dengan format="mixed" beserta dayfirst.
  • Excel dan JSON membawa kasus tepi serupa, yaitu baris judul, sheet, dan orient, dengan prinsip pemeriksaan yang sama.

Referensi#