Перейти к содержимому

Как datetime перевести в строку

  • автор:

Синтаксический анализ строк даты и времени в .NET

Чтобы анализировать строки для преобразования их в объекты DateTime, нужно указать, как значения даты и времени представлены в текстовом формате. Для различных языков и региональных параметров значения дня, месяца и года приводятся в разном порядке. В некоторых представлениях времени используются 24-часовые часы, в других — «AM» и «PM». Некоторым приложениям требуется только дата. В других — только время. Остальные должны указывать как дату, так и время. Методы преобразования строк в объекты DateTime позволяют предоставлять подробные сведения о требуемых форматах и элементах дат и времени, которые необходимы для вашего приложения. Есть три подзадачи для правильного преобразования текста в DateTime:

  1. Укажите требуемый формат текста, представляющего дату и время.
  2. Вы можете указать язык и региональные параметры для формата даты и времени.
  3. Вы можете указать, как отсутствующие компоненты в текстовом представлении задаются в дату и время.

Методы Parse и TryParse позволяют преобразовать много стандартных представлений даты и времени. Методы ParseExactи TryParseExact позволяют преобразовать строковое представление, соответствующее шаблону, указанному в строке формата даты и времени. Дополнительные сведения см. в статьях о стандартных строках формата даты и времени и настраиваемых строках формата даты и времени.

Текущий объект DateTimeFormatInfo обеспечивает более точный контроль над тем, как текст должен интерпретироваться в качестве даты и времени. DateTimeFormatInfo Свойства объекта описывают разделители даты и времени, имена месяцев, дней и эпох, а также формат для обозначений «AM» и «PM». Объект , CultureInfo возвращаемый параметром CultureInfo.CurrentCulture , имеет CultureInfo.DateTimeFormat свойство , представляющее текущий язык и региональные параметры. Если требуется задать определенные язык и региональные параметры или настраиваемые параметры, укажите для метода анализа параметр IFormatProvider. Для параметра IFormatProvider следует указать объект CultureInfo, представляющий язык и региональные параметры, или объект DateTimeFormatInfo.

Текст, представляющий дату или время, может отсутствовать некоторые сведения. Например, большинство пользователей будет считать, что дата «12 марта» относится к текущему году. Аналогичным образом, «март 2018 г.» представляет месяц март 2018 года. Текст, представляющий время, часто содержит только часы, минуты и обозначение AM/PM. При помощи методов анализа эти отсутствующие данные обрабатываются с использованием обоснованных значений по умолчанию:

  • если указано только время, в части даты используется текущая дата;
  • если указана только дата, в части времени задается полночь;
  • если в дате не указан год, используется текущий год;
  • Если день месяца не указан, используется первый день месяца.

Если в строке есть дата, она должна включать месяц и день или год. Если указано время, значение должно содержать час и минуты или обозначение AM либо PM.

Чтобы переопределить эти значения по умолчанию, можно задать константу NoCurrentDateDefault. Если вы используете эту константу, для всех отсутствующих параметров года, месяца или дня устанавливается значение 1 . Это демонстрирует последний пример, в котором применяется Parse.

Помимо компонента даты и времени строковое представление даты и времени может содержать смещение, которое указывает, насколько время отличается от универсального синхронизированного времени (UTC). Например, строка «14/02/2007 5:32:00 -7: 00» определяет время, которое на семь часов меньше, чем UTC. Если в строковом представлении времени не задано смещение, то синтаксический анализ возвращает объект DateTime, свойство Kind которого имеет значение DateTimeKind.Unspecified. Если указано смещение, при синтаксическом анализе возвращается объект со свойством DateTimeKind , равным DateTimeKind.Local. Его значение также корректируется в соответствии с местным часовой поясом компьютера. Это поведение можно изменить, указав для метода анализа значение DateTimeStyles.

Поставщик формата также используется для интерпретации неоднозначных числовых дат. Неясно, какие компоненты даты, представленные строкой «02/03/04», являются месяцем, днем и годом. Такие компоненты интерпретируются согласно их порядку расположения в схожих форматах даты в поставщике формата.

Parse

