Вступление
В этом руководстве мы рассмотрим, как анализировать Datetime с помощью
parsedatetime в Python .
Чтобы использовать parsedatetime , нам сначала нужно установить его с
помощью pip:
$ pip install parsedatetime
Если pip install parsedatetime завершится неудачно, пакет также будет
с открытым исходным кодом и доступен на
Github .
Преобразование строки в Datetime объект в Python с parsedatetime
Первый и наиболее распространенный способ использования parsedatetime
-
преобразовать строку в объект
datetimeВо-первых, вам нужно импортироватьparsedatetimeи создать экземплярCalendar, который выполняет фактический ввод, синтаксический анализ и управление датами:import parsedatetime calendar = parsedatetime.Calendar()
Теперь мы можем вызвать метод parse() calendar со строкой в качестве
аргумента. Вы можете использовать обычные строки в формате datetime,
такие как 1-1-2021 или удобочитаемые значения, такие как tomorrow ,
yesterday , в next year , на last week , lunch tomorrow и т. Д.
Мы также можем использовать 'End of Day' структуры с tomorrow eod
Давайте преобразуем datetime и удобочитаемую строку в datetime с
помощью parsedatetime :
import parsedatetime
from datetime import datetime
calendar = parsedatetime.Calendar()
print(calendar.parse('tomorrow'))
print(calendar.parse('1-1-2021'))
В результате получается два напечатанных кортежа:
(time.struct_time(tm_year=2021, tm_mon=3, tm_mday=19, tm_hour=9, tm_min=0, tm_sec=0, tm_wday=4, tm_yday=78, tm_isdst=-1), 1)
(time.struct_time(tm_year=2021, tm_mon=1, tm_mday=1, tm_hour=18, tm_min=5, tm_sec=14, tm_wday=3, tm_yday=77, tm_isdst=0), 1)
struct_time для чтения человеком ... Возвращаемый кортеж для каждого
преобразования состоит из объекта struct_time, который содержит такую
информацию, как год, месяц, день месяца и т. Д. Второе значение - это
код состояния - целое число, обозначающее, как конверсия пошла.
0 означает неудачный синтаксический анализ, 1 означает успешный
синтаксический анализ до date , 2 означает успешный синтаксический
анализ до time и 3 означает успешный синтаксический анализ до
datetime .
Давайте проанализируем этот вывод:
print(calendar.parse('tomorrow')[0].tm_mday)
print(calendar.parse('1-1-2021')[0].tm_mday)
Этот код приводит к:
19
1
Опять же, здесь мы получаем только день месяца. Обычно мы хотим
вывести что-то похожее на YYYY-mm-dd HH:mm:ss или любой его вариант.
К счастью, мы можем легко использовать time.struct_time результат и
генерировать регулярный Python datetime с ним:
import parsedatetime
from datetime import datetime
calendar = parsedatetime.Calendar()
time_structure_tomorrow, parse_status_tomorrow = calendar.parse('tomorrow')
time_structure_2021, parse_status_2021 = calendar.parse('1-1-2021')
print(datetime(*time_structure_tomorrow[:6]))
print(datetime(*time_structure_2021[:6]))
Конструктору datetime() не нужна вся информация из временной
структуры, предоставляемой parsedatetime , поэтому мы ее разрезали.
Этот код приводит к:
2021-03-19 09:00:00
2021-01-01 18:11:06
Имейте в виду, что datetime 1 января учитывала время исполнения.
Обработка часовых поясов
Иногда вашему приложению может потребоваться учитывать часовые пояса ваших конечных пользователей. Для поддержки часового пояса мы обычно используем пакет Pytz , хотя вы можете использовать и другие пакеты.
Давайте установим Pytz через pip :
$ pip install pytz
Теперь мы можем импортировать parsedatetime и pytz пакетов в
сценарий, и создать стандартный Calendar экземпляр:
import parsedatetime
import pytz
from pytz import timezone
calendar = parsedatetime.Calendar()
Давайте посмотрим на поддерживаемые часовые пояса, распечатав
all_timezones :
print(pytz.all_timezones)
Этот код приведет к огромному списку всех доступных часовых поясов:
['Africa/Abidjan', 'Africa/Accra', 'Africa/Addis_Ababa', 'Africa/Algiers', ...]
Давайте выберем один из них, например, первый, и передадим его в
качестве аргумента tzinfo Calendar parseDT() . Помимо этого, мы
хотим предоставить datetimeString , который представляет собой
фактическую строку, которую мы хотим проанализировать:
datetime_object, status = calendar.parseDT(datetimeString='tomorrow', tzinfo=timezone('Africa/Abidjan'))
Этот метод возвращает кортеж Datetime и код состояния преобразования,
который является целым числом - 1 означает «успешно», а 0 означает
«неудачно».
Давайте продолжим и напечатаем datetime_object :
print(datetime_object)
Этот код приводит к:
2021-03-16 09:00:00+00:00
Calendar.parseDate ()
В то время как Calendar.parse() является методом синтаксического
анализа общего уровня, который возвращает кортеж с кодом состояния и
time.struct_time , метод parseDate() является методом,
предназначенным для коротких строковых дат и просто возвращает
удобочитаемый результат:
import parsedatetime
calendar = parsedatetime.Calendar()
result = calendar.parseDate('5/5/91')
print(result)
result теперь содержит вычисленное struct_time для даты, которую мы
передали:
(1991, 5, 5, 14, 31, 18, 0, 74, 0)
Но что нам делать, если мы хотим разобрать 5 мая 2077 года? Мы можем попробовать запустить следующий код:
import parsedatetime
calendar = parsedatetime.Calendar()
result = calendar.parseDate('5/5/77')
print(result)
Однако этот код приведет к:
(1977, 5, 5, 14, 36, 21, 0, 74, 0)
Calendar.parseDate() ошибочно принял короткую дату за более
реалистичный 1977 . Мы можем решить эту проблему двумя способами:
- Просто укажите полный год -
2077:
|
|
import parsedatetime
calendar = parsedatetime.Calendar()
result = calendar.parseDate('5/5/2077')
print(result)
- Используйте
BirthdayEpoch:
|
|
import parsedatetime
constants = parsedatetime.Constants()
constants.BirthdayEpoch = 80
# Pass our new constants to the Calendar
calendar = parsedatetime.Calendar(constants)
result = calendar.parseDate('5/5/77')
print(result)
Этот код приведет к:
(2077, 5, 5, 14, 39, 47, 0, 74, 0)
Вы можете получить доступ к содержимому библиотеки parsedatetime через
объект Constants Здесь мы установили для BirthdayEpoch значение 80
.
BirthdayEpoch управляет тем, как пакет обрабатывает двузначные числа
года, например 77 . Если проанализированное значение меньше значения,
которое мы установили для BirthdayEpoch оно добавит проанализированное
значение к 2000 . Поскольку мы установили для BirthdayEpoch значение
80 и проанализировали 77 , он преобразует его в 2077 .
В противном случае он добавит проанализированное значение к 1900 .
Calendar.parseDateText ()
Другой альтернативой решению проблемы ошибочных сокращенных дат является
использование длинных дат. Для длинных дат вы можете использовать метод
parseDateText() :
import parsedatetime
result2 = calendar.parseDateText('May 5th, 1991')
print(result2)
Этот код приведет к:
(1991, 5, 5, 14, 31, 46, 0, 74, 0)
Использование локалей
Наконец, мы можем использовать parsedatetime с информацией о локали
. Информация о локали поступает либо из
PyICU, либо из ранее
использовавшегося класса Constants
Constants имеет множество атрибутов, как и атрибут BirthdayEpoch Два
из них - localeID и userPyICU .
Давайте попробуем установить localeId на испанский и установить для
usePyICU значение False поскольку мы не будем его использовать:
import parsedatetime
constants = parsedatetime.Constants(localeID='es', usePyICU=False)
calendar = parsedatetime.Calendar(constants)
result, code = calendar.parse('Marzo 28')
print(result)
Это приводит к:
(time.struct_time(tm_year=2021, tm_mon=3, tm_mday=28, tm_hour=15, tm_min=0, tm_sec=5, tm_wday=0, tm_yday=74, tm_isdst=0), 1)
Метод возвращает struct_time , поэтому мы можем легко преобразовать
его в datetime :
print(datetime(*result[:6]))
Это приводит к:
2021-03-28 22:08:40
Заключение
В этом руководстве мы рассмотрели несколько способов синтаксического
анализа datetime с parsedatetime пакета parsedatetime в Python.
Мы перешли преобразование между строками и datetime и parsedatetime
pytz Constants parsedatetime datetime объектов с помощью
parsedatetime , а также обработки часовых поясов с pytz и локали,
используя Constants экземпляр parsedatetime библиотеки.