如何在Python的Pandas DataFrame中为现有数据添加月份并沿用价格?
问题描述
原始Pandas DataFrame数据如下:
| 年份 | 价格 |
|---|---|
| 2017 | 200 |
| 2018 | 250 |
| 2019 | 300 |
需求:为每个年份生成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
相关产品推荐
相关产品推荐

