2016-11-22 62 views
1

我有這樣的9000行的字符串列表,其中每行是月/日/年:用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 

我想將它轉換,只與月/年的列表中,如果是有可能的日期格式,像這樣:

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

你可以用正則表達式're.sub('/。+ /','/','10/30/2009')'=> ''10/2009'' – Richy

回答

2

我覺得你可以先用to_datetime然後to_period

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

或者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'> 

或者replace通過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

謝謝,最好的選擇和更優雅在我看來,這是你說的第一個。 @jezrael –

+0

如果我想知道最低日期(2007-02)和最高日期(2009-12),我該怎麼做? –

+1

使用'print(df.col.max())'和'print(df.col.min())' – jezrael

1

您可以使用str.split構建字符串:

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

或者你可以使用正則表達式,如果你喜歡那種的解決方案。這將解決您的問題:

import re 

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

(需要注意的是s是日期字符串,既可以作爲獨立的日期字符串或包含所有日期的長字符串,你有你的結果必然res