Teks dan tanggal adalah dua kolom yang paling sering disalahbaca, dan
kesalahannya jarang menimbulkan error, melainkan mengubah hasil secara diam-
diam. Topik ini merapikan kolom teks dengan str accessor milik pandas,
menguraikan kolom waktu yang formatnya campur pada dataset ukuran_udara.csv,
dan memperlihatkan jebakan urutan hari-bulan yang paling sering menggeser
data tanpa terlihat. Setelah membacanya, nama stasiun yang tertulis dalam
sembilan cara dan waktu dalam dua format dapat diluruskan dalam sepuluh
baris kode.
Teks: satu accessor untuk semua pembersihan#
Kolom teks pada Series pandas dibuka lewat .str, yang menyediakan metode
string Python untuk seluruh kolom sekaligus, seperti .strip(),
.lower(), .replace(), dan .title(). Rantai metode inilah bentuk kerja
utamanya, dan setiap mata rantai menjawab satu jenis kekacauan.
Dataset latihan ini menyimpan satu nama stasiun dalam sembilan cara, mulai dari huruf kecil, huruf besar, spasi ganda, sampai spasi menempel di ujung. Skrip berikut meluruskannya dengan tiga langkah serta menyeragamkan kolom kualitas yang hurufnya campur.
"""Pembersihan teks dengan str accessor dan penguraian waktu."""
import pandas as pd
data = pd.read_csv("ukuran_udara.csv", dtype={"kualitas": "string"})
print(sorted(data["stasiun"].unique()))
data["stasiun"] = (
data["stasiun"].str.strip().str.replace(r"\s+", " ", regex=True).str.title()
)
data["kualitas"] = data["kualitas"].str.title()
print(sorted(data["stasiun"].unique()))
print()
print(data["kualitas"].value_counts().to_string())
print()
# jebakan dayfirst: tanggal pertama bulan Maret
salah = pd.to_datetime("01/03/2026 00:00", dayfirst=False)
benar = pd.to_datetime("01/03/2026 00:00", dayfirst=True)
print("tanpa dayfirst:", salah.date(), "| dengan dayfirst:", benar.date())
data["waktu"] = pd.to_datetime(data["waktu"], format="mixed", dayfirst=True)
print("rentang:", data["waktu"].min(), "s.d.", data["waktu"].max())
print("baris per hari:", data["waktu"].dt.day.value_counts().sort_index().tolist())['STASIUN A', 'STASIUN B', 'Stasiun A', 'Stasiun A', 'Stasiun A ', 'Stasiun B', 'Stasiun B ', 'stasiun B', 'stasiun a']
['Stasiun A', 'Stasiun B']
kualitas
Baik 37
Sedang 25
tanpa dayfirst: 2026-01-03 | dengan dayfirst: 2026-03-01
rentang: 2026-03-01 00:00:00 s.d. 2026-03-02 05:00:00
baris per hari: [50, 12]Urutan tiga langkah tersebut tidak boleh diubah sembarangan. .strip()
menghilangkan spasi di ujung, lalu .replace() dengan pola \s+
merapatkan spasi ganda di tengah, dan .title() baru menyamakan hurufnya.
Apabila huruf disamakan lebih dahulu, pencarian nama yang salah tulis pada
berkas sumber menjadi lebih sulit dilacak. Hasilnya tegas, yaitu sembilan
penulisan menyusut menjadi dua nama yang konsisten, dan value_counts()
pada kualitas yang sudah dirapikan menghitung 37 berbanding 25 tanpa
pecahan akibat huruf besar-kecil.
Tanggal: format campur dalam satu kolom#
Kolom waktu pada dataset ini memakai dua format, yaitu ISO untuk satu
stasiun dan hari-lebih-dahulu untuk stasiun lainnya, sehingga penguraian
membutuhkan format="mixed" yang menilai setiap elemen secara terpisah.
Argumen dayfirst=True menegaskan bagian mana yang hari pada format
berangka pendek.
Jebakannya diperlihatkan langsung pada keluaran di atas, yaitu teks
01/03/2026 terbaca sebagai tanggal tiga Januari tanpa dayfirst, padahal
maksudnya satu Maret. Kesalahan semacam ini tidak menimbulkan error, kolomnya
tetap bertipe datetime, dan rentangnya pun tampak masuk akal, sehingga satu-
satunya pengaman adalah mengetahui sumber formatnya dan memeriksa rentang
min-max setelah penguraian.
Setelah kolom waktu benar, seluruh kemampuan deret waktu terbuka lewat
aksesor .dt, misalnya .dt.hour, .dt.day, dan .dt.day_name(), dan
value_counts() pada .dt.day di keluaran menghitung lima puluh baris untuk
hari pertama dan dua belas untuk hari keduanya, sesuai susunan dataset
latihan ini.
Konversi tipe yang tersisa#
Teks yang lahir dari ekspor sering menyembunyikan angka, dan pembersihan
teksnya selalu didahului pemeriksaan apa yang menghalangi konversi. Koma
desimal adalah kasus yang telah diperbaiki pada topik membaca berkas dengan
str.replace(",", ".") sebelum astype("float"), sedangkan spasi dan
karakter tak kasatmata dibersihkan dengan .strip() yang sama.
Urutan kerjanya tetap, yaitu netralkan nilai tidak sah, bersihkan teksnya,
baru konversi tipe. Konversi langsung tanpa pembersihan menghasilkan error
ValueError di tengah kolom, dan error itu sebenarnya informatif, karena
menunjuk baris pertama yang bermasalah beserta isinya.
Kolom yang dikonversi juga diperiksa ulang dengan dtypes, sebab konversi
yang tampak berhasil bisa diam-diam menghasilkan tipe object apabila satu
baris masih menyisakan teks, dan tipe akhir adalah bukti bahwa pembersihan
selesai.
Kesalahan umum#
Kesalahan pertama adalah .title() atau .lower() pada kolom kunci tanpa
memikirkan pemakaiannya setelahnya. Nama yang tersimpan harus konsisten
dengan tabel lain yang akan digabungkan, sehingga penyeragaman dilakukan
pada kedua sisi gabungan, bukan pada satu sisi saja.
Kesalahan kedua adalah mempercayai kolom datetime yang diurai tanpa argumen format. Kolomnya tampak benar, statistiknya berjalan, tetapi tanggal hari-lebih-dahulu sudah bergeser tiga bulan, dan pemeriksaan rentang min-max beserta penghitungan baris per hari adalah pemeriksaan yang murah dan menutupnya.
Kesalahan ketiga adalah pembersihan teks dengan perulangan Python satu per
satu. Selain lambat pada jutaan baris, pola itu mengabaikan nilai NaN,
sedangkan aksesor .str melewatinya dengan benar dan menjaga nilai hilang
tetap hilang.
Ringkasan#
- Aksesor
.strmengerjakan pembersihan teks untuk seluruh kolom, dan urutan strip, rapikan spasi, lalu samakan huruf adalah rantai yang umum. - Format waktu campur diuraikan dengan
format="mixed", dandayfirstmenentukan makna format berangka pendek yang tidak dapat ditebak. - Jebakan dayfirst tidak menimbulkan error, sehingga rentang min-max dan hitungan per hari menjadi pemeriksaan baku setelah penguraian.
- Konversi tipe dilakukan setelah nilai tidak sah dinetralkan, dan
dtypesadalah bukti akhirnya.
Referensi#
- Working with text data — pandas documentation
—
dokumentasi resmi aksesor
.strdan metode pembersihannya. - Time series / date functionality — pandas documentation
—
dokumentasi resmi
to_datetime,format="mixed", dan aksesor.dt. - datetime — Basic date and time types — Python documentation — daftar kode format waktu yang menjadi dasar penentuan format.