Предположим, вы пишете функцию
def convert_date(s):
if len(s) == 4:
return s
elif len(s) < 7:
return s[: -4].zfill(2) + '/' + s[-4: ]
else:
return s[: -6].zfill(2) + '/' + s[-6: -4].zfill(2) + '/' + s[-4]
Тогда, если ваши даты в df.dates
, вы можете использовать
>>> df.dates.apply(convert_date)
0 31/06/2
1 07/2005
2 01/2005
3 2012
Name: dates, dtype: object
Обратите внимание, что это преобразует строку в одной форме в строку в другой форме , что означает, что вы не можете манипулировать датами дальше. Если вы хотите это сделать, я предлагаю вам изменить предыдущую функцию, чтобы использовать соответствующий datetime.datetime.strptime
для формата, соответствующего длине строки. Это может выглядеть примерно так:
def convert_date(s):
if len(s) == 4:
return datetime.datetime.strptime('%Y')
elif len(s) < 8:
return datetime.datetime.strptime('%m%Y')
else:
return datetime.datetime.strptime('%d%m%Y')
Обратите внимание, что ваше первое свидание (с 31 днем) кажется незаконным.
Это реальный столбец, или это сделано на один? То, что вы просите, требует очень простого, но запутанного метода. Что вы сделали до сих пор, чтобы решить свой вопрос? – Kartik
Я пробовал это решение [link] (http://stackoverflow.com/a/32829038/6685708), но в этом случае отсутствуют даты и месяцы, когда у меня возникла проблема с формулировкой правильного регулярного выражения. – Ramprasath
Да, это потому, что ответ в ссылке содержит все три части: дату, месяц и год. В вашем случае они несовместимы. Но у всех их есть ''/'', поэтому, возможно, у меня есть идея. Я попробую и отправлю ответ ... – Kartik