Документация на русском
Этот модуль позволяет извлекать даты из пользовательского ввода.
Обработка строк осуществляется через класс Datify
.
- English - English Readme
- Русский
- Украинский
Просто выполните pip install datify
из командной строки (pip должен быть установлен).
Datify(user_input, year, month, date)
: принимает user_input: str
при создании. Также может принимать именованые аргументы year
, month
и day
вместе с user_input
или без него. Если ни один параметр не задан, поднимает ValueError. См. секцию Форматы, чтобы ознакомиться со стандартными форматами Datify.
find_date(string)
: Принимает str. Возвращает подстроку с датой в формате General Date Format если она содержится в заданной строке. Иначе возвращает None.is_year(year)
: Принимает str или int. Возвращает True если заданый параметр соответствует формату Digit Year Format.is_digit_month(month)
: Принимает str или int. Возвращает True если заданый параметр соответствует формату Digit Month Format.is_alpha_month(string)
: Принимает str. Возвращает True если заданная строка содержится в словаре названий месяцев. Для языков, в которых есть падежи (русский, украинский) в основном достаточно иметь в словаре только именительную форму слова.get_alpha_month(string)
: Принимает str. Возвращает int - номер месяца в заданой строке согласно словарю. Если строка не содержит известное имя месяца, врозвращает None.is_day(day)
: Принимает str или int. Возвращает True если заданый параметр соответствует формату Day Format.is_date(date)
: Принимает str или int. Возвращает True если заданый параметр соответствует формату General Date Format (См. секцию Форматы).is_date_part(string)
: Принимает str. Возвращает True если заданый параметр содержит хотя бы одну часть даты - день, месяц (номер или название) или год.
date()
: Возвращает datetime object из параметров экземпляра Datify. Если были получены не все нужные параметры (year
,month
иday
), daytime поднимает TypeError.tuple()
: Возвращает кортеж из всех известных параметров. Если месяц или день не заданы, нет никакого способа определить, что именно находится в кортеже после того, как он был получен!date_or_tuple()
: Возвращает datetime object, если известны все нужные параметры. Иначе возвращает кортеж из известных параметров.set_year(year)
: Принимает str или int. Извлекает год из полученной переменной и устанавливает полеyear
вызванного экземпляра Datify. Если полученный параметр не соответствует формату Year Format, поднимает ValueError. Если год получен в сокращенном формате YY, это считается как 20YY.set_month(month)
: Принимает str или int. Извлекает месяц из полученной переменной и устанавливает полеmonth
вызванного экземпляра Datify. Если полученный параметр не соответствует формату Digit/Alpha Month Format, поднимает ValueError.set_day(day)
: Принимает str или int. Извлекает день из полученной переменной и устанавливает полеday
вызванного экземпляра Datify. Если полученный параметр не соответствует формату Day Format, поднимает ValueError.
Обратите внимание, что в этом модуле день проверяется первым, а месяц - после него.
06.07.2021
будет распознано как6 июля 2021 года
!
- Формат General Date:
'[12][01]\d\d[01]\d[0123]\d$'
-ГГГГММДД
- напр.20210706
- 6 июля 2021 - Форматы дня:
0 < день <= 31
- Для случаев, когда строка содержит только цифры:
'[0123]?\d$'
-Д?Д
- напр.13
,05
,6
и т.д. - Для случаев, когда день задан буквенно-цифровой строкой:
'[0123]?\d\D+$'
- напр.1st
,2nd
,25th
,3-е
и т.д.
- Для случаев, когда строка содержит только цифры:
- Форматы месяца:
0 < месяц <= 12
- Для случаев, когда строка содержит только цифры:
'[01]?\d$'
-M?M
- напр.06
,7
и т.д. - Для случаев, когда день задан буквенно-цифровой строкой: сравнивает строку со словарём и пытается найти похожее название месяца.
- Для случаев, когда строка содержит только цифры:
- Формат Year Format:
'([012]\d\d\d$)|(\d\d$)'
-ГГГГ
orГГ
- напр.2021
или21
.Обратите внимание, что если год задан в виде
ГГ
, это считается как20ГГ
.
После импорта модуля есть возможность настроить список разделителей и изменить все стандартные форматы, обращаясь к ним через Datify.config['KEY']
.
№. Имя : КЛЮЧ -- описание
- Разделители :
'SPLITTERS'
-- множество разделителей дляDatify._getWordsList
. Содержит.
,-
и/
по умолчанию. - Форматы (См. секцию Форматы) :
- Digit Day :
'FORMAT_DAY_DIGIT'
- Alpha-numeric Day :
'FORMAT_DAY_ALNUM'
- Digit Month :
'FORMAT_MONTH_DIGIT'
- Digit Year :
'FORMAT_YEAR_DIGIT'
- General Date :
'FORMAT_DATE'
- День проверяется первым? :
'DAY_FIRST'
-- bool. Если True, то первым проверяется день. Если False, то первым проверяется месяц. По умолчанию True.
Например:
Datify('17_06_2021') # ValueError
Datify.config['SPLITTERS'].add('_') # Добавляем нужный разделитель в конфиг
Datify('17_06_2021') # <Datify object (17, 6, 2021)>
Изменение порядка проверки дня и месяца:
Datify('10.12').month # 12
Datify.config['DAY_FIRST'] = False
Datify('10.12').month # 10
Я буду каждый раз использовать разные форматы даты, чтобы показать, что Datify может работать с каждым из них. Начнём!
from datify import Datify # Импортируем главный класс. Все последуюющие действия будут с ним.
- Извлечение даты из строки с помощью Datify
user_input = '06.07.2021' # Имитируем пользовательский ввод. День идет первым!
Datify(user_input) # <Datify object (6, 7, 2021)>
Таким образом можно обработать любую строку.
- Получение отдельных частей даты из Datify
user_input = '06/07'
val = Datify(user_input)
date_day = val.day # 6
date_month = val.month # 7
date_year = val.year # None
- Получение даты в экземпляре datetime
user_input = '06-07-21'
date = Datify(user_input).date() # 2021-07-06 00:00:00
Если дата не будет получена полностью (год, месяц и день), datetime поднимет TypeError:
user_input = '06/07'
date = Datify(user_input).date() # TypeError: an integer is required (got type NoneType)
Лучше использовать другие способы, если есть шанс получить неполную дату.
- Получение кортежа из всех значений: Порядок значений: день, месяц, год
user_input = '6th of July 2021'
Datify(user_input).tuple() # (6, 7, 2021)
user_input = '6th of July'
Datify(user_input).tuple() # (6, 7, None)
- Получение номера месяца из его названия без создания экземпляра Datify
Datify.get_alpha_month('february') # 2
- Разнообразные проверки для строк
# Любая часть даты
Datify.is_date_part('6') # True (может быть днём или месяцем)
Datify.is_date_part('31') # True
Datify.is_date_part('june') # True
Datify.is_date_part('jan') # True
Datify.is_date_part('33') # True (может быть годом в виде `ГГ`)
Datify.is_date_part('333') # False
Datify.is_date_part('3131') # False (не соответствует формату года (от `1000` до `2199`))
# Дата в формате General Date
Datify.is_date('20210607') # True
# Определённые части даты
# Год
Datify.is_year('2021') # True
Datify.is_year('221') # False
# Месяц
Datify.is_digit_month('11') # True (0 < str <= 12)
Datify.is_alpha_month('June') # True
# День
Datify.is_day('13') # True (0 < str <= 31)
- Поиск даты в формате General Date в любой строке
user_input = 'created "20200120"'
Datify.find_date(user_input) # '20200120'
- Изменение параметров существующего экземпляра Datify
date = Datify('6th of July, 2021') # <Datify object (6, 7, 2021)>
date.set_year(2018)
print(date.date()) # 2018-07-06 00:00:00
Также можно вручную переопределить параметры обьекта Datify при его создании:
Datify('6th of July, 2021', year=2018, month=3) # <Datify object (6, 3, 2018)>