Инструменты пользователя

Инструменты сайта


develop:pyton:date

Работа с датой и временем. Пользовательские функции

Работа с датой и временем

Модули:

  • time - текущие дата/время+ их форматированный вывод
  • datetime - манипуляции, арифметич операции и т.д.
  • calendar - календарь
  • timeit - позволяет измерить время выполнения фрагментов кода

Текущие дата/время

Модуль time

  • time()- вещественное число, кол-во секунд с начала эпохи (01.01.1970)
  • gmtime(<sec>= )- возвращает struct_time текущего времени либо указанному кол-ву сек с начала эпохи
  • localtime(<sec>= )- тоже самое, ток локальное время
  • mktime(<struct_time>)- -||-

Объект struct_time содержит:

  • tm_year (0)- год
  • tm_mon (1)- месяц
  • tm_mday (2)- день
  • tm_hour (3)- час
  • tm_min (4)- мин
  • tm_sec (5)- сек
  • tm_wday (6)- день недели
  • tm_yday (7)- кол-во дней с начала года
  • tm_isdst (8)- флаг летнего времени
d= time.gmtime()
d.tm_year, d[0]
 
# Все содержимое
tuple(d)
>> (2017, 11, 21, 14, 19, 34, 1, 325, 0)

Форматирование даты/время

  • strftime(<строка формата>, <struct_time>= ) - ДТ строкой, в указанном формате
  • strptime(<строка с датой>, <строка формата>= ) - разбирает строку в struct_time
  • asctime(<struct_time>= ) - строка в формате «%a %b %d %H:%M:%S»
  • ctime(<sec>= ) - аналогично предыдущему, но принимает кол-во секунд
:!: Аргументы форматирования:
  • %a Сокращенное название дня недели Вс, Пн
  • %A Полное название дня недели воскресенье, понедельник
  • %w День недели в виде десятичного числа 0…6
  • %d День месяца в виде десятичной дроби с нулями 01, 02
  • %-d день месяца в виде десятичного числа 1, 2..
  • %b Сокращенное название месяца Jan, Feb
  • %m месяц как десятичное число, дополненное нулями 01, 02
  • %-м месяц в виде десятичного числа 1, 2
  • %B Полное название месяца Январь, Февраль
  • %y год без века в виде десятичного числа, дополненного нулями 99, 00
  • %-й год без века в виде десятичного числа 0, 99
  • %Y год с веком в виде десятичного числа 2000, 1999
  • %H час (24-часовой формат) как десятичное число с нулями 01, 23
  • %-H час (24-часовой формат) в виде десятичного числа 1, 23
  • %I час (12-часовой формат) в виде десятичного числа с нулевым заполнением 01, 12
  • %-I час(12 часов) как десятичное число 1, 12
  • %p языковой стандарт AM или PM AM, PM
  • %M Минуты в виде десятичного числа, дополненного нулями 01, 59
  • %-M Минуты в виде десятичного числа 1, 59
  • %S Second как десятичное число, дополненное нулями 01, 59
  • %-S Секунда как десятичное число 1, 59
  • %f микросекунды в виде десятичного числа, дополненного нулями слева 000000, 999999
  • %z смещение UTC в формате +ЧЧММ или -ЧЧММ
  • %Z Название часового пояса
  • %j день года в виде десятичного числа, дополненного нулями 001, 365
  • %-j день года в виде десятичного числа 1 365
  • %U Номер недели в году (первым считается воскресенье) 0, 6
  • %W Номер недели года 00, 53
  • Соответствующее представление даты и времени локали %c Пн, 30 сентября, 07:06:05 2013 г.
  • %x языковое стандартное представление даты 30.11.98
  • Соответствующее представление времени локали %X 10:03:43
  • %% Буквенный символ «%» %

"Засыпание" скрипта

time.sleep(sec)

Модуль "datetime" манипуляции с ДТ

Модуль содержит классы:

  • timedelta - дата в виде кол-ва дней, сек, микросек. Экземпляр можно складывать с date/datetime. Результат будет в этом формате
  • date, time, datetime - дата, время, комбинация даты/время в виде объекта
  • tzinfo - time zone

timedelta

Конструктор- timedelta(<days>=, <seconds>=, <microsec>=, <milisec>=, <minutes>=, <hours>=, <weeks>= )
Можно присваивать в порядке следования, либо именованными аргументами (timedelta(hours= 1))
Поддерживаются арифметические операции, сравнение и т.д.

d1= datetime.timedelta(days= 2)
d2= datetime.timedelta(days= 7)
d1 + d2, d1 / d2 ...

date

Операции над датами. date(<год>, <месяц>, <день>).

Для получения есть методы:

  • today() - текущая дата
  • fromtimestamp(<sec>) - дата, в соответствии кол-ва секунд с начала эпохи
  • fromordinal() -
d= datetime.date.today()
d.day, d.month, d.year

Есть методы: replace(), strftime(), isoformat(), ctime(), timetuple(), toordinal(), weekday(), isoweekday(), isocalendar().

time

Операции над временем. time(<hour>=, <minute>=, <second>=, <microsec>=, <tzinfo>=, <fold>= )
Арифметические действия не поддерживаются, только сравнение.

datetime

