Как использовать join_where() в Polars для условных объединений с диапазонами дат?Python

Программы на Python
Anonymous
 Как использовать join_where() в Polars для условных объединений с диапазонами дат?

Сообщение Anonymous »

У меня есть два фрейма данных Polars:
  • Один (df) записывает даты продажи товаров.
  • Другой (df2) содержит дополнительные сведения, включая даты и
    значения для товаров.
Я хочу присоединиться к этим фреймам данных, где идентификатор совпадает, и продажа дата в df находится в пределах 1 дня от дат в df2.
Вот пример данных:

Код: Выделить всё

import polars as pl
from datetime import datetime

df = pl.DataFrame({
"ID" : [1,2,3],
"Time" : [datetime(1,1,2),datetime(1,1,3),datetime(1,1,3)],
})

df2 = pl.DataFrame({
"ID" : [1,1,1,2,2,3],
"Time" : [
datetime(1,1,2),
datetime(1,1,3),
datetime(1,1,4),
datetime(1,1,4),
datetime(1,1,5),
datetime(1,1,4),
],
"Value": [10,10,10,20,20,30],
})
Я могу добиться этого с помощью .join() и filter() следующим образом:

Код: Выделить всё

(
df
.with_columns(
(pl.col("Time") - pl.duration(days=1)).alias("-1"),
(pl.col("Time") + pl.duration(days=1)).alias("+1"),

).join(df2, on="ID", how="left")
.filter(pl.col("Time_right").is_between("-1", "+1"))
)
Это работает, но я хотел упростить это, используя функцию join_where(). Вот моя попытка:

Код: Выделить всё

(
df
.with_columns(
(pl.col("Time") - pl.duration(days=1)).alias("-1"),
(pl.col("Time") + pl.duration(days=1)).alias("+1"),

).join_where(
df2,
pl.col("Time_right").is_between("-1", "+1"),
pl.col("ID") == pl.col("ID_right")

)
)
Однако я столкнулся с этой ошибкой:

Код: Выделить всё

InvalidOperationError: only 1 binary comparison allowed as join condition
Как мне использовать join_where() в этом случае? Есть ли способ добиться желаемого результата с помощью этой функции или она ограничена в обработке нескольких условий?

Подробнее здесь: https://stackoverflow.com/questions/792 ... ate-ranges

Вернуться в «Python»