#python #pandas #numpy #datetime
#python #панды #numpy #дата и время
Вопрос:
df = pd.DataFrame({'text':['20201010', '200910', '2015','20']})
df['date'] = np.where(df.date.str.len() == 8, #format = '%Y%m%d',
np.where(df.date.str.len() == 6, #format = '%y%m%d'
np.where(df.date.str.len() == 4, #format = '%Y',None
Я не знаю, как написать код. Я хочу сделать это так.
df['text'] df['date']
20201010 => 2020-10-10 00:00:00
200910 => 2020-09-10 00:00:00
2015 => 2015-01-01 00:00:00
20 => None
Ответ №1:
На мой взгляд, здесь не требуется длина теста, вы можете протестировать форматы с errors='coerce'
помощью отсутствующих значений, если не удалось, последние форматы объединения по Series.fillna
или Series.combine_first
:
f1 = pd.to_datetime(df['text'], format = '%Y%m%d', errors='coerce')
f2 = pd.to_datetime(df['text'], format = '%y%m%d', errors='coerce')
f3 = pd.to_datetime(df['text'], format = '%Y', errors='coerce')
df['date'] = f1.fillna(f2).fillna(f3)
#alternative
#df['date'] = f1.combine_first(f2).combine_first(f3)
print (df)
text date
0 20201010 2020-10-10
1 200910 2020-09-10
2 2015 2020-01-05
3 20 NaT