如何用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-01 | 2024-05-05 | 12 | ["2024-05-01", "2024-05-02", "2024-05-03", "2024-05-04", "2024-05-05"] |
| 2023-12-30 | 2024-01-01 | 10 | ["2023-12-30", "2023-12-31", "2024-01-01"] |
步骤3:展开数组列为多行
使用explode方法将「促销日期」列的数组展开为多行:
df_exploded = df_with_dates.explode("促销日期")
展开后的结果:
| 促销开始日期 | 促销结束日期 | 价格 | 促销日期 |
|---|---|---|---|
| 2024-05-01 | 2024-05-05 | 12 | "2024-05-01" |
| 2024-05-01 | 2024-05-05 | 12 | "2024-05-02" |
| 2024-05-01 | 2024-05-05 | 12 | "2024-05-03" |
| 2024-05-01 | 2024-05-05 | 12 | "2024-05-04" |
| 2024-05-01 | 2024-05-05 | 12 | "2024-05-05" |
| 2023-12-30 | 2024-01-01 | 10 | "2023-12-30" |
| 2023-12-30 | 2024-01-01 | 10 | "2023-12-31" |
| 2023-12-30 | 2024-01-01 | 10 | "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
相关产品推荐
相关产品推荐

