Python: эффективная работа с датами и временем

Раздел: Python -> Время и даты

Работа с датой и временем в Python

Основным и наиболее эффективным средством для работы с датами и временем в Python является модуль datetime. Он предоставляет классы date, time, datetime и timedelta, а также методы для форматирования, парсинга и арифметических операций. Рассмотрим базовые возможности.

Как получить текущую дату и время?

from datetime import datetime, date, time
# Текущие дата и время
now = datetime.now()
print(now)  # 2025-04-02 15:30:45.123456

время создания python (время создания файла/объекта в python)

2025-04-02 15:30:45.123456

время сообщения python (время сообщения (метка времени) в python)

Метод now() возвращает локальное время с учётом настроек системы. Для получения только даты используется date.today().

Типичная ошибка: путаница между datetime.now() и datetime.today() - оба работают одинаково, но today() может быть менее точным в некоторых реализациях.

Как создать объект datetime из строки?

from datetime import datetime
date_str = "2025-12-31 23:59:59"
dt = datetime.strptime(date_str, "%Y-%m-%d %H:%M:%S")
print(dt)

дата и время в python (работа с датой и временем в python)

2025-12-31 23:59:59

модуль время python (модуль time в python)

Метод strptime преобразует строку в объект datetime по заданному формату. Форматные коды соответствуют стандарту POSIX.

Распространённая проблема: несовпадение формата строки и шаблона вызывает ValueError. Необходимо точно указывать код, например, %d для дня, %m для месяца, %Y для года.

Как выполнять арифметику с датами?

from datetime import datetime, timedelta
now = datetime.now()
tomorrow = now + timedelta(days=1)
print(tomorrow)
delta = timedelta(weeks=2, hours=3)
new_date = now + delta
print(new_date)

Python определить время (определение времени в python)

2025-04-03 15:30:45.123456
2025-04-16 18:30:45.123456

Python время года (определение времени года по дате в python)

Объект timedelta представляет разницу во времени. Сложение и вычитание работают с днями, секундами, микросекундами, миллисекундами, минутами, часами, неделями.

Проблема: timedelta не поддерживает месяцы и годы, так как их длина переменна. Для таких операций используются сторонние библиотеки.

Как форматировать дату и время в строку?

from datetime import datetime
now = datetime.now()
formatted = now.strftime("%d-%m-%Y %H:%M:%S")
print(formatted)  # 02-04-2025 15:30:45

Python реальное время (получение реального времени в python)

02-04-2025 15:30:45

время в секунды python (преобразование времени в секунды в python)

Метод strftime преобразует объект datetime в строку согласно указанному формату.

Какие альтернативы существуют кроме datetime?

Модуль time предоставляет низкоуровневые функции, такие как time() (количество секунд с эпохи), localtime() и gmtime(). Он удобен для замера времени выполнения.

import time
start = time.time()
# какой-то код
end = time.time()
print(f"Выполнено за {end - start} секунд")

Python datetime время (работа с datetime в python)

Модуль calendar полезен для календарных расчётов: проверка високосного года, вывод календаря на месяц.

import calendar
print(calendar.isleap(2024))  # True
print(calendar.month(2025, 4))

Python 3 время (работа с временем в python 3)

Как работать с часовыми поясами?

Библиотека pytz предоставляет базу часовых поясов IANA. В Python 3.9+ появился модуль zoneinfo, но pytz остаётся популярным.

from datetime import datetime
import pytz
tz = pytz.timezone('Europe/Moscow')
moscow_now = datetime.now(tz)
print(moscow_now)

Python функция времени (функции для работы со временем в python)

Также можно использовать dateutil для гибкого парсинга дат из строк произвольного формата:

from dateutil import parser
dt = parser.parse("2025-04-02T15:30:00+03:00")
print(dt)

Распространённая ошибка при работе с pytz: применение метода localize() вместо передачи часового пояса напрямую. Неправильный способ может привести к смещению времени при переходе на летнее время.

Как использовать pandas для временных рядов?