Ниже приведен пример использования метода DateTime.Parse для преобразования string в DateTime. В этом примере используются язык и региональные параметры, связанные с текущим потоком. Если объект , связанный CultureInfo с текущим языком FormatException и региональными параметрами, не может проанализировать входную строку, создается исключение .

Все примеры C# в этой статье выполняются в браузере. Нажмите кнопку Выполнить, чтобы просмотреть выходные данные. Вы можете поэкспериментировать, изменяя их значения.

Эти примеры для C# и Visual Basic см. в репозитории с документацией GitHub.

string dateInput = "Jan 1, 2009"; var parsedDate = DateTime.Parse(dateInput); Console.WriteLine(parsedDate); // Displays the following output on a system whose culture is en-US: // 1/1/2009 00:00:00 
Dim MyString As String = "Jan 1, 2009" Dim MyDateTime As DateTime = DateTime.Parse(MyString) Console.WriteLine(MyDateTime) ' Displays the following output on a system whose culture is en-US: ' 1/1/2009 00:00:00 

Кроме того, вы можете явно определить язык и региональные параметры, соглашения о форматировании для которых используются при анализе строки. Укажите один из стандартных объектов DateTimeFormatInfo, возвращенных свойством CultureInfo.DateTimeFormat. В приведенном ниже примере поставщик формата используется для анализа строки на немецком языке в DateTime. Для представления языка и региональных параметров de-DE создается CultureInfo. Этот объект CultureInfo обеспечивает успешный анализ определенной строки. Этот процесс исключает любой параметр в .CurrentCultureCurrentThread

var cultureInfo = new CultureInfo("de-DE"); string dateString = "12 Juni 2008"; var dateTime = DateTime.Parse(dateString, cultureInfo); Console.WriteLine(dateTime); // The example displays the following output: // 6/12/2008 00:00:00 
Dim MyCultureInfo As New CultureInfo("de-DE") Dim MyString As String = "12 Juni 2008" Dim MyDateTime As DateTime = DateTime.Parse(MyString, MyCultureInfo) Console.WriteLine(MyDateTime) ' The example displays the following output: ' 6/12/2008 00:00:00 

Однако можно использовать перегрузки метода для Parse указания настраиваемых поставщиков форматов. Метод Parse не поддерживает синтаксический анализ нестандартных форматов. Вместо этого используйте метод ParseExact для анализа даты и времени, выраженных в нестандартном формате.

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

var cultureInfo = new CultureInfo("de-DE"); string dateString = "12 Juni 2008"; var dateTime = DateTime.Parse(dateString, cultureInfo, DateTimeStyles.NoCurrentDateDefault); Console.WriteLine(dateTime); // The example displays the following output if the current culture is en-US: // 6/12/2008 00:00:00 
Dim MyCultureInfo As New CultureInfo("de-DE") Dim MyString As String = "12 Juni 2008" Dim MyDateTime As DateTime = DateTime.Parse(MyString, MyCultureInfo, DateTimeStyles.NoCurrentDateDefault) Console.WriteLine(MyDateTime) ' The example displays the following output if the current culture is en-US: ' 6/12/2008 00:00:00 

ParseExact

Метод DateTime.ParseExact позволяет преобразовать строку в объект DateTime, если она соответствует одному из указанных шаблонов строк. При передаче в этот метод строки, которая не является одной из указанных форм, FormatException возникает исключение . Можно задать один из стандартных описателей формата даты и времени или сочетание пользовательских описателей формата. Используя настраиваемые описатели формата, можно создать пользовательскую строку распознавания. Описание описателей см. в статьях о стандартных строках формата даты и времени и настраиваемых строках формата даты и времени.

В приведенном ниже примере в метод DateTime.ParseExact передается переназначенный для анализа строковый объект. Затем следует описатель формата, который сопровождается объектом CultureInfo. С помощью этого метода ParseExact можно анализировать только строки, соответствующие шаблону полной даты для языка и региональных параметров en-US .

