Преобразовать float в двоеточие или datatime
Этот вариант кода используется в моем Телеграм-боте, для перебора расписания в реальном времени и выдаче ближайших маршруток. Все работает, но меня смущает и режет глаз, что в выдаче формат 17.1, а нужно 17:10 или 9:00
PS прошу помощи, спасибо! может это и дом из костылей, но я учусь всего три недели, не судите строго...
d1 = datetime.datetime.today().strftime('%H.%M') # Это переменная времени
if float(d1) < 17.10:
marsh17 = 6.1, 6.2, 6.4, 7.1, 9.0, 9.2, 9.3,16.0, 16.1, 17.10, 42, 43# 42 43 для того чтобы
#небыло ошибки при 17.10
d1 = float(d1) # подставить для проверки из списка
rasp = []
for i in marsh17:
if float(i) >= d1:
rasp.append(str(i))
print(f'Два ближайших! ➔ {rasp[0]} ➔ {rasp[1]}')
else:
print('Маршрутки кончились ?')
marsh17 = ('6:10', '6:20', '6:40', '7:10', '7:20', '7:30', '7:40', '8:10', '8:20', '8:40', '9:00', '9:20', '9:30', '10:00', '10:10', '10:20', '10:40', '11:00', '11:20', '11:30', '11:45', '12:20', '12:40', '12:50', '13:10', '13:25', '13:35', '14:00', '14:25', '14:35', '14:45', '15:10', '15:30', '15:5', '16:00', '16:10', '17:10')
result = [i for i in marsh17 if i >= '11:05']
if not result:
print('Маршрутки кончились ?')
elif len(result) == 1:
print(f'Еще один рейс в {result[0]}!')
else:
print(f'Два ближайших рейса ➔ {result[0]} ➔ {result[1]}')
Ответы (2 шт):
from datetime import datetime
from datetime import timedelta
def main():
d1 = datetime.today() # Это переменная времени
current = timedelta(hours=d1.hour, minutes=d1.minute)
seventeen_ten = timedelta(hours=17, minutes=10)
if current < seventeen_ten:
marsh17 = (timedelta(hours=h, minutes=m) for h, m in ((6, 10), (6, 20), (6, 40), (7, 10), (9, 0), (9,20), (9, 30), (16, 0), (16, 1), (17, 10)))
rasp = []
for i in marsh17:
if i >= current:
rasp.append(str(i))
print(f'Два ближайших! ➔ {rasp[0]} ➔ {rasp[1]}')
else:
print('Маршрутки кончились ?')
if __name__ == '__main__':
main()
работаем только с timedelta. рассписание можно даже в файл положить и построчно читать его.
можно использовать только time
from datetime import datetime
from datetime import time
def main():
d1 = datetime.time(datetime.now()) # Это переменная времени
seventeen_ten = time(17, 10)
if d1 < seventeen_ten:
marsh17 = (time(h, m) for h, m in ((6, 10), (6, 20), (6, 40), (7, 10), (9, 0), (9,20), (9, 30), (16, 0), (16, 1), (17, 10)))
rasp = []
for i in marsh17:
if i >= d1:
rasp.append(str(i))
print(f'Два ближайших! ➔ {rasp[0]} ➔ {rasp[1]}')
else:
print('Маршрутки кончились ?')
if __name__ == '__main__':
main()
Я имел ввиду что мы можем положить рядом файл с именем marsh17, в который построчно записать рассписание маршрута
6 10
6 10
6 20
6 40
7 10
9 0
9 20
9 30
16 0
16 10
17 10
а в коде прочитать его и сфромировать рассписание
from datetime import datetime
from datetime import timedelta
def nextex(iter):
try:
return next(iter)
except StopIteration:
return "Nothing"
def load_marsh(nomber):
source_path = f"marsh{nomber}"
with open(source_path, "r") as f:
source_lines = (x.strip().split() for x in f if x.strip())
marsh = tuple(timedelta(hours=int(h), minutes=int(m)) for h, m in source_lines)
return marsh
def main():
current = datetime.now()
current = timedelta(hours=current.hour, minutes=current.minute)
# current = timedelta(hours=17, minutes=10)
seventeen_ten = timedelta(hours=17, minutes=10)
if current <= seventeen_ten:
marsh17 = load_marsh(17)
rasp = filter(lambda x: x >= current, marsh17) # фильтруем все что меньше текущего времени
print(f'Два ближайших! ➔ {nextex(rasp)} ➔ {nextex(rasp)}')
else:
print('Маршрутки кончились ?')
if __name__ == '__main__':
main()
Или, как вариант, работайте со строкой и сравнивайте строки:
from datetime import datetime
shedule_17 = ('06:10', '06:20', '06:40', '07:10', '09:00', '09:20', '09:30', '16:00', '16:10', '17:10')
result = [i for i in shedule_17 if i >= str(datetime.now().time())]
в result будет список оставшихся на сегодня рейсов,
например, при .now() == 16:09:
>>> result
['16:10', '17:10']
или при .now() == 9:10
>>> result
['09:20', '09:30', '16:00', '16:10', '17:10']
тогда два ближайших:
>>> result[:2]
['09:20', '09:30']
ну, и для вашего случая:
if not result:
print('Маршрутки кончились ?')
elif len(result) == 1:
print(f'Еще один рейс в {result[0]}!')
else:
print(f'Два ближайших рейса ➔ {result[0]} ➔ {result[1]}')