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

问题描述 投票:1回答:1

正如标题所建议的,我要从日期中减去因数,直到该日期小于另一个日期为止。

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')

在上述数据框中,我将从“ 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)
python pandas timedelta
1个回答
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
© www.soinside.com 2019 - 2024. All rights reserved.