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:45Python реальное время (получение реального времени в 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.