Sepanjang Section ini kita telah membaca dan menulis data dalam banyak wujud: CSV, Excel, JSON, Parquet, Feather, HTML, dan tabel database. Keahlian teknisnya sudah terbentuk; pertanyaannya kini lebih strategis — format apa yang sebaiknya kita pilih untuk kebutuhan tertentu? Pilihan format memengaruhi ukuran file, kecepatan baca-tulis, pelestarian tipe data, dan seberapa mudah rekan yang tidak memakai Python bisa membukanya. Chapter ini merangkum kriteria pemilihan, membandingkan format utama dalam satu tabel, lalu mengukur ukuran file secara nyata dengan contoh runnable.

Kriteria Memilih Format #

Empat pertanyaan berikut biasanya cukup untuk menuntun keputusan:

  • Untuk siapa file ini? Rekan bisnis dan aplikasi spreadsheet menyukai CSV dan Excel; pipeline Python bebas memakai format biner.
  • Seberapa besar datanya? Dataset besar membutuhkan format biner terkompresi seperti Parquet agar proses baca dan simpan tetap cepat.
  • Apakah tipe data harus utuh? Tanggal dan kategori yang dikonversi ulang dari teks menyita waktu; format biner menyimpan dtype secara eksplisit.
  • Apakah strukturnya bertingkat? Data bersarang seperti hasil API lebih alami disimpan dalam JSON.

Perbandingan Format Utama #

FormatTipe data tetap tersimpanDibaca manusiaKarakteristik pemakaian
CSVTidak (semua jadi teks)Sangat mudahStandar pertukaran data antar alat
ExcelSebagian (ada format tanggal)MudahLaporan bisnis dengan beberapa sheet
JSONTidakMudahData API dan struktur bersarang
ParquetYaTidakPipeline data besar, terkompresi per kolom
FeatherYaTidakCache cepat antar proses Python

Rincian perilaku tiap format dapat ditelusuri di halaman IO Tools . Dua format biner di tabel memiliki keunikan teknis: pandas.DataFrame.to_parquet menyimpan data per kolom dengan kompresi bawaan, sedangkan pandas.DataFrame.to_feather memprioritaskan kecepatan baca-tulis untuk pemakaian jangka pendek.

Mengukur Ukuran File secara Nyata #

Ukuran adalah salah satu kriteria yang bisa kita ukur sendiri. Skrip berikut membangun DataFrame 2.000 baris dengan kolom id, kota, tanggal, dan nilai, lalu menulis DataFrame yang sama persis ke empat format: CSV, JSON, Parquet, dan Feather. Ukuran file dihitung dari Path.stat().st_size, bukan perkiraan. Perbandingan kecepatan dan format Excel sengaja tidak kita sertakan: hasil pengukuran waktu tidak stabil antar mesin, sedangkan file .xlsx pada dasarnya arsip ZIP yang ukurannya bisa bergeser beberapa byte antar eksekusi sehingga tidak deterministik.

python
import tempfile
from pathlib import Path

import numpy as np
import pandas as pd

rng = np.random.default_rng(42)
n = 2000
kota_pilihan = ["Bandung", "Jakarta", "Surabaya", "Medan", "Denpasar"]

df = pd.DataFrame({
    "id": np.arange(n),
    "kota": rng.choice(kota_pilihan, size=n),
    "tanggal": pd.date_range("2026-01-01", periods=n, freq="h"),
    "nilai": rng.normal(100000, 25000, size=n).round(2),
})

with tempfile.TemporaryDirectory() as folder:
    folder_path = Path(folder)

    df.to_csv(folder_path / "data.csv", index=False)
    df.to_json(folder_path / "data.json", orient="records", date_format="iso")
    df.to_parquet(folder_path / "data.parquet", index=False)
    df.to_feather(folder_path / "data.feather")

    print("Ukuran file untuk DataFrame yang sama:")
    for nama in ["csv", "json", "parquet", "feather"]:
        path = folder_path / f"data.{nama}"
        print(f"{path.suffix:8s}: {path.stat().st_size:>8d} byte")

    df_csv = pd.read_csv(folder_path / "data.csv")
    df_parquet = pd.read_parquet(folder_path / "data.parquet")
    print()
    print("dtype kolom tanggal setelah dibaca ulang:")
    print("  CSV    :", df_csv["tanggal"].dtype)
    print("  Parquet:", df_parquet["tanggal"].dtype)
    print("dtype kolom kota setelah dibaca ulang:")
    print("  CSV    :", df_csv["kota"].dtype)
    print("  Parquet:", df_parquet["kota"].dtype)

Output yang Dihasilkan:

text
Ukuran file untuk DataFrame yang sama:
.csv    :    83757 byte
.json   :   163736 byte
.parquet:    45075 byte
.feather:    48114 byte

dtype kolom tanggal setelah dibaca ulang:
  CSV    : str
  Parquet: datetime64[us]
dtype kolom kota setelah dibaca ulang:
  CSV    : str
  Parquet: str

Baris demi baris, inilah yang terjadi:

  1. Baris 7-16: numpy.random.default_rng(42) memastikan data acak 2.000 baris selalu sama, sehingga angka ukuran file dapat direproduksi siapa pun.
  2. Baris 18-24: keempat format ditulis ke dalam TemporaryDirectory; seluruh file otomatis terhapus ketika blok with selesai.
  3. Baris 26-29: Path.stat().st_size membaca ukuran setiap file dalam byte.
  4. Baris 31-39: data dibaca ulang dari CSV dan Parquet untuk membandingkan dtype kolom tanggal dan kota.

Hasilnya konsisten dengan teori: JSON paling besar karena menyimpan nama kolom berulang di setiap baris, sedangkan Parquet dan Feather — dua format biner — paling ramping. Perbedaan dtype juga terlihat jelas: CSV mengembalikan kolom tanggal sebagai str, sementara Parquet mengembalikan datetime64[us] tanpa perlu parameter parse_dates. Perbedaan inilah yang membuat format biner menghemat kerja pembersihan.

Rekomendasi Praktis #

  • CSV untuk pertukaran data antar alat dan data yang perlu dibaca manusia; sertakan parameter parsing yang tepat saat membacanya.
  • Excel untuk laporan bisnis dengan beberapa sheet dan pembaca non-teknis.
  • JSON untuk data bersarang hasil API atau file konfigurasi.
  • Parquet untuk dataset besar dan pipeline: ukuran kecil, dtype utuh, dan dapat dibaca berbagai sistem di ekosistem data.
  • Feather untuk cache sementara antar proses Python karena baca-tulisnya sangat cepat.

Dengan kriteria dan tabel di atas, keputusan menyimpan data tidak lagi mengandalkan kebiasaan. Section berikutnya, Indexing dan Seleksi Data, membawa kita kembali ke inti pekerjaan pandas: memilih kolom dan baris yang tepat dari DataFrame, dimulai dari memilih satu kolom.