Преобразовать строку в дату
Есть строка
s=’2019-03-08 05:19:29.826600+03′
нужно преобразовать в дату, не могу выбрать шаблон, проблема возникает
с часовым поясом +03
Пробовал так
date_format =»%Y-%m-%d %H:%M:%S.%f+»
print(datetime.datetime.strptime(s,date_format))
Но часовой пояс не подходит под шаблон, подскажите какой шаблон указать
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:
Pandas — преобразовать строку в дату без часов, минут и секунд
Добрый день! Мне нужно получить 2020-01-01. Пока получается 2020-01-01 02:12:00 .
Преобразовать числа в дату и время
Добрый день! Подскажите как преобразовать числа в формат дата-время Сейчас они хранятся во фрейме.
Преобразовать дату записанную словами в timestamp
Здравствуйте. Есть дата в формате "Tue May 28 20:35:07 2013". Нужно преобразовать её в.
Преобразовать строку S в строку длины N следующим образом
Всем привет, не получается решить задачу на пайтоне, прошу пoмощи. Дано целое число N (> 0) и.
Преобразовать дату вида
Нужно написать программу на питоне. Буду очень благодарна Преобразовать дату вида dd:mm:yy в.
1040 / 575 / 242
Регистрация: 15.01.2019
Сообщений: 2,178
Записей в блоге: 1
polin11, как-то так
1 2 3 4 5 6 7 8 9 10 11 12
def convert_string_to_time(date_string, timezone): from datetime import datetime import pytz date_time_obj = datetime.strptime(date_string[:26], '%Y-%m-%d %H:%M:%S.%f') date_time_obj_timezone = pytz.timezone(timezone).localize(date_time_obj) return date_time_obj_timezone s = '2019-03-08 05:19:29.826600+03:00' TIME_ZONE = 'Europe/Moscow' date_time_obj_timezone = convert_string_to_time(s, TIME_ZONE) print(date_time_obj_timezone)
3850 / 2138 / 566
Регистрация: 02.09.2015
Сообщений: 5,425
1 2 3 4 5 6 7 8
from datetime import datetime def main(): s = '2019-03-08 05:19:29.826600+03:00' print(datetime.strptime(s, "%Y-%m-%d %H:%M:%S.%f%z")) if __name__ == "__main__": main()
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь
Как преобразовать строку числовой матрицы в стринговую строку?
Есть data frame, например такой. 8 11 82 68 8 8393 8403 932 3260 8.
Преобразовать строку s в строку длины n следующим образом
Дано целое число n и строка s. Преобразовать строку s в строку длины n следующим образом: если.
Преобразовать дату в строку
Ребят нужно числовую дату преоразовать в строку. Например 10.08.2015 в 10.августа.2015 C++.
Преобразовать строку в дату
Помогите пожалуйста не могу сделать, как преобразовать время в строку,работаю c Excel, надо.
Как преобразовать строку в дату? 20180819 -> 2018-08-19
Направьте на правильный путь, а то я совсем запутался. Есть строка text = «20180819» , а на выходе хочу получить 2018-08-19 Чтобы потом создать иерархию папок с такими названиями: 2018/2018-08/2018-08-19 Использую библиотеку datetime, но у меня получается.
Отслеживать
76.7k 6 6 золотых знаков 54 54 серебряных знака 120 120 бронзовых знаков
задан 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,448 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 в виде следующих классов:
Класс date
Для работы с датами воспользуемся классом date , который определен в модуле datetime. Для создания объекта date мы можем использовать конструктор date, который последовательно принимает три параметра: год, месяц и день.
date(year, month, day)
Например, создадим какую-либо дату:
import datetime yesterday = datetime.date(2017,5, 2) print(yesterday) # 2017-05-02
Если необходимо получить текущую дату, то можно воспользоваться методом today() :
from datetime import date today = date.today() print(today) # 2017-05-03 print("<>.<>.<>".format(today.day, today.month, today.year)) # 2.5.2017
С помощью свойств day, month, year можно получить соответственно день, месяц и год
Класс time
За работу с временем отвечает класс time . Используя его конструктор, можно создать объект времени:
time([hour] [, min] [, sec] [, microsec])
Конструктор последовательно принимает часы, минуты, секунды и микросекунды. Все параметры необязательные, и если мы какой-то параметр не передадим, то соответствующее значение будет инициализироваться нулем.
from datetime import time current_time = time() print(current_time) # 00:00:00 current_time = time(16, 25) print(current_time) # 16:25:00 current_time = time(16, 25, 45) print(current_time) # 16:25:45
Класс datetime
Класс datetime из одноименного модуля объединяет возможности работы с датой и временем. Для создания объекта datetime можно использовать следующий конструктор:
datetime(year, month, day [, hour] [, min] [, sec] [, microsec])
Первые три параметра, представляющие год, месяц и день, являются обязательными. Остальные необязательные, и если мы не укажем для них значения, то по умолчанию они инициализируются нулем.
from datetime import datetime deadline = datetime(2017, 5, 10) print(deadline) # 2017-05-10 00:00:00 deadline = datetime(2017, 5, 10, 4, 30) print(deadline) # 2017-05-10 04:30:00
Для получения текущих даты и времени можно вызвать метод now() :
from datetime import datetime now = datetime.now() print(now) # 2017-05-03 11:18:56.239443 print("<>.<>.<> <>:<>".format(now.day, now.month, now.year, now.hour, now.minute)) # 3.5.2017 11:21 print(now.date()) print(now.time())
С помощью свойств day, month, year, hour, minute, second можно получить отдельные значения даты и времени. А через методы date() и time() можно получить отдельно дату и время соответственно.
Преобразование из строки в дату
Из функциональности класса datetime следует отметить метод strptime() , который позволяет распарсить строку и преобразовать ее в дату. Этот метод принимает два параметра:
strptime(str, format)
Первый параметр str представляет строковое определение даты и времени, а второй параметр — формат, который определяет, как различные части даты и времени расположены в этой строке.
Для определения формата мы можем использовать следующие коды:
- %d : день месяца в виде числа
- %m : порядковый номер месяца
- %y : год в виде 2-х чисел
- %Y : год в виде 4-х чисел
- %H : час в 24-х часовом формате
- %M : минута
- %S : секунда
Применим различные форматы:
from datetime import datetime deadline = datetime.strptime("22/05/2017", "%d/%m/%Y") print(deadline) # 2017-05-22 00:00:00 deadline = datetime.strptime("22/05/2017 12:30", "%d/%m/%Y %H:%M") print(deadline) # 2017-05-22 12:30:00 deadline = datetime.strptime("05-22-2017 12:30", "%m-%d-%Y %H:%M") print(deadline) # 2017-05-22 12:30:00
Преобразование строк в дату со временем
Модуль 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». Документацию, в которой подробно рассказывается обо всех токенах, можно прочесть здесь.