Polars 1.x按日期列表分组报错Date32未实现的解决方法
Polars 1.x按日期列表分组报错的修复方案
问题原因
Polars从0.20.18升级到1.x版本后,直接对存储日期列表的period_bins列执行group_by会触发not implemented: Date32 panic错误,核心原因是1.x版本的分组哈希编码逻辑暂不支持包含Date类型的列表列。
修复方案
方案1:将日期列表转为元组类型
列表是不可哈希类型,而元组可哈希,Polars支持对元组列进行分组。通过map_elements将列表转为固定长度的日期元组即可:
import polars as pl import datetime dt_str = [{'ts': datetime.date(2023, 7, 1), 'files': 'AGG_202307.xlsx', 'period_bins': [datetime.date(2023, 7, 1), datetime.date(2024, 1, 1)]}, {'ts': datetime.date(2023, 8, 1), 'files': 'AGG_202308.xlsx', 'period_bins': [datetime.date(2023, 7, 1), datetime.date(2024, 1, 1)]}, {'ts': datetime.date(2023, 11, 1), 'files': 'KFC_202311.xlsx', 'period_bins': [datetime.date(2023, 7, 1), datetime.date(2024, 1, 1)]}, {'ts': datetime.date(2024, 2, 1), 'files': 'KFC_202402.xlsx', 'period_bins': [datetime.date(2024, 1, 1), datetime.date(2024, 7, 1)]}] # 将period_bins列的列表转为日期元组 dt = pl.from_dicts(dt_str).with_columns( pl.col("period_bins").map_elements(tuple, return_dtype=pl.Tuple([pl.Date, pl.Date])) ) df_groups = dt.group_by("period_bins") print(df_groups.all().to_dicts())
方案2:拆分列表为独立日期列
如果不需要保留原列表格式,可将日期列表拆分为period_start和period_end两个单独的日期列,按这两列分组更贴合Polars的列式处理逻辑:
import polars as pl import datetime dt_str = [{'ts': datetime.date(2023, 7, 1), 'files': 'AGG_202307.xlsx', 'period_bins': [datetime.date(2023, 7, 1), datetime.date(2024, 1, 1)]}, {'ts': datetime.date(2023, 8, 1), 'files': 'AGG_202308.xlsx', 'period_bins': [datetime.date(2023, 7, 1), datetime.date(2024, 1, 1)]}, {'ts': datetime.date(2023, 11, 1), 'files': 'KFC_202311.xlsx', 'period_bins': [datetime.date(2023, 7, 1), datetime.date(2024, 1, 1)]}, {'ts': datetime.date(2024, 2, 1), 'files': 'KFC_202402.xlsx', 'period_bins': [datetime.date(2024, 1, 1), datetime.date(2024, 7, 1)]}] # 拆分日期列表为两个独立列 dt = pl.from_dicts(dt_str).with_columns( period_start=pl.col("period_bins").list.get(0), period_end=pl.col("period_bins").list.get(1) ).drop("period_bins") df_groups = dt.group_by(["period_start", "period_end"]) print(df_groups.all().to_dicts())
内容的提问来源于stack exchange,提问作者arman
相关产品推荐
相关产品推荐

