Событие ровно в 10:15: как согласовать границы интервалов resample

В одном отчёте событие в 10:15 относится к первой четверти часа, в другом — ко второй. Итог за день совпадает, но графики нагрузки расходятся. Значение подписи интервала и включение его границы нужно согласовать отдельно.

Подпись не определяет состав интервала

У временной корзины есть начало, конец и правило включения границ. label управляет подписью, closed — тем, какая граница включена. Можно подписать интервал концом, оставив включённым начало. Поэтому одинаковая метка 10:15 ещё не говорит, какие события вошли в сумму.

Для примера определим интервалы от полуночи, закрытые слева: 10:00–10:15 включает 10:00 и исключает 10:15. Его подпись — 10:00. Следующая корзина начинается ровно в 10:15.

Зафиксировать начало сетки

origin="start_day" привязывает сетку к полуночи, offset сдвигает её. Для смены с началом в 00:05 можно использовать пятиминутный сдвиг. Не привязывайте сетку к первой строке файла, если отчёты разных поставок должны иметь одинаковые границы.

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

import pandas as pd
x = pd.Series([1, 10, 100], index=pd.to_datetime([
    "2026-10-01 10:14:59", "2026-10-01 10:15:00", "2026-10-01 10:30:00"]))
r = x.resample("15min", origin="start_day", offset="0min",
               closed="left", label="left").sum()
print(r)
assert r.loc["2026-10-01 10:00"] == 1
assert r.loc["2026-10-01 10:15"] == 10
assert r.loc["2026-10-01 10:30"] == 100
assert r.sum() == x.sum() == 111

Событие 10:15 попало в корзину с началом 10:15, а 10:30 — в следующую. Сверка суммы подтверждает сохранность данных, адресные проверки подтверждают договор границ. Одного общего итога для такой задачи недостаточно.

Согласовать два независимых расчёта

Перед соединением почасовых таблиц запишите рядом с каждой период, origin, offset, closed, label и часовой пояс. Таблицы с одинаковыми подписями могут описывать разные интервалы. Исправлять это сдвигом подписей можно только после проверки реальных границ.

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

Отдельно задайте диапазон отчёта. Первый и последний интервалы выгрузки могут быть неполными. Если файл начинается в 10:07, корзина 10:00 не содержит первые семь минут. resample не знает, намеренно ли их нет или они потеряны при доставке.

Храните границы в метаданных результата и добавьте три пограничных события в проверочный вход. Это позволит менять источник и размер окна, сохраняя смысл графика нагрузки. Различие отчётов тогда можно объяснить конкретным событием, а не искать ошибку по одинаковому суточному итогу.

Закрепить на практике

Бесплатный урок временных столбцов поможет подготовить даты и длительности. После него переходите к продвинутому примеру resample: согласуйте границы интервалов и проверьте точные пограничные моменты. Откройте бесплатный урок и задачи. Полная последовательность тем — в бесплатном курсе.

Продолжить на практике

  • NumPy и pandas: практический тренажёр ↗

    Бесплатный тренажёр NumPy и pandas для тех, кто знает основы Python. Научитесь очищать таблицы, объединять данные и собирать отчёты: 31 урок и 124 задачи с кодом и автоматической проверкой.