2016-11-22 9 views
1

Ich habe diese Art von Liste von Strings mit 9000 Zeilen, in denen jede Zeile Monat/Tag/Jahr:Monat, Tag, Jahr, Jahr umrechnen mit Python/Pandas?

10/30/2009 
12/19/2009 
4/13/2009 
8/18/2007 
7/17/2008 
6/16/2009 
1/14/2009 
12/18/2007 
9/14/2009 
2/13/2006 
3/25/2009 
2/23/2007 

ich es konvertieren möchten, und haben nur die Liste mit Monat/Jahr, wenn es möglich, als Datumsformat, wie folgt aus:

10/2009 
12/2009 
4/2009 
8/2007 
7/2008 
6/2009 
1/2009 
12/2007 
9/2009 
2/2006 
3/2009 
2/2007 
+0

Sie könnte es mit regex tun 're ('/.+/','/', '10/30/2009 ')' => ''10/2009'' – Richy

Antwort

2

ich glaube, Sie zuerst to_datetime und dann to_period verwenden können:

df.col = pd.to_datetime(df.col).dt.to_period('m') 
print (df) 
     col 
0 2009-10 
1 2009-12 
2 2009-04 
3 2007-08 
4 2008-07 
5 2009-06 
6 2009-01 
7 2007-12 
8 2009-09 
9 2006-02 
10 2009-03 
11 2007-02 

print (type(df.loc[0,'col'])) 
<class 'pandas._period.Period'> 

Oder strftime:

df.col = pd.to_datetime(df.col).dt.strftime('%m/%Y') 
print (df) 
     col 
0 10/2009 
1 12/2009 
2 04/2009 
3 08/2007 
4 07/2008 
5 06/2009 
6 01/2009 
7 12/2007 
8 09/2009 
9 02/2006 
10 03/2009 
11 02/2007 

print (type(df.loc[0,'col'])) 
<class 'str'> 

Oder replace von regex:

df.col = df.col.str.replace('/.+/','/') 
print (df) 
     col 
0 10/2009 
1 12/2009 
2 4/2009 
3 8/2007 
4 7/2008 
5 6/2009 
6 1/2009 
7 12/2007 
8 9/2009 
9 2/2006 
10 3/2009 
11 2/2007 

print (type(df.loc[0,'col'])) 
<class 'str'> 
+0

Danke, die beste Option und eleganter Meiner Meinung nach ist das erste, was du gesagt hast. @jezrael –

+0

Wenn ich das Mindestdatum (2007-02) und das Höchstdatum (2009-12) wissen möchte, wie kann ich es tun? –

+1

Verwenden Sie 'print (df.col.max())' und 'print (df.col.min())' – jezrael

1

können Sie str.split verwenden, um die Saiten zu bauen:

In [32]: 
df['date'] =df['date'].str.split('/').str[0] + '/' + df['date'].str.split('/').str[-1] 
df 

Out[32]: 
     date 
0 10/2009 
1 12/2009 
2 4/2009 
3 8/2007 
4 7/2008 
5 6/2009 
6 1/2009 
7 12/2007 
8 9/2009 
9 2/2006 
10 3/2009 
11 2/2007 
1

Oder Sie könnten einen regulären Ausdruck verwenden, wenn Sie diese Art bevorzugen der Lösung. Dies würde Ihr Problem lösen:

import re 

res = re.sub(r"/\d\d?/", "/", s) 

(Beachten Sie, dass s die Datumszeichenfolge ist, entweder als separate Datumszeichenfolgen oder eine lange Reihe alle Termine enthält, und dass Sie Ihr Ergebnis zu res gebunden haben.)