var cultureInfo = new CultureInfo("en-US"); string[] dateStrings = < " Friday, April 10, 2009", "Friday, April 10, 2009" >; foreach (string dateString in dateStrings) < try < var dateTime = DateTime.ParseExact(dateString, "D", cultureInfo); Console.WriteLine(dateTime); >catch (FormatException) < Console.WriteLine("Unable to parse ''", dateString); > > // The example displays the following output: // Unable to parse ' Friday, April 10, 2009' // 4/10/2009 00:00:00 
Dim MyCultureInfo As New CultureInfo("en-US") Dim MyString() As String = For Each dateString As String In MyString Try Dim MyDateTime As DateTime = DateTime.ParseExact(dateString, "D", MyCultureInfo) Console.WriteLine(MyDateTime) Catch e As FormatException Console.WriteLine("Unable to parse ''", dateString) End Try Next ' The example displays the following output: ' Unable to parse ' Friday, April 10, 2009' ' 4/10/2009 00:00:00 

При каждой перегрузке методов Parse и ParseExact также используется параметр IFormatProvider, который предоставляет сведения о языке и региональных параметрах для форматирования строки. Объект IFormatProvider — это CultureInfo объект, представляющий стандартный язык и региональные параметры, или DateTimeFormatInfo объект, возвращаемый свойством CultureInfo.DateTimeFormat . Кроме того, в методе ParseExact используется дополнительная строка или аргумент массива строк для определения одного или нескольких настраиваемых форматов даты и времени.

См. также

  • Анализ строк
  • Типы форматирования
  • Преобразование типов в .NET
  • Стандартные форматы даты и времени
  • Строки настраиваемых форматов даты и времени

Совместная работа с нами на GitHub

Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.

Как преобразовать строку в дату? 20180819 -> 2018-08-19

Направьте на правильный путь, а то я совсем запутался. Есть строка text = «20180819» , а на выходе хочу получить 2018-08-19 Чтобы потом создать иерархию папок с такими названиями: 2018/2018-08/2018-08-19 Использую библиотеку datetime, но у меня получается.

Отслеживать
76.9k 6 6 золотых знаков 56 56 серебряных знаков 123 123 бронзовых знака
задан 17 сен 2018 в 16:04
23 1 1 золотой знак 1 1 серебряный знак 3 3 бронзовых знака

2 ответа 2

Сортировка: Сброс на вариант по умолчанию

В общих случаях работы с датой, получение из строки и обратно, делается так:

import time dt = time.strptime('20180819', '%Y%m%d') print(time.strftime('%Y-%m-%d', dt)) # -> '2018-08-19' 

создать папки можно так:

from pathlib import Path path_str = time.strftime('%Y/%Y-%m/%Y-%m-%d', dt) Path(path_str).mkdir(parents=True, exist_ok=True) 

однако в данном конкретном случае, можно обойтись срезами

s = '20180819' year = s[:4] month = s[4:6] day = s[6:] print(f'/-/--') 

Отслеживать
ответ дан 17 сен 2018 в 16:26
1,438 6 6 серебряных знаков 16 16 бронзовых знаков

import datetime as DT text = "20180819" date = DT.datetime.strptime(text, '%Y%m%d').date() print(date) # 2018-08-19 print(str(date)) # 2018-08-19 print(date.strftime('%Y-%m-%d')) # 2018-08-19 

Чтобы сгенерировать путь, можно так извернуться:

import os dirs_path = '/'.join(date.strftime(fmt) for fmt in ['%Y', '%Y-%m', '%Y-%m-%d']) print(dirs_path) # 2018/2018-08/2018-08-19 # Генерация пути используя системные разделители dirs_path = os.path.sep.join(date.strftime(fmt) for fmt in ['%Y', '%Y-%m', '%Y-%m-%d']) print(dirs_path) # 2018\2018-08\2018-08-19 

Чтобы создать папки:

# Создаем если такого пути нет if not os.path.exists(dirs_path): os.makedirs(dirs_path) 

Как преобразовать DateTime в строку в Pandas (с примерами)

Вы можете использовать следующий базовый синтаксис для преобразования столбца из DateTime в строку в pandas:

df['column_name']. dt.strftime('%Y-%m-%d') 

В следующем примере показано, как использовать этот синтаксис на практике.

Пример: преобразование DateTime в строку в Pandas

Предположим, у нас есть следующий кадр данных pandas, который показывает продажи в каком-то магазине за четыре разных дня:

import pandas as pd #create DataFrame df = pd.DataFrame() #view DataFrame df day sales 0 2021-01-01 1440 1 2021-01-05 1845 2 2021-01-06 2484 3 2021-01-09 2290 

