You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Polars使用is_in()过滤duration类型数据时触发类型错误求助

解决Polars中duration类型列使用is_in()多值筛选的报错问题

先看你的DataFrame构造代码:

import polars as pl

df = pl.DataFrame({
    "duration_m": [5, 15, 30]
})
df = df.with_columns(
    duration = pl.duration(minutes = pl.col("duration_m"))
)

当你尝试用is_in()传入多个duration对象的列表时触发报错:

my_durations = [pl.duration(minutes=5), pl.duration(minutes=15)]
df.filter(pl.col("duration").is_in(my_durations))

TypeError: not yet implemented: Nested object types
Hint: Try setting strict=False to allow passing data with mixed types.

这是因为Polars目前还不支持直接将多个duration对象组成的Python列表传入is_in(),但可以通过以下几种方法解决:

方法1:转换为纳秒数值进行筛选

利用duration类型底层以纳秒存储的特性,将列和筛选目标都转成纳秒数值:

# 把目标duration转成纳秒数值
my_durations_ns = [
    pl.duration(minutes=5).total_nanoseconds(),
    pl.duration(minutes=15).total_nanoseconds()
]
# 筛选时将duration列也转成纳秒数值后匹配
result = df.filter(pl.col("duration").dt.total_nanoseconds().is_in(my_durations_ns))
print(result)

方法2:用Polars Series包装筛选列表

把多个duration对象放到Polars Series中再传入is_in(),Polars就能正确识别类型:

my_durations_series = pl.Series([pl.duration(minutes=5), pl.duration(minutes=15)])
result = df.filter(pl.col("duration").is_in(my_durations_series))
print(result)

方法3:直接基于原始列筛选(最简便)

既然duration列是从duration_m生成的,直接筛选原始的分钟数值列更简单高效:

result = df.filter(pl.col("duration_m").is_in([5, 15]))
print(result)

以上三种方法都能得到你想要的筛选结果:

shape: (2, 2)
┌────────────┬──────────────┐
│ duration_m ┆ duration     │
│ ---        ┆ ---          │
│ i64        ┆ duration[ns] │
╞════════════╪══════════════╡
│ 5          ┆ 5m           │
│ 15         ┆ 15m          │
└────────────┴──────────────┘

内容的提问来源于stack exchange,提问作者Wouter De Raeve

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 00:33:19