如何将DataFrame的月份数值列转换为日期列并展开数据?
实现步骤
用pandas可以轻松完成这个格式转换,具体操作如下:
1. 构造初始DataFrame
先把你的数据转换成pandas DataFrame:
import pandas as pd df = pd.DataFrame({ "初始值": [100, 50], "发布日期": ["1/1/2024", "1/1/2025"], "第1月数值": [99, 40], "第2月数值": [94, 30], "第3月数值": [90, 10] })
2. 转换日期格式并转成长表结构
先把发布日期转为datetime类型,方便后续计算;再用melt函数把多列的月份数值转成单行列,同时提取每个月份的序号:
# 转换发布日期为datetime类型 df["发布日期"] = pd.to_datetime(df["发布日期"], format="%m/%d/%Y") # 转长表,保留初始值和发布日期作为标识 melted = df.melt(id_vars=["初始值", "发布日期"], var_name="月份标识", value_name="数值") # 从月份标识中提取数字(比如"第1月数值"提取1) melted["月份数"] = melted["月份标识"].str.extract(r"第(\d+)月").astype(int)
3. 生成目标日期并转回宽表
根据发布日期和月份数计算对应的具体日期,再用pivot_table转回宽表格式,缺失的位置填充为0:
# 计算目标日期:发布日期加上(月份数-1)个月,再转成MM/DD/YYYY格式 melted["目标日期"] = (melted["发布日期"] + pd.DateOffset(months=melted["月份数"]-1)).dt.strftime("%m/%d/%Y") # 转宽表,填充缺失值为0 result = melted.pivot_table( index=["初始值", "发布日期"], columns="目标日期", values="数值", fill_value=0 ).reset_index() # 把发布日期转回原字符串格式(可选) result["发布日期"] = result["发布日期"].dt.strftime("%m/%d/%Y")
4. 按日期排序列(可选)
如果需要列按日期顺序排列,可对日期列进行排序:
# 提取所有日期列并按时间排序 sorted_dates = sorted(result.columns[2:], key=lambda x: pd.to_datetime(x, format="%m/%d/%Y")) # 重新排列DataFrame的列 result = result[["初始值", "发布日期"] + sorted_dates]
运行完以上代码,得到的result就是你需要的结构。
内容的提问来源于stack exchange,提问作者rushi
相关产品推荐
相关产品推荐

