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.

matlab
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:

text
            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:

  1. Baris 1-5 (datetime({...}, 'InputFormat', ...)): teks ISO diurai menjadi vektor datetime 5×1 — parsing datetime dibahas penuh di Chapter Datetime dan Duration.
  2. Baris 9-10 (timetable(waktu, suhu, kelembapan, ...)): argumen pertama menjadi row times; dua vektor sisanya menjadi variabel Suhu dan Lembap.
  3. disp(TT): kolom Time tampil paling kiri tanpa header variabel — posisi khusus dimensi waktu.

Untuk data berinterval seragam, TimeStep lebih ringkas daripada vektor waktu manual:

matlab
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:

matlab
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:

text
Suhu rata-rata : 30.32 derajat
Jumlah data     : 5 baris
Waktu pertama   : 2026-01-15 08:00:00

Mekanismenya: 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, :).

matlab
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:

text
Menit pertama : 3 baris

Tiga 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.

matlab
TTmenit = retime(TT, 'minutely', 'mean')

Output yang Dihasilkan:

text
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:

  1. Bin 08:00: tiga pengukuran (30.1, 30.4, 30.2) dirata-rata menjadi 30.233; kelembapan (70+68+69)/3 = 69.
  2. Bin 08:01: dua pengukuran (30.6, 30.3) menjadi 30.45; kelembapan (66+67)/2 = 66.5.
  3. 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.

matlab
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:

text
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 #

Kriteriatabletimetable
Label baristanpa label / RowNames teksstempel waktu datetime/duration
Seleksi barisindeks, mask, namaditambah timerange dan relasi waktu
Operasi waktumanualretime, synchronize, lag/lead
Cocok untukdataset 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.