Библиотека pandas содержит тип Timestamp и функции to_datetime, date_range. Это удобно для анализа больших наборов данных.

import pandas as pd
dates = pd.date_range('2025-01-01', periods=5, freq='M')
print(dates)
DatetimeIndex(['2025-01-31', '2025-02-28', '2025-03-31', '2025-04-30', '2025-05-31'], dtype='datetime64[ns]', freq='M')

Расширенные примеры работы с датой и временем

Вычисление возраста по дате рождения

Пример
from datetime import date

def calculate_age(birth_date):
    today = date.today()
    age = today.year - birth_date.year
    # Проверка, был ли уже день рождения в этом году
    if (today.month, today.day) < (birth_date.month, birth_date.day):
        age -= 1
    return age

birth = date(1990, 5, 15)
print(f"Возраст: {calculate_age(birth)} лет")
Возраст: 34 лет

Алгоритм учитывает, прошёл ли день рождения в текущем году, корректируя возраст на год.

Определение последнего дня месяца

Пример
from datetime import date, timedelta
import calendar

def last_day_of_month(year, month):
    # Используем calendar.monthrange
    last_day = calendar.monthrange(year, month)[1]
    return date(year, month, last_day)

print(last_day_of_month(2025, 2))  # 2025-02-28 (невисокосный)
2025-02-28

Метод monthrange возвращает кортеж (день недели 1-го числа, количество дней в месяце).

Генерация всех дат между двумя датами

Пример
from datetime import datetime, timedelta

def date_range(start, end):
    current = start
    while current < end:
        yield current
        current += timedelta(days=1)

start = datetime(2025, 3, 1)
end = datetime(2025, 3, 5)
for d in date_range(start, end):
    print(d.date())
2025-03-01
2025-03-02
2025-03-03
2025-03-04

Генератор за каждый проход возвращает следующий день. Полезно для построения отчётов по дням.

Учёт перехода на летнее время с помощью pytz

Пример
from datetime import datetime
import pytz

tz = pytz.timezone('US/Eastern')
dt = datetime(2025, 3, 9, 2, 30)  # в 2:00 ночи переходят на летнее время
d_local = tz.localize(dt, is_dst=None)  # вызовет NonExistentTimeError
# Правильный способ:
d_local = tz.localize(dt, is_dst=False)  # использует стандартное время
print(d_local)  # 2025-03-09 02:30:00-05:00
# Для существующего времени:
dt2 = datetime(2025, 11, 2, 1, 30)  # повторный час после перевода
d_local2 = tz.localize(dt2, is_dst=None)  # вызовет AmbiguousTimeError
# Решение: указать is_dst=True или False
print(d_local2)
2025-03-09 02:30:00-05:00

Параметр is_dst помогает разрешить неоднозначные или несуществующие моменты времени.

Парсинг даты из нестандартного формата с dateutil

Пример
from dateutil import parser

date_strings = [
    "2025-04-02T15:30:00+05:00",
    "April 2, 2025 3:30 PM",
    "02/04/2025 15:30",
    "2025-04-02 15:30:00.123456"
]
for s in date_strings:
    dt = parser.parse(s)
    print(dt)
2025-04-02 15:30:00+05:00
2025-04-02 15:30:00
2025-02-04 15:30:00
2025-04-02 15:30:00.123456

Обратите внимание: третий пример может быть интерпретирован как месяц/день в американском формате. Для явного задания порядка следует использовать parser.parse(s, dayfirst=True).

Добавление месяцев с помощью dateutil.relativedelta

Пример
from datetime import datetime
from dateutil.relativedelta import relativedelta

dt = datetime(2025, 1, 31)
new_dt = dt + relativedelta(months=1)
print(new_dt)  # 2025-02-28 (последний день февраля)
new_dt2 = dt + relativedelta(months=2)
print(new_dt2)  # 2025-03-31 (месяц с 31 днём)
2025-02-28 00:00:00
2025-03-31 00:00:00

relativedelta корректно обрабатывает окончания месяцев, что невозможно при использовании timedelta.

Работа с датой и временем в Python - comments

En
дата и время в python (python)