How about:
import numpy as np
import pandas as pd
def numpy_date_add(vd_array,y_array):
ar=((vd_array.astype('M8[Y]') + np.timedelta64(1, 'Y') * \
y_array).astype('M8[M]')+ \
(vd_array.astype('M8[M]')- \
vd_array.astype('M8[Y]'))).astype('M8[D]')+ \
(vd_array.astype('M8[D]')-\
vd_array.astype('M8[M]'))
return ar
# usage
valDate=pd.datetime(2016,12,31)
per=[[0,3,'0-3Yr'],
[3,7,'3-7Yrs'],
[7,10,'7-10Yrs'],
[10,15,'10-15Yrs'],
[15,20,'15-20Yrs'],
[20,30,'20-30Yrs'],
[30,40,'30-40Yrs'],
[40,200,'> 40Yrs']]
pert=pd.DataFrame(per,columns=['start_period','end_period','mat_band'])
pert['valDate']=valDate
pert['startdate'] = numpy_date_add(pert.valDate.values,pert.start_period.values)
pert['enddate'] = numpy_date_add(pert.valDate.values,pert.end_period.values)
print(pert)
Is vector based pandas usage and I think it deals with leap years.