是否有方法使用polars
过滤一段时间内的数据(即start time
和end time
(?
import pandas as pd
import polars as pl
dr = pd.date_range(start='2020-01-01', end='2021-01-01', freq="30min")
df = pd.DataFrame({"timestamp": dr})
pf = pl.from_pandas(df)
我做过的最好的尝试是:
pf.filter((pl.col("timestamp").dt.hour()>=9) & (pl.col("timestamp").dt.minute()>=30))
它只给了我9:30
之后的一切;如果我在那之后附加另一个filter
:
pf.filter((pl.col("timestamp").dt.hour()>=9) & (pl.col("timestamp").dt.minute()>=30)).filter((pl.col("timestamp").dt.hour()<16))
然而,这并没有给我正好落在16:00
上的切片。
polars
API似乎没有专门处理时间序列的time
部分(仅处理date
部分(;使用polars
有更好的解决方法吗?
好问题!
首先,我们可以在Polars:中创建这种DataFrame
from datetime import datetime, time
import polars as pl
start = datetime(2020,1,1)
stop = datetime(2021,1,1)
df = pl.DataFrame({'timestamp':pl.date_range(start=start, end=stop, interval="30m",eager=True)})
为了处理日期时间的时间组件,我们将timestamp
列强制转换为pl.Time
dtype。
为了过滤一系列时间,我们将时间的上下限传递给in_between
。
在本例中,我打印了原始的timestamp
列、转换为pl.Time
的timestamp
列以及筛选条件。
(
df
.select(
[
pl.col("timestamp"),
pl.col("timestamp").cast(pl.Time).alias('time_component'),
(pl.col("timestamp").cast(pl.Time).is_between(
time(9,30),time(16)
).alias("timestamp_in_range")
)
]
)
)
你想要的是:
(
df
.filter(
pl.col("timestamp").cast(pl.Time).is_between(
time(9,30),time(16)
)
)
)
有关控制边界行为的语法,请参阅API文档:https://pola-rs.github.io/polars/py-polars/html/reference/api/polars.Expr.is_between.html#polars.Expr.is_between
polars一书中对此进行了描述:https://pola-rs.github.io/polars-book/user-guide/howcani/timeseries/selecting_dates.html#filtering-按日期范围
它看起来像这样:
start_date = "2022-03-22 00:00:00"
end_date = "2022-03-27 00:00:00"
df = pl.DataFrame(
{
"dates": [
"2022-03-22 00:00:00",
"2022-03-23 00:00:00",
"2022-03-24 00:00:00",
"2022-03-25 00:00:00",
"2022-03-26 00:00:00",
"2022-03-27 00:00:00",
"2022-03-28 00:00:00",
]
}
)
df.with_column(pl.col("dates").is_between(start_date,end_date)).filter(pl.col("is_between") == True)
shape: (4, 2)
┌─────────────────────┬────────────┐
│ dates ┆ is_between │
│ --- ┆ --- │
│ str ┆ bool │
╞═════════════════════╪════════════╡
│ 2022-03-23 00:00:00 ┆ true │
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┤
│ 2022-03-24 00:00:00 ┆ true │
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┤
│ 2022-03-25 00:00:00 ┆ true │
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┤
│ 2022-03-26 00:00:00 ┆ true │
└─────────────────────┴────────────┘