Data sensor jarang datang rapi: satu perangkat mencatat tiap 20 detik, perangkat lain tiap 30 detik, kadang ada data yang hilang, dan analisis menuntut agregasi per menit atau per jam. timetable adalah table yang setiap barisnya dibubuhi stempel waktu — struktur khusus untuk time series — dilengkapi mesin pengolah waktunya sendiri: timerange untuk seleksi, retime untuk resampling/agregasi, dan synchronize untuk menyatukan banyak sumber. Chapter ini membangun semuanya dari data sensor suhu fiktif.
Membuat Timetable dari datetime dan Variabel #
Aturannya: timetable(var1, ..., varN, 'RowTimes', waktu) — atau bentuk singkatnya timetable(waktu, var1, ..., varN) — memasang vektor datetime sebagai label tiap baris. Mekanismenya: row times disimpan sebagai dimensi pertama (bukan variabel data); jumlah baris data wajib sama dengan jumlah waktu, dan vektor waktu harus terurut.
waktu = datetime({'2026-01-15 08:00:00'; '2026-01-15 08:00:20'; ...
'2026-01-15 08:00:40'; '2026-01-15 08:01:00'; ...
'2026-01-15 08:01:20'}, ...
'InputFormat', 'yyyy-MM-dd HH:mm:ss');
suhu = [30.1; 30.4; 30.2; 30.6; 30.3];
kelembapan = [70; 68; 69; 66; 67];
TT = timetable(waktu, suhu, kelembapan, ...
'VariableNames', {'Suhu', 'Lembap'});
disp(TT)Output yang Dihasilkan:
Time Suhu Lembap
____________________ ____ _____
15-Jan-2026 08:00:00 30.1 70
15-Jan-2026 08:00:20 30.4 68
15-Jan-2026 08:00:40 30.2 69
15-Jan-2026 08:01:00 30.6 66
15-Jan-2026 08:01:20 30.3 67 Mari kita bedah baris-baris kode di atas:
- Baris 1-5 (
datetime({...}, 'InputFormat', ...)): teks ISO diurai menjadi vektordatetime5×1 — parsing datetime dibahas penuh di Chapter Datetime dan Duration. - Baris 9-10 (
timetable(waktu, suhu, kelembapan, ...)): argumen pertama menjadi row times; dua vektor sisanya menjadi variabelSuhudanLembap. disp(TT): kolomTimetampil paling kiri tanpa header variabel — posisi khusus dimensi waktu.
Untuk data berinterval seragam, TimeStep lebih ringkas daripada vektor waktu manual:
TTseragam = timetable(suhu, 'TimeStep', seconds(20), 'VariableNames', {'Suhu'});Mekanismenya: MATLAB menghitung row times otomatis mulai 0 detik dengan selang seconds(20) — hasilnya kelas duration, bukan datetime; pilihan antara keduanya bergantung apakah stempel kalender penting atau tidak.
Dot Access: Data dan Waktu #
Akses variabel memakai dot persis seperti table; row times sendiri diakses lewat nama dimensi bawaan Time:
fprintf('Suhu rata-rata : %.2f derajat\n', mean(TT.Suhu));
fprintf('Jumlah data : %d baris\n', height(TT));
fprintf('Waktu pertama : %s\n', datestr(TT.Time(1), 'yyyy-mm-dd HH:MM:SS'));Output yang Dihasilkan:
Suhu rata-rata : 30.32 derajat
Jumlah data : 5 baris
Waktu pertama : 2026-01-15 08:00:00Mekanismenya: TT.Suhu mengeluarkan kolom sebagai double 5×1 sehingga mean langsung bekerja (30.32 = 151.6/5); TT.Time mengeluarkan vektor datetime — nama Time adalah dimensi pertama bawaan timetable, bukan variabel biasa.
Seleksi Baris dengan timerange #
Aturannya: timerange(mulai, selesai) membuat subskrip yang memilih baris dalam rentang waktu — termasuk mulai, mengecualikan selesai (interval setengah terbuka). Mekanismenya: subskrip tersebut dipakai seperti indeks baris biasa, TT(subskrip, :).
mulai = datetime('2026-01-15 08:00:00', 'InputFormat', 'yyyy-MM-dd HH:mm:ss');
selesai = datetime('2026-01-15 08:01:00', 'InputFormat', 'yyyy-MM-dd HH:mm:ss');
TT1menit = TT(timerange(mulai, selesai), :);
fprintf('Menit pertama : %d baris\n', height(TT1menit));Output yang Dihasilkan:
Menit pertama : 3 barisTiga baris pertama (08:00:00, 08:00:20, 08:00:40) terpilih; baris 08:01:00 tepat di batas selesai ikut terkecuali. Mask logis pada waktu juga sah — TT(TT.Time < selesai, :) memberikan hasil yang sama — tetapi timerange lebih deskriptif untuk rentang dan mendukung mode interval lain ('open', 'closed') lewat argumen ketiga.
retime: Resampling dan Agregasi #
Aturannya: retime(TT, langkah, metode) mengubah kerapatan data — langkah menentukan bin waktu baru dan metode menentukan cara mengisinya. Mekanismenya: data tiap variabel dikelompokkan ke bin [kiri, kanan); 'mean' merata-ratakan isi bin, 'linear' menginterpolasi, 'nearest' menyalin nilai terdekat. Row times hasil agregasi adalah tepi kiri bin.
TTmenit = retime(TT, 'minutely', 'mean')Output yang Dihasilkan:
TTmenit =
2×2 timetable
Time Suhu Lembap
____________________ ______ _____
15-Jan-2026 08:00:00 30.233 69
15-Jan-2026 08:01:00 30.45 66.5 Mari kita bedah hasil tersebut:
- Bin 08:00: tiga pengukuran (30.1, 30.4, 30.2) dirata-rata menjadi
30.233; kelembapan(70+68+69)/3 = 69. - Bin 08:01: dua pengukuran (30.6, 30.3) menjadi
30.45; kelembapan(66+67)/2 = 66.5. - Dari 5 baris menjadi 2 — persis agregasi per menit yang dibutuhkan laporan.
Langkah bawaan mencakup 'secondly', 'minutely', 'hourly', 'daily', 'weekly', 'monthly', 'quarterly', 'yearly'. Interval di luar daftar itu ditulis sebagai duration: retime(TT, 'regular', 'mean', 'TimeStep', minutes(30)).
synchronize: Menyatukan Dua Timetable #
Masalah klasik: sensor A mencatat pada 08:00:00/20/40, sensor B pada 08:00:10/30 — waktunya tak pernah bertabrakan. Aturannya: synchronize(TT1, TT2) menyeragamkan kedua timetable ke vektor waktu gabungan; tanpa metode, titik yang tak punya data diisi penanda hilang (NaN untuk numerik). Mekanismenya: gabungan (union) seluruh row times menjadi sumbu baru, lalu tiap variabel disusun ulang mengikuti sumbu itu.
waktuA = datetime({'2026-01-15 08:00:00'; '2026-01-15 08:00:20'; ...
'2026-01-15 08:00:40'}, 'InputFormat', 'yyyy-MM-dd HH:mm:ss');
TTA = timetable(waktuA, [30.1; 30.4; 30.2], 'VariableNames', {'SuhuA'});
waktuB = datetime({'2026-01-15 08:00:10'; '2026-01-15 08:00:30'}, ...
'InputFormat', 'yyyy-MM-dd HH:mm:ss');
TTB = timetable(waktuB, [31.0; 30.8], 'VariableNames', {'SuhuB'});
TTgabung = synchronize(TTA, TTB)Output yang Dihasilkan:
TTgabung =
5×2 timetable
Time SuhuA SuhuB
____________________ _____ _____
15-Jan-2026 08:00:00 30.1 NaN
15-Jan-2026 08:00:10 NaN 31
15-Jan-2026 08:00:20 30.4 NaN
15-Jan-2026 08:00:30 NaN 30.8
15-Jan-2026 08:00:40 30.2 NaN Baris NaN menandai saat hanya satu sensor yang aktif. Metode pengisian ditambahkan sebagai argumen keempat: synchronize(TTA, TTB, 'union', 'linear') menginterpolasi celah — pada 08:00:10, SuhuA terisi 30.25 (titik tengah 30.1 dan 30.4) dan pada 08:00:20, SuhuB terisi 30.9; titik di luar jangkauan data suatu sensor tetap NaN karena interpolasi tidak mengekstrapolasi. Basis waktu selain 'union' juga tersedia, misalnya 'intersection' untuk hanya menyimpan waktu yang sama-sama punya data.
Timetable vs Table #
| Kriteria | table | timetable |
|---|---|---|
| Label baris | tanpa label / RowNames teks | stempel waktu datetime/duration |
| Seleksi baris | indeks, mask, nama | ditambah timerange dan relasi waktu |
| Operasi waktu | manual | retime, synchronize, lag/lead |
| Cocok untuk | dataset statis (inventori, karyawan) | data sensor, harga saham, log |
| Konversi | — | table2timetable / timetable2table |
Aturan praktisnya: begitu baris data merepresentasikan “kapan”, pindahkan ke timetable — seluruh perangkat waktu menyala otomatis.
Ringkasan #
Timetable dibuat dengan timetable(waktu, var...) atau TimeStep untuk interval seragam; row times diakses lewat TT.Time, variabel lewat TT.Var seperti pada table. Seleksi baris memakai timerange(mulai, selesai) (setengah terbuka), retime(TT, 'minutely', 'mean') meresampling sekaligus mengagregasi ke bin waktu, dan synchronize menyatukan banyak sumber ke satu sumbu waktu dengan NaN, interpolasi, atau metode lain. Timetable adalah table yang stempel waktunya jadi warga kelas satu. Berkas contoh.m merangkum seluruh alur dari pembuatan hingga sinkronisasi.