В целом аналогично предыдущим, включает многое из них, в конструкторе обязательно дата, время не обязательно

  • today(), now(<Timezone>= )- если зона не указана, то аналогичен первому методу.
  • utcnow() - текущее время UTC
  • [utc]fromtimestamp(<sec>)
  • combine(<date>, <time>) - на основе двух экземпляров
  • strptime(<строка даты>, <формат>) - строка в дату

Модуль calendar

Содержит классы для вывода календаря в простом, текстовом виде
Базовый класс Calendar, возвратит перечень всех чисел указанного месяца, сгруппированных по дням недели
TextCalendar (LocateCalendar ) в виде форматированного текста (локализованные названия)
HTMLCalendar, LocateHTMLCalendar в html формате

import calendar
 
c= calendar.Calendar(0)
print(c.monthdayscalendar(2017, 11))
 
c= calendar.TextCalendar(0)
print(c.formatyear(2017))

Другие функции

  • weekheader() - строка- аббревиатур дней недели
  • isleap() - проверка года високосный
  • weekday() - номер дня недели указанной даты

Атрибуты:

  • day_[name,abbr] - список, содержащий перечень локализованных названий дней недели
  • month_[name,abbr] - список, содержащий перечень локализованных названий месяцев

Время выполнения фрагментов кода

Замер не конкретного куска кода а лишь образца кода, который передается строкой..
from timeit import Timer
Timer(<stmt>=, <setup>=, <timer>= ) - в первом указывается код, который нужно замерить, второй- код который нужно выполнить перед измерением

code1= """ for line in arr: ... """
t1= Timer(stmt= code1)
>> t1.timeit()

Пользовательские функции

Оператор pass можно использовать как загрузку для пустой функции

Определение и вызов

Функция сама является объектом, ссылкой, которую можно присваивать переменны, передавать и т.д.
Поддерживает стандартные атрибуты, такие как: name, doc, sizeof, dir и т.д., перечень можно получить вызовом функции dir()

Расположение определения

Определение должно быть перед вызовом, при использовании функции main, по сути не актуально

Необязательные параметры

Необязательность имеется ввиду значение по умолчанию, определение по ключам (по имени) поддерживается априори и порядок не имеет значения
Все аргументы передаются по ссылке поэтому изменяемые типы данных могут изменить исходную переменную, чтобы избежать, можно передавать копию, (func(var.copy()))

:!: Что касается предопределенных переменных - они похоже статические и могут накапливать значение при повторных вызовах, можно указать значение None

Переменное число параметров

Если перед переменной указать звездочку, то принимать сможем любое кол-во аргументов, придут они в кортеже
Если две звездочки, тогда в словаре
Если указать первое затем второе, то функция примет любое кол-во переменных. Указанные между ними параметры можно будет передавать только по именам.

Если функция не должна принимать переменного кол-ва параметров, но должна принимать только по именам, нужно указать звездочку без имени переменной

# Произвольное кол-во параметров
def func(*t):
  for i in t:
    ...
 
# Ф-я примет любые параметры
def func(*x, **y):
  ...
 
# Аргументы только по именам
def func(x=1, y=2, *, a):
  ...

Анонимные функции

т.н. лямбда функция, без имени, в качестве значения возвращает ссылку на объект-функцию, которую можно передать или присвоить переменной

f1= lambda: 10 + 20
f2= lambda x, y: x + y # аргументы
 
print(f1())
print(f2(10, 20))

Функции-генераторы

При последовательных вызовах, возвращает очередной элемент какой-либо последовательности, приостановить выполнение в текущем вызове можно оператором yield
Использование этого оператора собсна и делает обычную функцию функцией-генератором
Удобно при обработке действительно большой последовательности, в таком случае она не будет вся загружаться в память, а будет обрабатываться последовательно
Эти функции поддерживают метод next(), позволяющий получить следующее значение
Можно вкладывать генераторы

def func(x, y):
  for i in range(1, x+ 1):
    yield i ** y
 
i= func(3, 3)
print(i.__next__()) # Выведет: 1 (1 ** 3)
print(i.__next__()) # Выведет: 8 (2 ** 3)
print(i.__next__()) # Выведет: 27 (3 ** 3)
print(i.__next__()) # Исключение StopIteration

Декораторы функции

Обычные функции, выполняются перед вызовом целевой, для этого нужно указать «@mydecor» перед определением целевой
В аргументе декора передается ссылка на целевую функцию, видимо

def deco(f):
  ...
  return f # ссылка на целевую ф-ю
 
@deco
def func(x):
  ...
 
print (func(10))

Рекурсия

Все как обычно, только кол-во вызовов ограничено (1К), превышение вызывает исключение

Глобальные и локальные переменные

Глобальные переменные те что определены за пределами любой функции, и доступны во всем скрипте
Для обращение к ней из функции, возможно нужно внутри определить ее ключевым словом global, т.к. в локальной области по умолчанию переменные не пересекаются с глобальными, даже с одинаковым названием

Вложенные функции

Внутри вложенной функции доступна область видимости родительской функции
Доступны но изменить во вложенной так просто нельзя видимо, нужно объявить ее там оператором nonlocal
Не забываем что переменные передаются ссылками

Аннотации функций

Документирование аргументов функций

# Описание после двоеточия, можно указать выражение
def func(a: "Нужная переменная", b: 10+2= 12) 
develop/pyton/date.txt · Последнее изменение: 2022/02/20 10:32 — admin