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

如何为Polars DataFrame日期列设置多级索引并导出指定格式Excel

Polars DataFrame设置日期多级索引并导出Excel

针对你的需求,这里提供两种可行方案,核心思路是先将日期列拆解为多级层级,再导出为带多级表头的Excel文件:

方法一:Polars预处理后转Pandas导出

先通过Polars完成宽表转窄表、日期解析的操作,再转回宽表后交给Pandas处理多级列导出:

import polars as pl
import pandas as pd

# 原始Polars DataFrame
df = pl.from_repr("""
┌───────┬────────────┬────────────┬────────────┬────────────┬────────────┐
│ Users ┆ 2021-04-27 ┆ 2021-04-28 ┆ 2021-04-29 ┆ 2021-04-30 ┆ 2021-03-01 │
│ ---   ┆ ---        ┆ ---        ┆ ---        ┆ ---        ┆ ---        │
│ str   ┆ i64        ┆ i64        ┆ i64        ┆ i64        ┆ i64        │
╞═══════╪════════════╪════════════╪════════════╪════════════╪════════════╡
│ A     ┆ 2          ┆ 2          ┆ 5          ┆ 6          ┆ 1          │
└───────┴────────────┴────────────┴────────────┴────────────┴────────────┘
""")

# 1. 宽表转窄表,提取日期和对应数值
melted_df = df.melt(id_vars="Users", variable_name="Date", value_name="Value")

# 2. 解析日期,拆分出年、月、日层级
processed_df = melted_df.with_columns(
    pl.col("Date").str.to_date().alias("Date"),
    pl.col("Date").str.to_date().dt.year().alias("Year"),
    pl.col("Date").str.to_date().dt.month().alias("Month"),
    pl.col("Date").str.to_date().dt.day().alias("Day")
)

# 3. 转回宽表,以年、月、日作为列的多级维度
wide_df = processed_df.pivot(
    index="Users",
    columns=["Year", "Month", "Day"],
    values="Value"
)

# 4. 转Pandas后导出Excel,自动生成多级表头
wide_df.to_pandas().to_excel("output_polars.xlsx", index=False)

方法二:直接转Pandas用MultiIndex处理

如果你习惯用Pandas的MultiIndex机制,可以直接将Polars DataFrame转为Pandas后操作:

import polars as pl
import pandas as pd

df = pl.from_repr("""
┌───────┬────────────┬────────────┬────────────┬────────────┬────────────┐
│ Users ┆ 2021-04-27 ┆ 2021-04-28 ┆ 2021-04-29 ┆ 2021-04-30 ┆ 2021-03-01 │
│ ---   ┆ ---        ┆ ---        ┆ ---        ┆ ---        ┆ ---        │
│ str   ┆ i64        ┆ i64        ┆ i64        ┆ i64        ┆ i64        │
╞═══════╪════════════╪════════════╪════════════╪════════════╪════════════╡
│ A     ┆ 2          ┆ 2          ┆ 5          ┆ 6          ┆ 1          │
└───────┴────────────┴────────────┴────────────┴────────────┴────────────┘
""")

# 转成Pandas DataFrame
pd_df = df.to_pandas()

# 提取所有日期列,排除Users
date_cols = [col for col in pd_df.columns if col != "Users"]

# 为每个日期列生成多级索引元组(这里用年、月、日三级)
multi_col_tuples = []
for col in date_cols:
    dt = pd.to_datetime(col)
    multi_col_tuples.append((dt.year, dt.month, dt.day))

# 构建多级列名,Users列单独处理
new_columns = [("Users", "", "")] + multi_col_tuples
pd_df.columns = pd.MultiIndex.from_tuples(
    new_columns,
    names=["Year", "Month", "Day"]
)

# 导出Excel,开启merge_cells可以自动合并相同层级的单元格
pd_df.to_excel("output_pandas.xlsx", merge_cells=True, index=False)

说明

  • 两种方法都能生成带多级表头的Excel文件,你可以根据自己的习惯选择;
  • 如果需要调整多级索引的层级(比如合并年和月为YYYY-MM作为一级),只需要修改日期解析时的字段即可,比如用dt.strftime("%Y-%m")生成年月字符串;
  • Polars目前对多级列的Excel原生导出支持有限,转Pandas处理是更稳妥的方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 09:15:17