Berkas log sensor menyimpan kolom waktu sebagai teks, sehingga kolom tersebut belum dapat diurutkan, disaring per rentang, atau diagregasi per periode. Topik ini membahas fungsi pd.to_datetime yang mengubah kolom teks menjadi datetime, mulai dari teks ISO yang dikenali tanpa parameter, teks format bebas yang memerlukan parameter format, hingga pilihan errors ketika terdapat teks yang tidak valid. Setelah membaca, kolom waktu pada dataset log sensor dapat dikonversi dengan kendali penuh atas penafsiran formatnya.
Konversi dasar dengan to_datetime#
Fungsi pd.to_datetime mengubah deret teks menjadi deret datetime dengan menebak susunan tanggal dari isi teksnya. Blok berikut menyimpan dataset kontrak log sensor ke berkas CSV, membacanya kembali tanpa parameter parse_dates, lalu mengonversi kolom waktunya. Pembacaan ulang ini meniru kondisi yang paling lazim di lapangan, yaitu berkas log yang baru diterima dan kolom waktunya masih berupa teks.
import numpy as np
import pandas as pd
rng = np.random.default_rng(42)
n = 96
df = pd.DataFrame({
"waktu": pd.date_range("2026-01-05 07:00", periods=n, freq="15min"),
"ruang": rng.choice(["Lab A", "Lab B", "Ruang Arsip"], n, p=[0.4, 0.35, 0.25]),
"suhu_c": np.round(rng.normal(24, 1.5, n), 1),
"lembap_pct": np.round(rng.normal(60, 5, n), 1),
"status_sensor": rng.choice(["normal", "kalibrasi", "rusak"], n, p=[0.85, 0.10, 0.05]),
})
df.to_csv("sensor_log.csv", index=False) # dataset bersama untuk seluruh modul
df_teks = pd.read_csv("sensor_log.csv") # tanpa parse_dates
print(df_teks["waktu"].head(3))
print("dtype kolom teks:", df_teks["waktu"].dtype)
waktu = pd.to_datetime(df_teks["waktu"])
print(waktu.head(3))
print("dtype hasil:", waktu.dtype)0 2026-01-05 07:00:00
1 2026-01-05 07:15:00
2 2026-01-05 07:30:00
Name: waktu, dtype: str
dtype kolom teks: str
0 2026-01-05 07:00:00
1 2026-01-05 07:15:00
2 2026-01-05 07:30:00
Name: waktu, dtype: datetime64[us]
dtype hasil: datetime64[us]Keluaran memperlihatkan dua keadaan kolom yang sama. Sebelum konversi, dtype-nya str, yaitu dtype teks khusus pada pandas 3.x, dan setiap nilainya masih berupa karakter yang tidak dapat dihitung selisihnya. Setelah pd.to_datetime dijalankan, dtype-nya menjadi datetime64[us], yaitu datetime beresolusi mikrodetik yang menjadi bawaan pandas 3.x. Konversi ini berjalan tanpa parameter tambahan karena teksnya mengikuti format ISO, dan urutan satuan pada format ISO memang tidak menimbulkan kekeliruan penafsiran. Selisih antar tanggal, pengurutan, dan agregasi per periode baru dimungkinkan oleh dtype datetime ini, sehingga konversi menjadi langkah pembuka seluruh analisis deret waktu pada modul ini.
Format eksplisit dengan parameter format#
Parameter format memberitahu pandas susunan teks tanggal secara eksplisit, sehingga konversi tidak lagi bergantung pada tebakan. Banyak perangkat perekam sensor menulis tanggal dengan urutan hari lebih dahulu, misalnya 05/01/2026 untuk tanggal 5 Januari 2026. Blok berikut membangun varian log dengan teks hari-awal menggunakan strftime, menyimpannya ke berkas terpisah, lalu mengonversinya kembali dengan format yang dinyatakan penuh.
import pandas as pd
df = pd.read_csv("sensor_log.csv")
waktu = pd.to_datetime(df["waktu"])
perangkat = df.copy()
perangkat["waktu"] = waktu.dt.strftime("%d/%m/%Y %H:%M")
perangkat.to_csv("log_perangkat.csv", index=False)
teks = pd.read_csv("log_perangkat.csv")["waktu"]
print(teks.head(4))
hasil = pd.to_datetime(teks, format="%d/%m/%Y %H:%M")
print(hasil.head(4))
print("dtype hasil:", hasil.dtype)0 05/01/2026 07:00
1 05/01/2026 07:15
2 05/01/2026 07:30
3 05/01/2026 07:45
Name: waktu, dtype: str
0 2026-01-05 07:00:00
1 2026-01-05 07:15:00
2 2026-01-05 07:30:00
3 2026-01-05 07:45:00
Name: waktu, dtype: datetime64[us]
dtype hasil: datetime64[us]Susunan %d/%m/%Y %H:%M terdiri atas directive, yaitu kode format yang masing-masing menangkap satu satuan waktu, dengan %d untuk hari, %m untuk bulan, %Y untuk tahun empat digit, %H untuk jam, dan %M untuk menit. Keluaran menunjukkan keempat teks 05/01/2026 terurai menjadi 2026-01-05, persis seperti tanggal aslinya. Dengan format eksplisit, hasil konversi tidak lagi bergantung pada isi teks yang kebetulan ditemui terlebih dahulu.
Pilihan errors=“raise” dan “coerce”#
Parameter errors menentukan sikap pd.to_datetime ketika menemukan teks yang tidak dapat diurai, dengan nilai bawaan "raise" yang menghentikan eksekusi dan nilai "coerce" yang mengganti teks tak valid menjadi NaT. NaT adalah singkatan dari Not a Time, yaitu nilai datetime yang menandai ketiadaan tanggal, sebagaimana NaN menandai ketiadaan angka. Blok berikut membandingkan kedua sikap pada deret teks kecil yang dibangun secara deterministik dengan satu baris tak valid di posisi tengah.
import pandas as pd
teks = pd.Series([
"2026-01-05 07:00", "2026-01-05 07:15", "bukan-tanggal", "2026-01-05 07:45",
])
try:
pd.to_datetime(teks, errors="raise")
except ValueError as e:
print(type(e).__name__, ":", e)
hasil = pd.to_datetime(teks, errors="coerce")
print(hasil)
print("jumlah NaT:", hasil.isna().sum())ValueError : time data "bukan-tanggal" doesn't match format "%Y-%m-%d %H:%M". You might want to try:
- passing `format` if your strings have a consistent format;
- passing `format='ISO8601'` if your strings are all ISO8601 but not necessarily in exactly the same format;
- passing `format='mixed'`, and the format will be inferred for each element individually. You might want to use `dayfirst` alongside this.
0 2026-01-05 07:00:00
1 2026-01-05 07:15:00
2 NaT
3 2026-01-05 07:45:00
dtype: datetime64[us]
jumlah NaT: 1Pada sikap bawaan, satu baris bukan-tanggal cukup untuk menghentikan seluruh konversi dengan ValueError, dan pesannya bahkan menawarkan beberapa koreksi format yang dapat dipilih. Pada errors="coerce", konversi tetap berjalan sampai akhir, baris tak valid menjadi NaT, dan baris valid lainnya tidak terganggu. Hitungan isna().sum() sebesar 1 memberi cara cepat untuk memrofil kualitas kolom tanggal sebelum memutuskan langkah pembersihan berikutnya.
Kesalahan umum#
Kesalahan yang paling sering terjadi adalah memanggil pd.to_datetime tanpa format pada teks bertanggal hari-awal, sehingga tebakan pandas menempatkan bulan di depan dan tanggalnya tertukar tanpa pesan error. Tebakan pandas mengikuti gaya Amerika Serikat yang menaruh bulan sebelum hari, sehingga teks 05/01/2026 dipahami sebagai 1 Mei 2026. Kekeliruan yang sama pernah ditemui pada parameter parse_dates di topik read_csv Secara Mendalam, dan penyebabnya adalah tebakan format yang sama. Blok berikut memperlihatkan tebakannya berdampingan dengan perbaikannya.
import pandas as pd
teks = pd.read_csv("log_perangkat.csv")["waktu"]
tebakan = pd.to_datetime(teks.head(4))
print(tebakan)
benar = pd.to_datetime(teks, dayfirst=True)
print(benar.head(4))0 2026-05-01 07:00:00
1 2026-05-01 07:15:00
2 2026-05-01 07:30:00
3 2026-05-01 07:45:00
Name: waktu, dtype: datetime64[us]
0 2026-01-05 07:00:00
1 2026-01-05 07:15:00
2 2026-01-05 07:30:00
3 2026-01-05 07:45:00
Name: waktu, dtype: datetime64[us]Baris pertama keluaran menunjukkan hasil tebakan yang menempatkan log pada 1 Mei 2026, padahal lognya merekam 5 Januari 2026, dan tidak ada peringatan yang menandai pertukaran itu. Baris kedua memperlihatkan dayfirst=True yang menghasilkan 2026-01-05 sesuai kenyataannya. Perbaikan lainnya adalah parameter format seperti pada bagian sebelumnya, yang sekaligus mengunci susunan menit dan jamnya. Prinsipnya sederhana, yaitu jangan membiarkan tanggal hari-awal ditebak, dan pemeriksaan beberapa nilai hasil konversi dengan head menjadi jaring pengaman murah sebelum tabelnya dipakai lebih jauh.
Ringkasan#
pd.to_datetimemengubah kolom teks menjadi datetime bertipedatetime64[us], dan teks ISO cukup dikonversi tanpa parameter tambahan.- Parameter
formatseperti"%d/%m/%Y %H:%M"menetapkan susunan teks secara eksplisit sehingga konversi tidak bergantung pada tebakan. errors="raise"menghentikan eksekusi denganValueErrorketika ada teks tak valid, sedangkanerrors="coerce"melanjutkan konversi dan mengganti teks tak valid menjadi NaT.- Tanpa
format, teks hari-awal seperti05/01/2026terbaca sebagai 1 Mei, dan perbaikannya adalahdayfirst=Trueatauformateksplisit.
Referensi#
- pandas.to_datetime — pandas API reference — dokumentasi resmi fungsi beserta parameter format, dayfirst, dan errors.
- Time series / date functionality — pandas User Guide — bab resmi fungsionalitas deret waktu pandas yang mencakup konversi dan penulisan tanggal.