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

如何将代表月份日期的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 08:01:01