попробуйте это .. не используя, если еще, но служит цели ..
Данные
excl_flag segment vardate obsdate
0 0 CC_620 2/29/2008 3/31/2008
1 1 CC_cur_It_660 2/28/2009 3/31/2009
2 0 ignore 2/28/2010 3/31/2010
3 0 CC_620 2/28/2011 3/31/2011
4 1 ignore 2/29/2012 3/31/2012
5 0 CC_620 2/28/2013 3/31/2013
6 1 CC_cur_It_660 2/28/2014 3/31/2014
7 0 CC_620 2/28/2015 3/31/2015
8 1 CC_cur_It_660 2/29/2016 3/31/2016
9 0 ignore 2/28/2017 3/31/2017
необходимый импорт
from datetime import datetime
import pandas as pd
, охватывающий формат даты к дате..
data['vardate'] = pd.to_datetime(data['vardate']).apply(lambda x: x.date())
data['obsdate'] = pd.to_datetime(data['obsdate']).apply(lambda x: x.date())
data['recession'] = 0
data['recovery'] = 0
при выполнении условий
data[((data['excl_flag'] == 0) & (data['segment'] != 'ignore'))].loc[(data['vardate']- datetime.strptime('2008-06-30',"%Y-%m-%d").date()).apply(lambda x: x.days < 0 ) & ((data['vardate'] - datetime.strptime('31Mar2010',"%d%b%Y").date()).apply(lambda x: x.days >=0)), 'recession'] = 1
data[((data['excl_flag'] == 0) & (data['segment'] != 'ignore'))].loc[(data['vardate']- datetime.strptime('31Mar2010',"%d%b%Y").date()).apply(lambda x: x.days < 0 ) & ((data['vardate'] - datetime.strptime('30Sep2013',"%d%b%Y").date()).apply(lambda x: x.days >=0)), 'recovery'] = 1
print(data)
ваши результаты равны нулю, поскольку указанное вами условие не находит получателей
excl_flag segment vardate obsdate recession recovery
0 0 CC_620 2008-02-29 2008-03-31 0 0
1 1 CC_cur_It_660 2009-02-28 2009-03-31 0 0
2 0 ignore 2010-02-28 2010-03-31 0 0
3 0 CC_620 2011-02-28 2011-03-31 0 0
4 1 ignore 2012-02-29 2012-03-31 0 0
5 0 CC_620 2013-02-28 2013-03-31 0 0
6 1 CC_cur_It_660 2014-02-28 2014-03-31 0 0
7 0 CC_620 2015-02-28 2015-03-31 0 0
8 1 CC_cur_It_660 2016-02-29 2016-03-31 0 0
9 0 ignore 2017-02-28 2017-03-31 0 0