prices = pd.DataFrame({'ts': pd.to_datetime(['2026-01-01 10:00','2026-01-01 10:05']),
'rate': [90.1, 90.4]})
orders = pd.DataFrame({'order_id': [1, 2],
'ts': pd.to_datetime(['2026-01-01 10:03','2026-01-01 10:07']),
'amount': [100, 200]})
pd.merge_asof(orders, prices, on='ts')
Результат:
order_id ts amount rate 0 1 2026-01-01 10:03:00 100 90.1 1 2 2026-01-01 10:07:00 200 90.4
pd.merge_asof(orders, prices, on='ts',
tolerance=pd.Timedelta('2min'))
Результат:
order_id ts amount rate 0 1 2026-01-01 10:03:00 100 NaN 1 2 2026-01-01 10:07:00 200 90.4Порешать Python-задачи в тренажёре →
Классика для time-series: сматчить сделки с котировками, заказы с ценами/курсами, события с последним известным снапшотом. Часто спрашивают на собеседовании как альтернативу тяжёлому join + фильтрации по времени.
merge джойнит по точному равенству ключей, а merge_asof — по ближайшему значению. Это всегда left join: каждой строке left подбирается одна строка right, ближайшая по ключу в заданном направлении. Если подходящей нет, поля из right становятся NaN.
by задаёт колонки, по которым нужно точное совпадение, прежде чем искать ближайший ключ. Например, by='channel' сматчит цену по тому же каналу, а on='ts' уже выберет ближайший момент внутри канала. Это аналог группового as-of join.
merge_asof требует, чтобы обе таблицы были отсортированы по колонке on по возрастанию. Отсортируй их через sort_values('ts') перед вызовом. Если используешь by, внутри каждой группы порядок по ключу тоже должен быть возрастающим.
Pandas merge / join · Pandas: временные ряды
merge · to_datetime · concat · rolling · resample · shift
Открыть Python-тренажёр (556 задач) →