Teks dan Tanggal

Pembersihan string dengan str accessor dan penguraian timestamp yang beragam formatnya.

Daftar isi

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.

python teks_tanggal.py
"""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())
text Keluaran
['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 .str mengerjakan pembersihan teks untuk seluruh kolom, dan urutan strip, rapikan spasi, lalu samakan huruf adalah rantai yang umum.
  • Format waktu campur diuraikan dengan format="mixed", dan dayfirst menentukan 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 dtypes adalah bukti akhirnya.

Referensi#