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 #
| Format | Tipe data tetap tersimpan | Dibaca manusia | Karakteristik pemakaian |
|---|---|---|---|
| CSV | Tidak (semua jadi teks) | Sangat mudah | Standar pertukaran data antar alat |
| Excel | Sebagian (ada format tanggal) | Mudah | Laporan bisnis dengan beberapa sheet |
| JSON | Tidak | Mudah | Data API dan struktur bersarang |
| Parquet | Ya | Tidak | Pipeline data besar, terkompresi per kolom |
| Feather | Ya | Tidak | Cache 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.
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:
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: strBaris demi baris, inilah yang terjadi:
- Baris 7-16:
numpy.random.default_rng(42)memastikan data acak 2.000 baris selalu sama, sehingga angka ukuran file dapat direproduksi siapa pun. - Baris 18-24: keempat format ditulis ke dalam
TemporaryDirectory; seluruh file otomatis terhapus ketika blokwithselesai. - Baris 26-29:
Path.stat().st_sizemembaca ukuran setiap file dalam byte. - Baris 31-39: data dibaca ulang dari CSV dan Parquet untuk membandingkan dtype kolom
tanggaldankota.
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.