MATLAB - Data i czas

MATLAB oferuje narzędzia do obsługi zmiennych zawierających datę i czas. Mogą to być pojedyncze wartości lub serie danych określające konkretne chwile czasu. W jaki sposób importować dane „czasowe”? Z jakich funkcji korzystać do przetwarzania danych tego typu? Zapraszam do lektury wpisu.
Przykład – import danych z datą z pliku csv (ale też z txt, excela, itp..)

Zacznijmy od praktycznego przykładu. Mamy zbiór danych w formacie csv, z fotoradaru umieszczonego przy drodze. Plik (który można pobrać tutaj) zawiera pomiar trzech zmiennych: czasu pomiaru, prędkości pojazdu oraz temperatury otoczenia i tym samym dane w pliku są uporządkowane w trzech kolumnach rozdzielonych tabulatorem. Chcemy zaimportować te dane do MATLABA z uwzględnieniem czasu pomiaru i wykonać ich prostą analizę. Robimy to z użyciem kreatora importu (jak to zrobić było opisane w tym poście). Przypominam tylko, że wystarczy przeciągnąć plik do okna MATLABa, a naszym oczom ukaże się taki widok:

Kreator importu rozpoznał strukturę pliku i poprawnie nadał typ danych dla prędkości i temperatury jako Number. Wiemy jednak, że pierwsza kolumna zawiera datę i czas pomiaru. Do analizy takich zmiennych MATLAB ma specjalny typ danych datetime. Zmieńmy więc typ danych z Text na Dates and Times (datetime). Ponieważ w pliku data i czas są zapisane w formacie yyyy-MM-dd HH:mm:ss.SSS (czyli rok-miesiąc-dzień godzina(24H):minuty:sekundy:milisekundy), to należy wybrać more date formats.

W rozwijanej liście nie ma formatu zapisu daty i godziny, która jest w pliku, należy więc wpisać ją ręcznie w Custom Date Format podając yyyy-MM-dd HH:mm:ss.SSS:

Output Type zostawiamy na Table, bo będzie wygodnie analizować dane i klikamy Import Selection. W przestrzeni roboczej MATLABA została utworzona zmienna dane typu tabela, w której pierwsza kolumna zawiera datę i czas typu datetime, a dwie kolejne prędkość pojazdów i temperaturę typu Number. Dane zostały więc poprawnie zaimportowane.

W analogiczny sposób postępuje się przy imporcie innych danych zawierających datę. Należy tylko zwrócić uwagę na format zapisu daty/godziny w pliku, gdyż taki sam należy wybrać/podać w kreatorze importu.

Datetime – data i czas w MATLABie

Posługiwanie się zmienną typu datetime (w naszym przypadku jest to pierwsza kolumna tabeli) jest bardzo wygodne, a co więcej MATLAB oferuje wiele funkcji do analizy i transformacji danych czasowych.

Przyglądnijmy się danym pomiarowym.

close all; clc

% Uśrednienie wyników, żeby lepiej zobaczyć trend zmiany prędkości
predkoscSmth = smooth(dane.predkosc, 60);

% Rysunki
subplot(211)
plot(dane.czas, dane.predkosc, dane.czas, predkoscSmth, 'r')
ylabel('Prędkość [km/h]'); grid on;

subplot(212)
plot(dane.czas, dane.temp)
xlabel('Czas'); ylabel('Temperatura [^oC]');
grid on; 

Otrzymujemy wykresy zmiennych w funkcji daty i czasu pomiaru! Każdy wynik pomiarowy prędkości i temperatury ma swój unikalny „stempel” czasu. Dzięki temu można precyzyjnie analizować zmienność mierzonych wielkości. Widać na przykład, że średnia prędkość pojazdów maleje nieco pomiędzy godziną 15:00 a 20:00.

Jeżeli powiększymy fragment rysunku, to oś czasu zostanie poprawie przeskalowana:

Operacje na zmiennych datetime

Do obsługi zmiennych typu datetime MATLAB oferuje szereg narzędzi. Możemy na przykład obliczyć określony interwał czasu. Sprawdźmy więc czas rejestracji danych z pliku:

czas_rejestracji = dane.czas(end) - dane.czas(1)

czas_rejestracji = 

  duration

   23:55:38

Rejestracja wynosiła 23 godziny, 55 minut i 38 sekund czyli niemal dobę.

Możemy też sprawdzić jaki czas upłynął od chwili rozpoczęcia rejestracji danych do chwili obecnej. Za wygenerowanie bieżącej chwili czasu odpowiada funkcja datetime wywołana z argumentem now:

teraz = datetime('now','Format','yyyy-MM-dd HH:mm:ss.SSS');
interwal = teraz - dane.czas(1)

interwal = 

  duration

   77841:50:01

W moim przypadku (na dzień 18 listopada 2021) upłynęło 77841 godzin, 50 minut i jedna sekunda. Gdybyśmy chcieli wiedzieć ile to jest lat, dni lub minut należy użyć funkcji years, days i minutes:

interwal_y = years(interwal)
interwal_d = days(interwal)
interwal_m = minutes(interwal) 

interwal_y =

    8.8802


interwal_d =

   3.2434e+03


interwal_m =

   4.6705e+06

Zmienne tego typu można tworzyć na różne sposoby, za pośrednictwem wyżej wymienionych funkcji. Można korzystać ze zmiennych typu numerycznego, albo wprowadzać je bezpośrednio w skrypcie. Na przykład jeżeli chcemy utworzyć zmienną zawierającą kolejne daty:

Daty = {'2021-11-18';'2021-11-19';'2021-11-20'};
t = datetime(Daty,'InputFormat','yyyy-MM-dd')

t = 

  3×1 datetime array

   18-Nov-2021
   19-Nov-2021
   20-Nov-2021

Można również utworzyć datę z wektorów typu numerycznego:

Y = 2021;
 M = 11;
 D = [18; 19; 20];

t = datetime(Y,M,D)

t = 

  3×1 datetime array

   18-Nov-2021
   19-Nov-2021
   20-Nov-2021

Efekt jest taki sam.

Szczegółowy opis funkcji związanych ze zmiennymi datetime znajdziecie w dokumentacji technicznej MATLABa. Zachęcam do eksploracji!

(Visited 411 times, 1 visits today)

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *