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

如何用Polars生成促销日期数组列并实现行展开

用Polars生成促销日期数组并展开多行

需求说明

现有Polars DataFrame包含「Start Promotion」「End Promotion」「Price」列,需实现:

  • 新增「Promotion Dates」列,存储每行起止日期范围内的所有日期数组
  • 支持通过explode将数组列展开为多行,方便后续关联其他DataFrame

测试数据:

import polars as pl

data = {
    "Start Promotion": ["2024-05-01", "2023-12-30"],
    "End Promotion": ["2024-05-05", "2024-01-01"],
    "Price": [12, 10]
}

df = pl.DataFrame(data)

解决方案

步骤1:转换日期列类型

先将字符串格式的日期列转为Polars日期类型,确保后续能正确生成日期序列:

df = df.with_columns(
    pl.col("Start Promotion").str.to_date().alias("促销开始日期"),
    pl.col("End Promotion").str.to_date().alias("促销结束日期")
).drop("Start Promotion", "End Promotion")

步骤2:生成促销日期数组列

使用pl.date_range函数为每行生成起止日期范围内的所有日期,设置closed='both'包含首尾日期:

df_with_dates = df.with_columns(
    pl.date_range(
        start=pl.col("促销开始日期"),
        end=pl.col("促销结束日期"),
        interval="1d",
        closed="both"
    ).alias("促销日期")
)

如果需要将日期数组转为字符串格式(匹配示例中的输出),可添加cast操作:

df_with_dates = df.with_columns(
    pl.date_range(
        start=pl.col("促销开始日期"),
        end=pl.col("促销结束日期"),
        interval="1d",
        closed="both"
    ).cast(pl.Utf8).alias("促销日期")
)

此时得到的结果符合期望:

促销开始日期促销结束日期价格促销日期
2024-05-012024-05-0512["2024-05-01", "2024-05-02", "2024-05-03", "2024-05-04", "2024-05-05"]
2023-12-302024-01-0110["2023-12-30", "2023-12-31", "2024-01-01"]

步骤3:展开数组列为多行

使用explode方法将「促销日期」列的数组展开为多行:

df_exploded = df_with_dates.explode("促销日期")

展开后的结果:

促销开始日期促销结束日期价格促销日期
2024-05-012024-05-0512"2024-05-01"
2024-05-012024-05-0512"2024-05-02"
2024-05-012024-05-0512"2024-05-03"
2024-05-012024-05-0512"2024-05-04"
2024-05-012024-05-0512"2024-05-05"
2023-12-302024-01-0110"2023-12-30"
2023-12-302024-01-0110"2023-12-31"
2023-12-302024-01-0110"2024-01-01"

完整代码

import polars as pl

data = {
    "Start Promotion": ["2024-05-01", "2023-12-30"],
    "End Promotion": ["2024-05-05", "2024-01-01"],
    "Price": [12, 10]
}

df = pl.DataFrame(data)

# 转换日期列类型并更名
df = df.with_columns(
    pl.col("Start Promotion").str.to_date().alias("促销开始日期"),
    pl.col("End Promotion").str.to_date().alias("促销结束日期")
).drop("Start Promotion", "End Promotion")

# 生成促销日期数组列(字符串格式)
df_with_dates = df.with_columns(
    pl.date_range(
        start=pl.col("促销开始日期"),
        end=pl.col("促销结束日期"),
        interval="1d",
        closed="both"
    ).cast(pl.Utf8).alias("促销日期")
)

# 展开数组列为多行
df_exploded = df_with_dates.explode("促销日期")

# 打印结果
print("生成日期数组后的DataFrame:")
print(df_with_dates)
print("\n展开后的DataFrame:")
print(df_exploded)

内容的提问来源于stack exchange,提问作者ikebeau

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 03:59:59