Вступление
В этом руководстве мы рассмотрим, как анализировать 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
библиотеки.