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

如何将按年/月排列的Pandas DataFrame转为含Date与Value列的格式

高效转换年/月维度DataFrame为日期-数值格式

假设你的原始DataFrame结构如下(Year为年份列,12个月份作为列名存储对应数值):

YearJanFebMar...Dec
19142.01.03.5...2.8

以下是两种无需循环的高效实现方式:

方法一:使用pd.melt重塑数据

melt是Pandas专门用于宽表转长表的工具,配合日期转换可以快速得到目标格式:

import pandas as pd

# 1. 重塑宽表为长表,保留Year作为标识列
melted = original_df.melt(id_vars="Year", var_name="Month", value_name="Value")

# 2. 合并年份与月份生成日期列,并格式化指定样式
melted["Date"] = pd.to_datetime(
    melted["Year"].astype(str) + "-" + melted["Month"],
    format="%Y-%b"  # %b对应月份缩写(如Jan/Feb),如果月份是数字则用%Y-%m
).dt.strftime("%d-%b-%Y")

# 3. 整理列顺序并重置索引
result = melted[["Date", "Value"]].reset_index(drop=True)

方法二:基于stack处理多索引

如果你已经尝试过stack,可以通过以下步骤处理多索引生成日期:

import pandas as pd

# 1. 将Year设为索引,堆叠月份列得到多索引Series
stacked = original_df.set_index("Year").stack()

# 2. 重置索引并命名列
stacked = stacked.reset_index()
stacked.columns = ["Year", "Month", "Value"]

# 3. 生成并格式化日期列,逻辑同方法一
stacked["Date"] = pd.to_datetime(
    stacked["Year"].astype(str) + "-" + stacked["Month"],
    format="%Y-%b"
).dt.strftime("%d-%b-%Y")

# 4. 整理结果
result = stacked[["Date", "Value"]].reset_index(drop=True)

注意事项

  • 如果原始DataFrame中的月份列是数字(如"1"、"2"而非"Jan"、"Feb"),只需将format参数改为%Y-%m,strftime会自动将数字月份转换为缩写格式。
  • 两种方法均为Pandas矢量化操作,处理大规模数据的效率远高于循环遍历。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 15:03:17