Первый вариант: на основе словаря, более быстрый вариант:
import datetime import time def time_of_day_dict(dt=None, ts=None, tod_dict=None): ''' Принимает объект datetime (dt) или timestamp (ts), и словарь tod_dict {час : наименование времени} Возвращает строку c временем суток. При отсутствии аргументов - возвращает строку с текущим временем суток. Словарь по умолчанию: {0: 'ночь', 1: 'ночь', 2: 'ночь', 3: 'раннее утро', 4: 'раннее утро', 5: 'раннее утро', 6: 'утро', 7: 'утро', 8: 'утро', 9: 'первая половина дня', 10: 'первая половина дня', 11: 'первая половина дня', 12: 'обед', 13: 'обед', 14: 'обед', 15: 'после обеда', 16: 'после обеда', 17: 'после обеда', 18: 'вечер', 19: 'вечер', 20: 'вечер', 21: 'поздний вечер', 22: 'поздний вечер', 23: 'поздний вечер' } Eсли час не отражен в словаре, возвращает None Требует import datetime N.B. ф-я в 2-3 раза быстрее, чем ф-я time_of_day() ''' # определение словаря if tod_dict: pass else: tod_dict = {0: 'ночь', 1: 'ночь', 2: 'ночь', 3: 'раннее утро', 4: 'раннее утро', 5: 'раннее утро', 6: 'утро', 7: 'утро', 8: 'утро', 9: 'первая половина дня', 10: 'первая половина дня', 11: 'первая половина дня', 12: 'обед', 13: 'обед', 14: 'обед', 15: 'после обеда', 16: 'после обеда', 17: 'после обеда', 18: 'вечер', 19: 'вечер', 20: 'вечер', 21: 'поздний вечер', 22: 'поздний вечер', 23: 'поздний вечер'} # определение оцениваемого времени if dt: if isinstance(dt, datetime.datetime): dt = dt else: print('некорректный формат dt: %s \n требуется объект datetime.datetime' % (type(dt))) return None elif ts: if isinstance(ts, (int, float)): if ts > 0: dt = datetime.datetime.fromtimestamp(ts) print(dt.ctime()) else: print('отрицательное значение ts недопустимо') return None else: print('некорректный формат ts: %s \n требуется значение int или float' % (type(ts))) return None else: dt = datetime.datetime.now() h = dt.hour # подбор if h in tod_dict: tod = tod_dict[h] return tod else: print('Значение времени отсутствует в словаре') return None
Второй вариант, как пример того, как делать не надо ))
def time_of_day(dt=None, ts=None, tod_dict=None): ''' Принимает объект datetime (dt) или timestamp (ts), и словарь tod_dict {наименование времени : час окончания(включительно)} Возвращает строку c временем суток При отсутствии аргументов - возвращает строку с текущим временем суток. Словарь по умолчанию: {'ночь' : 3, 'раннее утро' : 6, 'утро' : 9, 'первая половина дня' : 12, 'обед' : 15, 'после обеда' : 18, 'вечер' : 21, 'поздний вечер' : 24, } Если час не отражен в словаре, возвращает None Требует import datetime ''' # определение словаря if tod_dict: pass else: tod_dict = {'ночь': 3, 'раннее утро': 6, 'утро': 9, 'первая половина дня': 12, 'обед': 15, 'после обеда': 18, 'вечер': 21, 'поздний вечер': 24, } sorted_tod = sorted(tod_dict.items(), key=lambda x: x[1], reverse=False) # print(sorted_tod) # определение оцениваемого времени if dt: if isinstance(dt, datetime.datetime): dt = dt else: print('некорректный формат dt: %s \n требуется объект datetime.datetime' % (type(dt))) return None elif ts: if isinstance(ts, (int, float)): if ts > 0: dt = datetime.datetime.fromtimestamp(ts) print(dt.ctime()) else: print('отрицательное значение ts недопустимо') return None else: print('некорректный формат ts: %s \n требуется значение int или float' % (type(ts))) return None else: dt = datetime.datetime.now() h = dt.hour # подбор for time in sorted_tod: if h <= time[1]: tod = time[0] return tod print('Значение времени отсутствует в словаре') return None