如何在Pandas中按频率给日期列递推生成12个月投影列
解决方案
步骤1:数据预处理与Amt列计算
先把date列转换为datetime类型(原始数据是日/月/年格式,需指定dayfirst=True),再计算Amt列(qty * price):
import pandas as pd # 构造原始DataFrame data = { 'ID': [1,1,2,2,3], 'name': ['abc','abc','def','def','ghi'], 'qty': [20,10,10,40,322], 'price': [3,5,7,2,7], 'date': ['17/01/2022','18/03/2022','24/01/2022','25/05/2022','4/5/2022'], 'Freq': [4,3,1,6,12] } DF = pd.DataFrame(data) # 转换date列为datetime类型 DF['date'] = pd.to_datetime(DF['date'], dayfirst=True) # 计算Amt列 DF['Amt'] = DF['qty'] * DF['price']
步骤2:生成12个投影日期列
通过循环批量生成12个递推日期列,每列对应date加上i * Freq个月(i从1到12),避免逐行apply的低效操作:
# 生成12个投影日期列(Col1至Col12) for i in range(1, 13): DF[f'Col{i}'] = DF['date'] + pd.offsets.DateOffset(months=DF['Freq'] * i)
步骤3:在投影列中显示Amt值
根据需求选择以下两种方式之一:
- 生成独立的Amt投影列(值与Amt列完全一致):
# 生成12个Amt投影列(Amt1至Amt12) for i in range(1, 13): DF[f'Amt{i}'] = DF['Amt']
- 将日期与Amt合并到同一列(格式为“日期: Amt”):
# 合并日期和Amt到投影列 for i in range(1, 13): DF[f'Col{i}'] = DF[f'Col{i}'].dt.strftime('%d/%m/%Y') + ': ' + DF['Amt'].astype(str)
最终效果示例
处理后的DataFrame前几行如下(以独立日期列和Amt列为例):
ID name qty price date Freq Amt Col1 Col2 Col3 ... Amt9 Amt10 Amt11 Amt12 0 1 abc 20 3 2022-01-17 4 60 2022-05-17 2022-09-17 2023-01-17 ... 60 60 60 60 1 1 abc 10 5 2022-03-18 3 50 2022-06-18 2022-09-18 2022-12-18 ... 50 50 50 50 2 2 def 10 7 2022-01-24 1 70 2022-02-24 2022-03-24 2022-04-24 ... 70 70 70 70
内容的提问来源于stack exchange,提问作者arawind73
相关产品推荐
相关产品推荐