Мы можем использовать функцию dtypes для просмотра типа данных каждого столбца в DataFrame:

#view data type of each column df.dtypes day datetime64[ns] sales int64 dtype: object 

Мы видим, что столбец «день» имеет класс DateTime .

Чтобы преобразовать «день» в строку, мы можем использовать следующий синтаксис:

#convert 'day' column to string df['day'] = df['day']. dt.strftime('%Y-%m-%d') #view updated DataFrame df day sales 0 2021-01-01 1440 1 2021-01-05 1845 2 2021-01-06 2484 3 2021-01-09 2290 

Мы можем снова использовать функцию dtypes , чтобы убедиться, что столбец «день» теперь является строкой:

#view data type of each column df.dtypes day object sales int64 dtype: object 

Примечание.Полную документацию по функции dt.strftime() можно найти здесь .

Дополнительные ресурсы

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

Преобразование строк в дату со временем

Модуль datetime содержит в себе три объекта: date , time и datetime . Очевидно, что объект date хранит в себе дату, time — время, а datetime — дату и время.

Например, этот код выведет в консоль текущую дату и время:

import datetime print ('Текущая дата и время: <>'.format(datetime.datetime.now()))

После запуска этого кода в консоль выводится следующее:

datetime-print-1.py Текущая дата и время: 2018-06-29 08:15:27.243860

Без заданного форматирования используется формат строки по умолчанию — «2018-06-29 08:15:27.243860». Это стандарт ISO 8601 (YYYY-MM-DDTHH:MM:SS.mmmmmm). Если мы вводим строку в формате ISO 8601, то мы можем легко задать ее в качестве значения объекту datetime .

Взгляните на пример:

import datetime date_time_str = '2018-06-29 08:15:27.243860' date_time_obj = datetime.datetime.strptime(date_time_str, '%Y-%m-%d %H:%M:%S.%f') print('Дата:', date_time_obj.date()) print('Время:', date_time_obj.time()) print('Дата и время:', date_time_obj)

После запуска кода в консоль выводится дата, время и дата со временем:

datetime-print-2.py Дата: 2018-06-29 Время: 08:15:27.243860 Дата и время: 2018-06-29 08:15:27.243860

В этом примере мы используем метод strptime . Он принимает два аргумента: строковое представление строки и ее формат. Указание формата строки значительно ускоряет обработку данных: мы освобождаем метод datetime от самостоятельного анализа формата строки. Это довольно дорогая вычислительная операция. Тип возвращаемого значения — datetime .

В нашем примере «2018-06-29 08:15:27.243860» — строка, а «%Y-%m-%d %H:%M:%S.%f» — ее формат. Возвращаемое значение datetime хранится в переменной date_time_obj . Так как datetime является объектом, мы можем вызывать методы date() и time() напрямую. Как видите, в консоль программа выводит дату и время прямо из введенной строки.

Возможно, вам интересно, что значит формат «%Y-%m-%d %H:%M:%S.%f» . Символы внутри — это токены. Каждый токен представляет собой часть даты и времени: день, месяц, год и т. д. Ознакомьтесь с документацией, если хотите узнать о видах форматирования, поддерживаемых Python. Краткая справка:

%Y : Год (4 цифры)
%m : Месяц
%d : День месяца
%H : Часы (24-часовой формат)
%M : Минуты
%S : Секунды
%f : Миллисекунды

Метод ожидает, что все токены будут дополнены нулями.

Итак, если известен формат строки, ее можно легко преобразовать в объект datetime с помощью strptime . Рассмотрим нетривиальный пример:

import datetime date_time_str = 'Jun 28 2018 7:40AM' date_time_obj = datetime.datetime.strptime(date_time_str, '%b %d %Y %I:%M%p') print('Дата:', date_time_obj.date()) print('Время:', date_time_obj.time()) print('Дата и время:', date_time_obj)

Как видите, эта строка была обработана без проблем. Вывод следующий:

datetime-print-3.py Date: 2018-06-28 Time: 07:40:00 Date-time: 2018-06-28 07:40:00

Еще несколько примеров часто используемых форматов и токенов для парса:

