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

如何在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值

根据需求选择以下两种方式之一:

  1. 生成独立的Amt投影列(值与Amt列完全一致):
# 生成12个Amt投影列(Amt1至Amt12)
for i in range(1, 13):
    DF[f'Amt{i}'] = DF['Amt']
  1. 将日期与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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 15:35:01