2016-08-24 6 views
1

Ich habe einen Datenrahmen, die eine Spalte enthält, die hält:in Pandas Datumsformat konvertieren

Date: 
31062005 
072005 
12005 
2012 

Ich möchte diese Daten in das Format konvertieren:

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

Was die einfachste Weg ist, um dies zu tun? Die Felder haben noch kein Datumsformat, nur Zeichenfolgen.

+0

Ist das eine echte Säule, oder ist es ein ein aus? Was Sie fragen, erfordert eine sehr einfache, aber komplizierte Methode. Was hast du bisher gemacht, um deine Frage zu beantworten? – Kartik

+0

Ich versuchte diese Lösung [link] (http://stackoverflow.com/a/32829038/6685708), aber in diesem Fall fehlen Daten und Monate, wo ich ein Problem habe, das richtige Regex formulierend. – Ramprasath

+0

Ja, das ist, weil die Antwort in dem Link alle drei Teile, Datum, Monat und Jahr hat. In Ihrem Fall sind sie nicht konsistent. Aber sie haben alle "", also habe ich vielleicht eine Idee. Ich werde es versuchen und eine Antwort posten ... – Kartik

Antwort

1

dass Sie eine Funktion

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] 

Dann schreiben, wenn Ihre Reisedaten in df.dates sind, Sie

>>> df.dates.apply(convert_date)         
0 31/06/2 
1 07/2005 
2 01/2005 
3  2012 
Name: dates, dtype: object 

Beachten Sie, dass diese wandelt eine Zeichenkette in einer Form in einer Zeichenkette in einer anderen Form verwenden können, Das heißt, du kannst Daten nicht wirklich weiter manipulieren. Wenn Sie das tun möchten, würde ich vorschlagen, dass Sie die vorhergehende Funktion ändern, um das entsprechende datetime.datetime.strptime für das Format zu verwenden, das der Länge der Zeichenfolge entspricht. Es könnte wie folgt aussehen:

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') 

Beachten Sie, dass Ihr erster Tag (mit den 31 Tagen) illegal scheint, though.

+0

Danke eine Tonne. Eine kleine Änderung in der elif Struktur machte es perfekt. 'def convert_date (s): wenn len (s) == 4: zurückgeben elif len (s) <7: zurück s [: -4] .zfill (2) +'/'+ s [- 4:] sonst: Rückgabe s [: -6] .zfill (2) + '/' + s [-6: -4] .zfill (2) + '/' + s [-4:] ' – Ramprasath

+0

Danke, @rpkar - aktualisiert. Da Sie der Site neu erscheinen, beachten Sie, dass Sie alle Antworten (mehr als eine), die Sie hilfreich finden, upvoten können. –

2

hier:

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') 
Verwandte Themen