import polars as pl
import numpy as np
from datetime import datetime
df = pl.DataFrame({'ts': pl.datetime_range(datetime(2020, 1, 1), datetime(2020, 1, 10), '1h', eager=True)})
df = df.with_columns(value=pl.Series(np.arange(len(df))))
In [62]: df
Out[62]:
shape: (217, 2)
┌─────────────────────┬───────┐
│ ts ┆ value │
│ --- ┆ --- │
│ datetime[μs] ┆ i64 │
╞═════════════════════╪═══════╡
│ 2020-01-01 00:00:00 ┆ 0 │
│ 2020-01-01 01:00:00 ┆ 1 │
│ 2020-01-01 02:00:00 ┆ 2 │
│ 2020-01-01 03:00:00 ┆ 3 │
│ … ┆ … │
│ 2020-01-09 21:00:00 ┆ 213 │
│ 2020-01-09 22:00:00 ┆ 214 │
│ 2020-01-09 23:00:00 ┆ 215 │
│ 2020-01-10 00:00:00 ┆ 216 │
└─────────────────────┴───────┘
Что я хотел бы получить для каждой строки:
- рассмотреть все строки, которые находятся между 3 днями раньше и в полночь того же дня
- вычислите среднее значение
Ожидаемый результат:
shape: (217, 2)
┌─────────────────────┬───────┐
│ ts ┆ value │
│ --- ┆ --- │
│ datetime[μs] ┆ i64 │
╞═════════════════════╪═══════╡
│ 2020-01-01 00:00:00 ┆ null │
│ 2020-01-01 01:00:00 ┆ null │
│ 2020-01-01 02:00:00 ┆ null │
│ 2020-01-01 03:00:00 ┆ null │
│ … ┆ … │
│ 2020-01-09 21:00:00 ┆ 155.5 │
│ 2020-01-09 22:00:00 ┆ 155.5 │
│ 2020-01-09 23:00:00 ┆ 155.5 │
│ 2020-01-10 00:00:00 ┆ 179.5 │
└─────────────────────┴───────┘
Как я рассчитал ожидаемый результат:
df.filter(
(pl.col("ts") >= datetime(2020, 1, 6)) & (pl.col("ts") < datetime(2020, 1, 9))
).mean()
df.filter(
(pl.col("ts") >= datetime(2020, 1, 7)) & (pl.col("ts") < datetime(2020, 1, 10))
).mean()
Подробнее здесь: https://stackoverflow.com/questions/760 ... t-midnight