2016-05-29 168 views
1

我使用Jupyter Notebook,Pandas框架和Python作为编程语言。 我有一个数据帧,其形状如下(10500,4)。所以它有4列和10500条记录。 Initial_Date是4个列中的一个,它是一个Object数据类型。这是所含信息的类型:在Python中将Object数据类型的内容转换为Date数据类型

Initial_Date 
1971 
11969 
102006 
03051992 
00131954 
27001973 
45061987 
1996 

这是很容易辨认出列DDMMYYYY的格式(03051992是第3次1992年5月)

注:正如你可以看到有无效MM(00和13)和无效DD(00和45)。

我想使用正则表达式来提取任何可用的字段。我不知道如何分别阅读YYYY到MM或DD,所以请在这里给我启发。提取后,我想测试YYYY,DD和MM是否有效。如果其中任何一个都无效,则分配NaT否则为DD-MM-YYYY或DD/MM/YYYY(不要与最终格式混淆)。

例如: 051992因为这成为被视为无效DD/05/1992

具有完全8位数字,例如10081996被认为是有效1996年10月8日

PS的字段。我开始使用熊猫,Jupyter笔记本,并放慢了恢复我的Python技能。仅供参考如果你们认为有更好的方法将每个字段转换为有效的日期数据类型,那么请启发我。

回答

1

你能做到这样:

result = pd.to_datetime(d.Initial_Date.astype(str), dayfirst=True, errors='coerce') 

result.ix[result.isnull()] = pd.to_datetime(d.Initial_Date.astype(str), format='%d%m%Y', dayfirst=True, errors='coerce') 
#format is set to %d%m%Y 

结果:

In [88]: result 
Out[88]: 
0 1971-01-01 
1   NaT 
2 2006-10-20 
3 1992-03-05 
4 1954-01-03 
5   NaT 
6   NaT 
7 1996-01-01 
Name: Initial_Date, dtype: datetime64[ns] 

原DF

In [89]: d 
Out[89]: 
    Initial_Date 
0   1971 
1   11969 
2  102006 
3  3051992 
4  131954 
5  27001973 
6  45061987 
7   1996 
+0

非常感谢MaxU!对延迟答复抱歉。除了我需要将格式从%m%d%Y更改为%d%m%Y – Timetraveller

+0

@Timetraveller,我总是很乐意提供帮助!感谢您接受答案! – MaxU