Функция определения времени суток (Python)

Заметка

Первый вариант: на основе словаря, более быстрый вариант:

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

 

Пример функции сортировки “пузырьком” (Python)

Сортировка "пузырьком" - простой способ сортировки списка.
Суть способа: последовательное сравнение каждого элемента с последующими и взаимная смена позиций в случае, если первый элемент больше сравниваемого.
Название отражает "всплытие" бОльших элементов в конец списка.

[pastacode lang="markup" manual="def%20bubble_sort(lst)%3A%0A%20%20%20%20for%20i%20in%20range(0%2C%20len(lst)-1)%3A%0A%20%20%20%20%20%20%20%20for%20i%20in%20range(0%2C%20len(lst)-1)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20lst%5Bi%5D%20%3C%20lst%5Bi%2B1%5D%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20pass%0A%20%20%20%20%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20lst%5Bi%5D%2C%20lst%5Bi%2B1%5D%20%3D%20%20lst%5Bi%2B1%5D%2Clst%5Bi%5D%0A%20%20%20%20return%20lst%0A%0Alst%20%3D%20%5B2%2C8%2C4%2C6%2C-88%2C9%2C0%2C1%2C5%2C8%2C0%2C9%2C8%2C-190%5D%0Abubble_sort(lst)%0A%0A%3E%3E%3E%20%5B-190%2C%20-88%2C%200%2C%200%2C%201%2C%202%2C%204%2C%205%2C%206%2C%208%2C%208%2C%208%2C%209%2C%209%5D" message="Сортировка пузырьком" highlight="" provider="manual"/]

О формате сохранения данных HDF

pandas hdfstore

Долгое время лелеял себя надеждой, что смогу построить  эффективную базу данных в формате  HDF. А что?  Очень быстрая, прекрасно интегрируется с pandas - что еще нужно, если основные операции завязаны на pandas?

Проблема в одном - при попытке вносить изменения  в таблицы база начинает неконтролируемо расти. Даже при повторном сохранении одногиговой базы,  в которую не было добавлено ни одной строчки, файл, ничтоже сумняшеся, прибавляет в весе 150-200 мегабайт.  Облазил документацию и стаковерфлоу в поисках правильного рецепта приготовления HDF, но не преуспел.

И только недавно наткнулся на дельный совет - не старайтесь использовать hdf как базу данных. Этот формат отлично приспособлен для быстрого сохранения большого датафрейма и быстрого же его чтения, но  апдейт - не про него.

Плюнул я на все эти свои эксперименты и вернулся к старому доброму SQL.