Python

Strptime в Python: как разобрать дату

strptime() превращает строку с датой и временем в объект datetime. Он нужен, когда дата приходит как текст: из формы, файла, API-ответа, таблицы, имени файла или пользовательского ввода. Python не угадывает формат даты сам, поэтому вы явно описываете порядок дня, месяца, года, часов и минут

Название читается как string parse time: разобрать время из строки. Обратная операция — strftime(), она превращает дату обратно в строку нужного формата

Минимальный пример

from datetime import datetime

text = "25.06.2026"
date = datetime.strptime(text, "%d.%m.%Y")

print(date)
print(date.year)
print(date.month)
print(date.day)

Формат "%d.%m.%Y" означает: две цифры дня, точка, две цифры месяца, точка, четыре цифры года

Частые коды формата

Код Что означает Пример
%d день месяца 05
%m месяц числом 07
%Y год из четырех цифр 2026
%y год из двух цифр 26
%H часы 00-23 18
%M минуты 45
%S секунды 09

Если в строке есть дефисы, пробелы или двоеточия, они тоже должны быть в формате

from datetime import datetime

text = "2026-07-02 18:45:09"
dt = datetime.strptime(text, "%Y-%m-%d %H:%M:%S")

print(dt)

По этой теме полезно отдельно посмотреть Составьте еженедельное расписание занятий, чтобы расширить контекст и сравнить подходы

По этой теме полезно отдельно посмотреть Аннотации типов для декораторов в Python, чтобы расширить контекст и сравнить подходы

Ошибка ValueError

Если строка не совпадает с форматом, Python выбросит ValueError

from datetime import datetime

text = "02/07/2026"

try:
    dt = datetime.strptime(text, "%d.%m.%Y")
    print(dt)
except ValueError:
    print("Дата не подходит под формат dd.mm.yyyy")

Здесь строка содержит /, а формат ждет точки. Для пользователя это мелочь, для парсера — другой формат

Как разобрать несколько возможных форматов

В реальном вводе даты часто приходят по-разному. Можно попробовать несколько форматов по очереди

from datetime import datetime

FORMATS = ["%d.%m.%Y", "%Y-%m-%d", "%d/%m/%Y"]

def parse_date(text):
    for fmt in FORMATS:
        try:
            return datetime.strptime(text, fmt)
        except ValueError:
            pass
    raise ValueError("Неизвестный формат даты")

print(parse_date("02.07.2026"))
print(parse_date("2026-07-02"))
print(parse_date("02/07/2026"))

Такой подход удобен для импорта таблиц, где люди могли вводить дату в разных привычных стилях

Дата без времени и время без даты

datetime.strptime() всегда возвращает datetime, даже если в строке была только дата. Время будет 00:00:00

from datetime import datetime

value = datetime.strptime("02.07.2026", "%d.%m.%Y")
print(value.date())

Если нужна только дата, возьмите .date(). Если нужно только время, возьмите .time()

value = datetime.strptime("18:30", "%H:%M")
print(value.time())

Как сравнивать даты после strptime

После разбора дата становится нормальным объектом, его можно сравнивать

from datetime import datetime

deadline = datetime.strptime("10.07.2026", "%d.%m.%Y")
today = datetime.strptime("02.07.2026", "%d.%m.%Y")

if today <= deadline:
    print("Срок еще не прошел")
else:
    print("Срок прошел")

Не сравнивайте даты как строки, если формат не ISO. Строки "10.07.2026" и "02.08.2026" сравниваются как текст, а не как календарные даты

Что важно помнить

  • формат должен полностью соответствовать строке
  • %m — месяц, %M — минуты
  • ValueError обычно означает несовпадение строки и формата
  • для нескольких форматов используйте цикл с try/except
  • после разбора можно сравнивать даты, брать год, месяц, день и время

Даты из CSV и таблиц

При импорте таблиц дата почти всегда приходит строкой. Например, в CSV может быть строка заказа

from datetime import datetime

row = "1001;02.07.2026;1490"
order_id, date_text, amount = row.split(";")
order_date = datetime.strptime(date_text, "%d.%m.%Y")

print(order_id, order_date.date(), int(amount))

После разбора дату можно сортировать, сравнивать и группировать по месяцу. Если оставить дату строкой, сортировка может работать неправильно

Дата и часовой пояс

strptime() может разобрать смещение часового пояса, если оно есть в строке

from datetime import datetime

text = "2026-07-02 18:30 +0300"
dt = datetime.strptime(text, "%Y-%m-%d %H:%M %z")

print(dt)
print(dt.tzinfo)

Если в строке нет часового пояса, объект будет naive: Python не знает, к какому часовому поясу относится время. Для внутренних систем лучше заранее договориться, храните ли вы время в UTC или в локальном часовом поясе

Как вывести дату обратно

После разбора можно сформировать строку для пользователя

from datetime import datetime

dt = datetime.strptime("2026-07-02", "%Y-%m-%d")
print(dt.strftime("%d.%m.%Y"))

Это частый сценарий: система хранит дату в одном формате, а пользователю показывает в другом

Ошибка с месяцами и минутами

Новички часто путают %m и %M. Маленькая m — месяц, большая M — минуты

from datetime import datetime

correct = datetime.strptime("2026-07-02 18:45", "%Y-%m-%d %H:%M")
print(correct)

Если поменять %m и %M местами, формат перестанет совпадать со строкой или результат станет не тем, который вы ожидали

Проверка пользовательского ввода

Для формы лучше не давать программе падать на первой ошибке

from datetime import datetime

text = input("Дата в формате дд.мм.гггг: ").strip()

try:
    date = datetime.strptime(text, "%d.%m.%Y")
except ValueError:
    print("Введите дату вроде 02.07.2026")
else:
    print("Дата принята:", date.date())

Так пользователь получает понятную подсказку, а не трассировку Python

Практический сценарий: дата в имени файла

Иногда дата лежит прямо в имени файла: отчет, выгрузка, backup, скриншот. Ее можно достать регулярным выражением и разобрать через strptime()

import re
from datetime import datetime

filename = "orders-2026-07-02.csv"
match = re.search(r"\d{4}-\d{2}-\d{2}", filename)

if match:
    file_date = datetime.strptime(match.group(), "%Y-%m-%d").date()
    print(file_date)

Так удобно сортировать файлы по дате, удалять старые выгрузки или проверять, что пришел свежий отчет

Практический сценарий: дедлайн

from datetime import datetime

deadline_text = "10.07.2026 18:00"
deadline = datetime.strptime(deadline_text, "%d.%m.%Y %H:%M")
now = datetime.now()

if now < deadline:
    print("До дедлайна еще есть время")
else:
    print("Дедлайн прошел")

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

Как не запутаться в форматах

Сначала напишите саму строку, потом под ней формат. Сравнивайте символ к символу

02.07.2026 18:45
%d.%m.%Y %H:%M

Если в строке есть точка, точка должна быть в формате. Если есть пробел, пробел должен быть в формате. Если год идет первым, формат тоже должен начинаться с %Y

Подписаться
Уведомить о
guest
0 комментариев
Старые
Новые Популярные

Настройки cookie

0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x