"Jun 28 2018 at 7:40AM" -> "%b %d %Y at %I:%M%p" "September 18, 2017, 22:19:55" -> "%B %d, %Y, %H:%M:%S" "Sun,05/12/99,12:30PM" -> "%a,%d/%m/%y,%I:%M%p" "Mon, 21 March, 2015" -> "%a, %d %B, %Y" "2018-03-12T10:12:45Z" -> "%Y-%m-%dT%H:%M:%SZ"
import datetime date_time_str = '2018-06-29 08:15:27.243860' date_time_obj = datetime.datetime.strptime(date_time_str, '%Y-%m-%d %H:%M:%S.%f') print('Дата:', date_time_obj.date()) print('Время:', date_time_obj.time()) print('Дата и время:', date_time_obj)

Вы можете парсить строку любого формата, в этом вам поможет документация strptime , о которой мы говорили выше.

Работаем с часовыми поясами

Работу со временем и датой могут усложнить часовые пояса. Все примеры, которые мы обсуждали, — довольно примитивные объекты datetime . То есть, они не содержат данные о часовом поясе. Но у объекта datetime есть переменная, хранящая информацию о часовом поясе, — tzinfo .

import datetime as dt dtime = dt.datetime.now() print(dtime) print(dtime.tzinfo)
datetime-tzinfo-1.py 2018-06-29 22:16:36.132767 None

Вывод tzinfo None — это примитивный datetime -объект. Для конвертирования часовых поясов в Python есть библиотека pytz . Как ее установить, описано здесь. Мы не будем подробно останавливаться на установке, а просто покажем, как использовать pytz для конвертирования времени в UTC.

import datetime as dt import pytz dtime = dt.datetime.now(pytz.utc) print(dtime) print(dtime.tzinfo)
datetime-tzinfo-2.py 2018-06-29 17:08:00.586525+00:00 UTC

+00:00 — разница между выводимым в консоль временем и UTC. В этом примере значение tzinfo — UTC, поэтому смещение 00:00 . В данном случае объект datetime учитывает часовой пояс.

Точно так же мы можем преобразовать строки с датой и временем в любой другой часовой пояс. Например, мы можем преобразовать строку «2018-06-29 17:08:00.586525+00:00» в часовой пояс «Америка/Нью-Йорк»:

import datetime as dt import pytz date_time_str = '2018-06-29 17:08:00' date_time_obj = dt.datetime.strptime(date_time_str, '%Y-%m-%d %H:%M:%S') timezone = pytz.timezone('America/New_York') timezone_date_time_obj = timezone.localize(date_time_obj) print(timezone_date_time_obj) print(timezone_date_time_obj.tzinfo)
datetime-tzinfo-3.py 2018-06-29 17:08:00-04:00 America/New_York

В начале программы мы конвертировали строку в datetime -объект, date_time_obj . Затем мы конвертировали его в datetime -объект с часовым поясом — timezone_date_time_obj . Поскольку мы поставили часовой пояс «Америка/Нью-Йорк», в выводе отобразится время, отстающее от UTC на 4 часа. Подробнее познакомиться с часовыми поясами можно здесь.

Изменение часовых поясов

Мы можем изменять часовые пояса datetime -объектов. Делается это следующим образом:

import datetime as dt import pytz timezone_nw = pytz.timezone('America/New_York') nw_datetime_obj = dt.datetime.now(timezone_nw) timezone_london = pytz.timezone('Europe/London') london_datetime_obj = nw_datetime_obj.astimezone(timezone_london) print('Америка/Нью-Йорк:', nw_datetime_obj) print('Европа/Лондон:', london_datetime_obj)

В начале программы мы создали datetime -объект и установили часовой пояс «Америка/Нью-Йорк». После этого мы использовали метод astimezone() , чтобы поменять часовой пояс на «Европа/Лондон». Вывод этих двух объектов в консоли:

datetime-tzinfo-4.py Америка/Нью-Йорк: 2018-06-29 22:21:41.349491-04:00 Европа/Лондон: 2018-06-30 03:21:41.349491+01:00

Как и ожидалось, время отличается: между часовыми поясами разница в пять часов.

Использование сторонних библиотек

