2016-08-24 2 views
1

У меня есть dataframe, который содержит столбец, который держит:Преобразование в формат даты в панд

Date: 
31062005 
072005 
12005 
2012 

Я хотел бы преобразовать эти даты в формате:

Date: 
31/06/2005 
07/2005 
01/2005 
2012 

Что такое самый простой способ сделать это? Поля еще не в формате даты, только строки.

+0

Это реальный столбец, или это сделано на один? То, что вы просите, требует очень простого, но запутанного метода. Что вы сделали до сих пор, чтобы решить свой вопрос? – Kartik

+0

Я пробовал это решение [link] (http://stackoverflow.com/a/32829038/6685708), но в этом случае отсутствуют даты и месяцы, когда у меня возникла проблема с формулировкой правильного регулярного выражения. – Ramprasath

+0

Да, это потому, что ответ в ссылке содержит все три части: дату, месяц и год. В вашем случае они несовместимы. Но у всех их есть ''/'', поэтому, возможно, у меня есть идея. Я попробую и отправлю ответ ... – Kartik

ответ

1

Предположим, вы пишете функцию

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 днем) кажется незаконным.

+0

Спасибо тонну. Небольшое изменение в структуре elif сделало его идеальным. 'def convert_date (s): if len (s) == 4: return s 10 elif len (s) <7: return s [: -4] .zfill (2) +'/'+ s [- 4:] else: return s [: -6] .zfill (2) + '/' + s [-6: -4] .zfill (2) + '/' + s [-4:] ' – Ramprasath

+0

Спасибо, @rpkar - обновлено. Поскольку вы, похоже, не знакомы с сайтом, обратите внимание, что вы можете перенаправить все ответы (более одного), которые вы найдете полезными. –

2

Здесь:

df = pd.DataFrame(['30/06/2005', '07/2005', '1/2005', '2012'], columns=['Date']) 

temp = pd.DataFrame(df['Date'].str.split('/').apply(reversed).tolist())\ 
    .fillna('01') 
df['Date'] = pd.to_datetime(temp[0].str.cat(temp[1].str.zfill(2))\ 
          .str.cat(temp[2].str.zfill(2)), format='%Y%m%d') 
Смежные вопросы