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!