如何为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
相关产品推荐
相关产品推荐

