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

如何在Python的Pandas DataFrame中为现有数据添加月份并沿用价格?

问题描述

原始Pandas DataFrame数据如下:

年份价格
2017200
2018250
2019300

需求:为每个年份生成1-12月的月初日期(格式示例:2017/01/01),对应的价格沿用该年份的价格,最终得到每个月一行的DataFrame。

实现方案

以下提供两种可行的实现方法:

方法一:基于列表展开与字符串拼接

这种方法逻辑直观,适合快速生成指定格式的日期字符串:

import pandas as pd

# 构建原始DataFrame
df = pd.DataFrame({
    '年份': [2017, 2018, 2019],
    '价格': [200, 250, 300]
})

# 为每个年份生成1-12月的月份列表
df['月份'] = [list(range(1, 13)) for _ in range(len(df))]
# 将月份列表展开,每个月单独成一行
df = df.explode('月份')

# 拼接年份与月份,生成指定格式的日期字符串
df['年份'] = df.apply(lambda row: f"{row['年份']}/{row['月份']:02d}/01", axis=1)
# 移除临时的月份列并重置索引
df = df.drop('月份', axis=1).reset_index(drop=True)

# 查看结果
print(df.head())

关键步骤说明

  • 生成月份列表:为每一行的年份绑定包含1-12的列表,让单个年份行对应12个月份。
  • 展开行:explode方法将列表类型的列拆分为多行,此时每个年份会被拆分为12行,价格保持与原年份一致。
  • 格式化日期:通过字符串格式化将年份和月份拼接成YYYY/MM/DD格式,row['月份']:02d确保月份以两位数展示。

方法二:基于Pandas日期工具生成

如果后续需要对日期做运算,推荐使用这种方法,直接生成datetime类型后再格式化:

import pandas as pd

df = pd.DataFrame({
    '年份': [2017, 2018, 2019],
    '价格': [200, 250, 300]
})

# 定义函数,为单个年份生成全年月初日期序列
def get_monthly_dates(year):
    return pd.date_range(start=f"{year}-01-01", end=f"{year}-12-01", freq='MS')

# 为每个年份生成日期序列并展开
df['日期'] = df['年份'].apply(get_monthly_dates)
df = df.explode('日期')

# 将datetime类型格式化为指定字符串,替换原年份列
df['年份'] = df['日期'].dt.strftime('%Y/%m/%d')
# 清理临时列并重置索引
df = df.drop('日期', axis=1).reset_index(drop=True)

# 查看结果
print(df.head())

关键步骤说明

  • 生成日期序列:pd.date_range的freq='MS'参数指定生成每月第一天的日期,直接得到标准的datetime序列。
  • 展开与格式化:同样通过explode拆分日期序列,再用dt.strftime将datetime类型转为指定格式的字符串。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 17:42:16