如何将代表月份日期的31列转换为单个datetime列?
宽表转窄表(逆透视)的实现方案
你需要完成的是**逆透视(Unpivot)**操作,把原表中代表1-31日的31列,转换成Date(日期)和Quantity(销量)两列,以下是几种常用工具的具体实现方法:
1. Excel 可视化操作步骤
- 选中整个数据区域(包含表头)
- 点击「数据」选项卡 → 「从表格/区域」(Excel 2016及以上版本可用),勾选「我的表格有标题」后进入Power Query编辑器
- 选中
Store和Product两列,点击「转换」选项卡 → 「逆透视列」→ 「逆透视其他列」 - 此时会生成
Attribute(原日期列名)和Value两列,将它们重命名为Date和Quantity - 添加自定义列,输入公式
= Date.FromText("2022/02/" & [Date]),再把该列格式设置为dd/mm/yyyy - 点击「关闭并上载」,即可得到目标格式的表格
2. Python Pandas 代码实现
import pandas as pd # 读取原始数据(根据实际存储格式调整,比如Excel用pd.read_excel) df = pd.read_csv("Febuary_Sells.csv") # 执行逆透视,保留Store和Product列,将日期列转为行 unpivoted_df = pd.melt( df, id_vars=["Store", "Product"], var_name="Day", value_name="Quantity" ) # 生成完整日期并转换为指定格式 unpivoted_df["Date"] = pd.to_datetime( "2022-02-" + unpivoted_df["Day"], format="%Y-%m-%d" ).dt.strftime("%d/%m/%Y") # 整理列顺序并删除冗余列 final_df = unpivoted_df[["Store", "Product", "Date", "Quantity"]] # 输出结果或保存文件 print(final_df.head()) final_df.to_csv("Febuary_Sells_transformed.csv", index=False)
3. SQL 实现(以MySQL为例)
如果数据存储在数据库中,可通过UNION ALL拼接每日数据:
SELECT Store, Product, '01/02/2022' AS Date, `1` AS Quantity FROM Febuary_Sells UNION ALL SELECT Store, Product, '02/02/2022' AS Date, `2` AS Quantity FROM Febuary_Sells UNION ALL SELECT Store, Product, '03/02/2022' AS Date, `3` AS Quantity FROM Febuary_Sells -- 依次重复编写到31日的查询 UNION ALL SELECT Store, Product, '31/02/2022' AS Date, `31` AS Quantity FROM Febuary_Sells ORDER BY Store, Product, Date;
注:若使用SQL Server,可通过FORMAT(DATEFROMPARTS(2022,2,1), 'dd/MM/yyyy')生成日期,避免硬编码字符串。
内容的提问来源于stack exchange,提问作者fgu1lherme
相关产品推荐
相关产品推荐

