Какие особенности работы с датами и временем в Python и какие есть библиотеки для работы с timedelta
Что проверяют
Понимаете ли вы разницу между наивными датами и датами с часовым поясом и знаете ли, где timedelta ведёт себя неочевидно. В data-задачах следом почти всегда спрашивают, как то же самое делается в pandas.
Как отвечать
Модуль datetime даёт четыре типа: date, time, datetime и timedelta. Дальше важны детали:
- наивные и aware: у наивного объекта нет
tzinfo, сравнение наивного с aware бросаетTypeError. Внутри системы храните время в UTC и переводите в локальное только для показа; - текущее время:
datetime.utcnow()с Python 3.12 объявлен устаревшим, он возвращает наивный объект. Правильноdatetime.now(timezone.utc); - часовые пояса: с Python 3.9 в стандартной библиотеке есть
zoneinfo,ZoneInfo("Europe/Moscow").pytzостался в старом коде, там пояс ставят черезlocalize(), иначе получите смещение по местному среднему времени вместо реального; timedelta: хранит только дни, секунды и микросекунды. Месяцев и лет в нём нет, для нихdateutil.relativedelta:relativedelta(months=1)от 31 января даёт последний день февраля;- арифметика через DST: если у двух дат один и тот же
tzinfo, Python вычитает их по настенным часам и не учитывает смену смещения. Интервал через переход на летнее время выходит на час неверным, поэтому считают в UTC; - парсинг:
strptimeпо формату,fromisoformatс Python 3.11 понимает почти весь ISO 8601, включая суффиксZ.
Для таблиц нужен pandas: pd.to_datetime, pd.Timedelta, pd.DateOffset для календарных сдвигов, tz_localize и tz_convert, аксессор .dt, resample. В numpy есть timedelta64.
Где спотыкаются
Берут delta.seconds вместо delta.total_seconds(). Первое это только остаток секунд внутри суток: для интервала в два дня и пять секунд он вернёт 5.
Смешивают наивные и aware даты. utcnow().timestamp() трактует наивное время как локальное, и метка съезжает на смещение пояса сервера.
Прибавляют месяц как timedelta(days=30) и получают дрейф дат в отчётах, или передают пояс из pytz прямо в конструктор datetime.