pd.to_datetime(df['col'], format='%d.%m.%Y') — с явным форматом парсинг быстрее и предсказуемее, чем автоопределение. errors='coerce' превращает нераспознанные строки в NaT вместо ошибки — так весь столбец не падает из-за одного битого значения. Для смешанных форматов есть format='mixed', но он медленный, лучше чистить данные заранее.
Вычитание datetime-колонок даёт Timedelta: df['d2'] - df['d1']. Чтобы получить целое число дней — добавь .dt.days: (df['d2'] - df['d1']).dt.days. Для часов — .dt.total_seconds() / 3600. Частая задача: дни между регистрацией и первой покупкой, или возраст аккаунта относительно pd.Timestamp('today').
dt — способ достать части даты из datetime-колонки: .dt.year, .dt.month, .dt.day, .dt.weekday (0=понедельник), .dt.quarter, .dt.hour, .dt.isocalendar().week. Работает векторно на всём столбце сразу. Без него пришлось бы гонять apply по строкам — в разы медленнее. Обязательное условие: колонка уже приведена к datetime через to_datetime.
tz_localize навешивает таймзону на naive-даты (у которых зоны ещё нет) — говорит «эти времена в Москве». tz_convert переводит уже zone-aware даты в другую зону, пересчитывая часы. Порядок: сначала localize('Europe/Moscow'), потом при необходимости convert('UTC'). Перепутать — классическая ошибка, из-за которой события уезжают на несколько часов.
pd.date_range('2026-01-01', '2026-01-31', freq='D') генерирует непрерывную последовательность дат. Главное применение — календарная таблица: делаешь merge событий с полным диапазоном дат, чтобы дни без активности не выпали, а получили ноль. Без этого графики DAU и когорты рвутся на пропущенных днях. freq поддерживает 'D', 'W', 'ME' (конец месяца), 'H' и другие частоты.
Pandas: основы · Pandas groupby · Pandas merge / join · Pandas: временные ряды · NumPy векторизация · scipy: A/B-тесты · sklearn для аналитика · Графики: matplotlib / seaborn
Открыть весь Python-тренажёр (556 задач) →