Symulacja czasu
W zadaniach maturalnych dotyczących symulacji, często będziemy musieli symulować akcje, które zachodzą przez pewien okres czasu. Przydatne do tego celu może okazać się klasa datetime dostępna w bibliotece standardowej Pythona.
Biblioteka datetime
Każdy program, w którym chcemy korzystać z funkcji dostępnych w bibliotece
datetime
, musimy rozpocząć od zaimportowania tej biblioteki:
# Wystarczy, że importujemy te części biblioteki datetime, które będą nam
# potrzebne
from datetime import datetime, date, time, timedelta
W następujący sposób można stworzyć nową instancję czasu:
# Data: 24 lutego 2024
date_no_time: date = date(2024, 2, 24)
# Czas: 13:58:01
time_no_date: time = time(13, 58, 1)
# Data i czas: 24 lutego 2024, 13:58:01
date_with_time: datetime = datetime(2024, 2, 24, 13, 58, 1)
Jeśli mamy podaną datę w formie napisu (np. w tekstowym pliku z danymi), to
możemy skorzystać z funkcji strptime
(string parse time), która przyjmuje
jako argumenty format daty i samą datę:
str_data: str = "2024-02-24 13:58:01"
data_format: str = "%Y-%m-%d %H:%M:%S"
data: datetime = datetime.strptime(str_data, data_format)
Własności konkretnej daty możemy przeczytać w następujący sposób:
data: datetime = datetime(2024, 2, 24, 13, 58, 1)
rok: int = data.year
miesiac: int = data.month
dzien: int = data.day
godzina: int = data.hour
minuta: int = data.minute
sekunda: int = data.second
dzien_tyg_1: int = data.weekday()
dzien_tyg_2: int = data.isoweekday()
Zwróćmy uwagę na ostatni przykład, w którym sprawdzamy dzień tygodnia - funkcja
weekday()
zwraca wartość z przedziału 0 do 6, a funkcja isoweekday()
zwraca
wartość od 1 do 7. Nie ma znaczenia, której z tych funkcji używamy, ale musimy
mieć świadomość tej różnicy i pamiętać o odpowiednim dostosowaniu do niej kodu.
Ostatnią ważną rzeczą jest "zwiększanie" czasu. Możemy to zrobić przy pomocy
obiektu timedelta
:
dzisiaj: date = date(2024, 2, 24)
# Konstruktor timedelta przyjmuje wiele argumentów nazwanych, np.: years,
# months, weeks, days, hours, minutes, seconds
roznica_dzien: timedelta = timedelta(days = 1)
jutro: date = dzisiaj + roznica_dzien
Daty można także porównywać przy pomocy standardowych operatorów matematycznych.
Więcej funkcji biblioteki datetime można znaleźć w oficjalnej dokumentacji tutaj.
Inne sposoby symulacji czasu
Zastosowanie biblioteki datetime pozwoli nam rozwiązać każdy problem związany z symulacją czasu, ale jej użycie nie zawsze jest konieczne. Często istotna jest tylko długość symulacji, wtedy np. symulację trwającą 150 dni przeprowadzimy w następujący sposób:
for i in range(150):
# Wykonaj symulację pojedynczego dnia
Gdyby w tej symulacji interesował nas tylko dzień tygodnia, moglibyśmy zrobić to w następujący sposób:
# Przyjmijmy, że pierwszym dniem symulacji jest sobota (dni od 0 do 6)
weekday: int = 5
for i in range(150):
# Wykonaj symulację pojedynczego dnia
# Zwiększ dzień tygodnia
weekday = (weekday + 1) % 7