Модуль datetime может конвертировать любые строки в datetime -объекты. Но есть проблема: для этого необходимо написать подходящее форматирование, которое strptime сможет понять. На это уходит время, код становится сложнее читать. Для упрощения этого процесса можно использовать сторонние библиотеки.

Бывает, что сторонние библиотеки имеют более удобные методы манипуляции и сравнения дат и времени. В некоторых даже встроены часовые пояса — вам не придется импортировать лишние библиотеки.

Познакомимся с некоторыми из них.

dateutil

Модуль dateutil — расширение модуля datetime . Главное преимущество — не нужно писать код для парса строки. Пример:

from dateutil.parser import parse datetime = parse('2018-06-29 22:21:41') print(datetime)

Функция parse автоматически парсит строку и сохранит ее в переменной datetime . Парсинг происходит автоматически. То есть, отпадает нужда в форматировании. Попробуем спарсить разные типы строк с помощью dateutil :

from dateutil.parser import parse date_array = [ '2018-06-29 08:15:27.243860', 'Jun 28 2018 7:40AM', 'Jun 28 2018 at 7:40AM', 'September 18, 2017, 22:19:55', 'Sun, 05/12/1999, 12:30PM', 'Mon, 21 March, 2015', '2018-03-12T10:12:45Z', '2018-06-29 17:08:00.586525+00:00', '2018-06-29 17:08:00.586525+05:00', 'Tuesday , 6th September, 2017 at 4:30pm' ] for date in date_array: print('Parsing: ' + date) dt = parse(date) print(dt.date()) print(dt.time()) print(dt.tzinfo) print('\n')
dateutil-1.py Parsing: 2018-06-29 08:15:27.243860 2018-06-29 08:15:27.243860 None Parsing: Jun 28 2018 7:40AM 2018-06-28 07:40:00 None Parsing: Jun 28 2018 at 7:40AM 2018-06-28 07:40:00 None Parsing: September 18, 2017, 22:19:55 2017-09-18 22:19:55 None Parsing: Sun, 05/12/1999, 12:30PM 1999-05-12 12:30:00 None Parsing: Mon, 21 March, 2015 2015-03-21 00:00:00 None Parsing: 2018-03-12T10:12:45Z 2018-03-12 10:12:45 tzutc() Parsing: 2018-06-29 17:08:00.586525+00:00 2018-06-29 17:08:00.586525 tzutc() Parsing: 2018-06-29 17:08:00.586525+05:00 2018-06-29 17:08:00.586525 tzoffset(None, 18000) Parsing: Tuesday , 6th September, 2017 at 4:30pm 2017-09-06 16:30:00 None

Как видите, с помощью модуля dateutil легко парсится практически любая строка.

Хоть это и удобно, но помните — прогнозирование формата замедляет выполнение кода. Если это критично — этот модуль не для вас.

Maya

Maya также может упростить парсинг строк и смену часовых поясов. Простые примеры:

import maya dt = maya.parse('2018-04-29T17:45:25Z').datetime() print(dt.date()) print(dt.time()) print(dt.tzinfo)
maya-1.py 2018-04-29 17:45:25 UTC

Изменение часового пояса:

import maya dt = maya.parse('2018-04-29T17:45:25Z').datetime(to_timezone='America/New_York', naive=False) print(dt.date()) print(dt.time()) print(dt.tzinfo)
maya-2.py 2018-04-29 13:45:25 America/New_York

Просто, не так ли? Опробуем maya с тем же списком строк, который был в случае с dateutil :

