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
如标题所示,我想从日期中减去因子,直到日期刚好小于另一个日期。
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