Pandas:按因子减去日期,直到大于另一个日期

Pandas: Subtract Date by factor until greater than another date

如标题所示,我想从日期中减去因子,直到日期刚好小于另一个日期。

op_d = {'ADate':[20200301,20200301,20200301,20200301,20200301,20200301],
        'MDate':[20520801,20531001,20550405,20540701,20540910,20510701] ,
        'EDate':[20200201,20200201,20200205,20200101,20190910,20200401] ,
        'Frequency':[2,4,2,6,12,1]}
df = pd.DataFrame(data=op_d)
df['MDate'] = pd.to_datetime(df['MDate'], format='%Y%m%d')
df['ADate'] = pd.to_datetime(df['ADate'], format='%Y%m%d')
df['EDate'] = pd.to_datetime(df['EDate'], format='%Y%m%d')

在上面的数据框中,我将月数 ('Frequency') 从 'MDate' 减少到刚好少于 'ADate'。预期输出存储在 'EDate' 字段中。

我的想法是取 'Mdate' 和 'ADate' 之间的月差,然后除以频率并从 'ADate' 中去除余数,这是一个漫长的过程。

df['tempDate'] = df.apply(lambda x: x['MDate'] - pd.DateOffset(months = x['Frequency'])  , axis=1)

以上代码只减去一次频率。有没有办法在每一行或类似的东西的 while 循环中 运行 这个? 即

df['tempDate'] = df.apply(lambda x: x['MDate'] - pd.DateOffset(months = x['Frequency'])  if df['tempDate'] < ['ADate'] , axis=1)

你可以编写一个函数,然后应用:

def reduce(row):
    a,m,f = row[['ADate','MDate','Frequency']]
    offset = pd.DateOffset(months=f)
    while m > a: m -= offset
    return m

df['EDate'] = df.apply(reduce, axis=1)

输出:

       ADate      MDate      EDate  Frequency
0 2020-03-01 2052-08-01 2020-02-01          2
1 2020-03-01 2053-10-01 2020-02-01          4
2 2020-03-01 2055-04-05 2020-02-05          2
3 2020-03-01 2054-07-01 2020-01-01          6
4 2020-03-01 2054-09-10 2019-09-10         12
5 2020-03-01 2051-07-01 2020-03-01          1