import polars as pl
from datetime import date
df = pl.DataFrame({"a": pl.date_range(date(2023, 1, 1), date(2023, 1, 3))})
print(df.with_columns([(pl.col("a") - pl.col("a").shift(1))]))
# shape: (3, 1)
# ┌──────────────┐
# │ a │
# │ --- │
# │ duration[ms] │
# ╞══════════════╡
# │ null │
# │ 1d │
# │ 1d │
# └──────────────┘
Учитывая, что я работаю с запаздывающими переменными, я хотел бы заполнить значения nan, полученные в результате отставания второй переменной. Использование .fill_null(0) преобразует весь столбец в единицу измерения int64 со значениями, преобразованными с точностью до миллисекунды.
# Filling null values brings everything to the ms unit
print(df.with_columns([(pl.col("a") - pl.col("a").shift(1)).fill_null(0)]))
# shape: (3, 1)
# ┌──────────┐
# │ a │
# │ --- │
# │ i64 │
# ╞══════════╡
# │ 0 │
# │ 86400000 │
# │ 86400000 │
# └──────────┘
Это заставляет меня вернуть их к ежедневной детализации с помощью простого разделения:
# Which forces to a division to bring everything back to days
print(
df.with_columns(
[((pl.col("a") - pl.col("a").shift(1)).fill_null(0) / 86400000).cast(pl.UInt64)]
)
)
# shape: (3, 1)
# ┌─────┐
# │ a │
# │ --- │
# │ u64 │
# ╞═════╡
# │ 0 │
# │ 1 │
# │ 1 │
# └─────┘
Мне интересно, есть ли что-нибудь более практичное и краткое, чем это, чтобы хранить значения в виде целых чисел, представляющих день. Я прекрасно справляюсь с этой единицей самостоятельно, но при работе с большим количеством столбцов это может стать довольно многословным.
Полагаю, в настоящее время это не поддерживается, поскольку us, ns и ms — единственные единицы измерения, которые в настоящее время поддерживаются pl.Duration.
Полный повтор
import polars as plfrom datetime import date
df = pl.DataFrame({"a": pl.date_range(date(2023, 1, 1), date(2023, 1, 3))})
print(df.with_columns([(pl.col("a") - pl.col("a").shift(1))]))
# Filling null values brings everything to the ms unit
print(df.with_columns([(pl.col("a") - pl.col("a").shift(1)).fill_null(0)]))
# Which forces to a division to bring everything back to days
print(
df.with_columns(
[((pl.col("a") - pl.col("a").shift(1)).fill_null(0) / 86400000).cast(pl.UInt64)]
)
)
Подробнее здесь: https://stackoverflow.com/questions/754 ... casting-to
Мобильная версия