import maya date_array = [ '2018-06-29 08:15:27.243860', 'Jun 28 2018 7:40AM', 'Jun 28 2018 at 7:40AM', 'September 18, 2017, 22:19:55', 'Sun, 05/12/1999, 12:30PM', 'Mon, 21 March, 2015', '2018-03-12T10:12:45Z', '2018-06-29 17:08:00.586525+00:00', '2018-06-29 17:08:00.586525+05:00', 'Tuesday , 6th September, 2017 at 4:30pm' ] for date in date_array: print('Parsing: ' + date) dt = maya.parse(date).datetime() print(dt) print(dt.date()) print(dt.time()) print(dt.tzinfo)
maya-3.py Parsing: 2018-06-29 08:15:27.243860 2018-06-29 08:15:27.243860+00:00 2018-06-29 08:15:27.243860 UTC Parsing: Jun 28 2018 7:40AM 2018-06-28 07:40:00+00:00 2018-06-28 07:40:00 UTC Parsing: Jun 28 2018 at 7:40AM 2018-06-28 07:40:00+00:00 2018-06-28 07:40:00 UTC Parsing: September 18, 2017, 22:19:55 2017-09-18 22:19:55+00:00 2017-09-18 22:19:55 UTC Parsing: Sun, 05/12/1999, 12:30PM 1999-05-12 12:30:00+00:00 1999-05-12 12:30:00 UTC Parsing: Mon, 21 March, 2015 2015-03-21 00:00:00+00:00 2015-03-21 00:00:00 UTC Parsing: 2018-03-12T10:12:45Z 2018-03-12 10:12:45+00:00 2018-03-12 10:12:45 UTC Parsing: 2018-06-29 17:08:00.586525+00:00 2018-06-29 17:08:00.586525+00:00 2018-06-29 17:08:00.586525 UTC Parsing: 2018-06-29 17:08:00.586525+05:00 2018-06-29 12:08:00.586525+00:00 2018-06-29 12:08:00.586525 UTC Parsing: Tuesday , 6th September, 2017 at 4:30pm 2017-09-06 16:30:00+00:00 2017-09-06 16:30:00 UTC

Как видите, все форматы даты успешно пропарсены.

Но заметили ли вы разницу? Если мы не указываем часовой пояс, он автоматически конвертируется в UTC. Именно поэтому важно запомнить, что нужно указать параметры to_timezone и naive , если время не в UTC.

Arrow

Arrow — еще одна библиотека для работы с датой и временем. Как и maya , эта библиотека определяет формат даты и времени. После выполнения кода возвращается datetime -объект из объекта arrow .

Попробуем спарсить ту же строку, которая была в примере с maya:

import arrow dt = arrow.get('2018-04-29T17:45:25Z') print(dt.date()) print(dt.time()) print(dt.tzinfo)
arrow-1.py 2018-04-29 17:45:25 tzutc()

Изменить часовой пояс можно с помощью метода to :

import arrow dt = arrow.get('2018-04-29T17:45:25Z').to('America/New_York') print(dt) print(dt.date()) print(dt.time())
arrow-2.py 2018-04-29T13:45:25-04:00 2018-04-29 13:45:25

Как видите, строка с датой и временем конвертировалась в регион «Америка/Нью-Йорк».

Попробуем спарсить список строк из примеров выше:

import arrow date_array = [ '2018-06-29 08:15:27.243860', #'Jun 28 2018 7:40AM', #'Jun 28 2018 at 7:40AM', #'September 18, 2017, 22:19:55', #'Sun, 05/12/1999, 12:30PM', #'Mon, 21 March, 2015', '2018-03-12T10:12:45Z', '2018-06-29 17:08:00.586525+00:00', '2018-06-29 17:08:00.586525+05:00', #'Tuesday , 6th September, 2017 at 4:30pm' ] for date in date_array: dt = arrow.get(date) print('Parsing: ' + date) print(dt) print(dt.date()) print(dt.time()) print(dt.tzinfo)

Половина строк, которые закомментированы, вызовут ошибку. Вывод остальных:

arrow-3.py Parsing: 2018-06-29 08:15:27.243860 2018-06-29T08:15:27.243860+00:00 2018-06-29 08:15:27.243860 tzutc() Parsing: 2018-03-12T10:12:45Z 2018-03-12T10:12:45+00:00 2018-03-12 10:12:45 tzutc() Parsing: 2018-06-29 17:08:00.586525+00:00 2018-06-29T17:08:00.586525+00:00 2018-06-29 17:08:00.586525 tzoffset(None, 0) Parsing: 2018-06-29 17:08:00.586525+05:00 2018-06-29T17:08:00.586525+05:00 2018-06-29 17:08:00.586525 tzoffset(None, 18000)

Для того чтобы спарсить закомментированные строки, необходимо указать токены. Они должны помочь библиотеке понять, как правильно их парсить. Например, «MMM» — для названий месяца воде «Jan, Feb, Mar». Документацию, в которой подробно рассказывается обо всех токенах, можно прочесть здесь.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *