Так как вы спрашивали об альтернативном подходе.вместо явного цикла в python и заполнения списка лучше использовать методы DataFrame напрямую.В вашем случае это будет
df['time'].apply(lambda x: x if len(x) != 5 else '2018-'+x)
Это может работать быстрее для некоторых наборов данных
РЕДАКТИРОВАТЬ Я фактически выполнил тест времени, используя случайный набор игрушечных данных с ~ 50%полных и неполных дат.Короче говоря, кажется, что для небольшого набора данных простое решение для цикла быстрее для большого набора данных, оба метода показывают одинаковую производительность:
# 1M examples
import random
import numpy as np
y = pd.Series(np.random.randint(0,2,1000000))
s = {0:'2015-07-08', 1:'05-11'}
y = y.map(s)
%%timeit -n100
_ = y.apply(lambda x: x if len(x) != 5 else '2018-'+x)
>>> 275 ms ± 6.42 ms per loop (mean ± std. dev. of 7 runs, 100 loops each)
%%timeit -n100
con_time = []
for i in y:
if len(i)==5:
time = '2018-'+i
con_time.append(time)
else:
con_time.append(i)
con_time_a = np.array(con_time)
>>> 289 ms ± 5.23 ms per loop (mean ± std. dev. of 7 runs, 100 loops each)
# 1K examples
import random
import numpy as np
y = pd.Series(np.random.randint(0,2,1000))
s = {0:'2015-07-08', 1:'05-11'}
y = y.map(s)
%%timeit -n100
_ = y.apply(lambda x: x if len(x) != 5 else '2018-'+x)
>>> 431 µs ± 70.3 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
%%timeit -n100
con_time = []
for i in y:
if len(i)==5:
time = '2018-'+i
con_time.append(time)
else:
con_time.append(i)
con_time_a = np.array(con_time)
>>> 289 µs ± 40.4 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)