Разбор строк даты и времени с помощью parsedatetime в Python

Введение В этом руководстве мы рассмотрим, как анализировать Datetime с помощью parsedatetime в Python. Чтобы использовать пакет parsedatetime, нам сначала нужно установить его с помощью pip: $ pip install parsedatetime В случае сбоя pip install parsedatetime пакет также является открытым исходным кодом и доступен на Github [https://github.com/bear/parsedatetime]. Преобразование строки в объект Datetime Python с помощью parsedatetime Первый и наиболее распространенный способ использования parsedatetime - преобразовать строку в datetim

Вступление

В этом руководстве мы рассмотрим, как анализировать 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 :
1
<!-- -->
 import parsedatetime 
 calendar = parsedatetime.Calendar() 
 result = calendar.parseDate('5/5/2077') 
 print(result) 
  • Используйте BirthdayEpoch :
1
<!-- -->
 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 библиотеки.

comments powered by Disqus