2016-11-21 47 views
1

我知道类似的问题已经被问过一百万次了,但我实际上找不到这个特定的答案,这看起来应该是一个非常常见的情况在数据清理。将无衬垫的m/d/y格式的日期转换为python熊猫中的datetime

我有一列日期字符串没有填充和美国布局,所以2009年2月19日是2009年2月19日。

我想将它们转换为datetime在python大熊猫

这里的示例数据:

member state country   zip   joined . pet 
16081 NY  UNITED STATES 11215  9/4/09 . parrot 
21186 NY  UNITED STATES 5325  8/9/11 . crunchyfrog 
34999 NY  UNITED STATES 11218  11/4/16 lumberjack 
34999 NY  FOOBAR STATES NaN   11/4/16 blind bat 
5033 NY  UNITED STATES 11238-1630 11/7/16 norwegianblue 
35079 NY  FOOBAR STATES SW4 9JX  11/13/16 . spanishinq 
35084 NY  UNITED STATES 11217-2181 11/14/16 . spam 

我最新的尝试是

for x in df['joined']: 
    x = dt.strptime(x, '%m/%d/%Y') 

其中回来“实时数据“2/16/09'与格式'%m /%d /%Y'不匹配“

回答

3

尝试to_datetime

df.joined = pd.to_datetime(df.joined) 
print (df) 
    member state  country   zip  joined   pet 
0 16081 NY UNITED STATES  11215 2009-09-04   parrot 
1 21186 NY UNITED STATES  5325 2011-08-09 crunchyfrog 
2 34999 NY UNITED STATES  11218 2016-11-04  lumberjack 
3 34999 NY FOOBAR STATES   NaN 2016-11-04  blind bat 
4 5033 NY UNITED STATES 11238-1630 2016-11-07 norwegianblue 
5 35079 NY FOOBAR STATES  SW4 9JX 2016-11-13  panishinq 
6 35084 NY UNITED STATES 11217-2181 2016-11-14   spam 

还可以指定format如果必要的话:

df.joined = pd.to_datetime(df.joined, format='%m/%d/%y') 
print (df) 
    member state  country   zip  joined   pet 
0 16081 NY UNITED STATES  11215 2009-09-04   parrot 
1 21186 NY UNITED STATES  5325 2011-08-09 crunchyfrog 
2 34999 NY UNITED STATES  11218 2016-11-04  lumberjack 
3 34999 NY FOOBAR STATES   NaN 2016-11-04  blind bat 
4 5033 NY UNITED STATES 11238-1630 2016-11-07 norwegianblue 
5 35079 NY FOOBAR STATES  SW4 9JX 2016-11-13  panishinq 
6 35084 NY UNITED STATES 11217-2181 2016-11-14   spam 
+0

我认为有资本会给我的四位数字输出(我现在觉得太愚蠢,以至于不敢问)。谢谢! – ajbentley

+0

您需要将转换的日期时间分配回数据框? – jezrael

+0

这给了我一个这些列表:'numpy.datetime64('2002-07-17T00:00:00.000000000'),我想我现在转换为一种格式,看起来更接近我开始,但被确认为日期。 – ajbentley

1

“实时数据 '09年2月16日' 不符合格式 '%M /%d Y /%'”

由于您使用%Y代替%y

%y - Year without century as a zero-padded decimal number. 
%Y - Year with century as a decimal number. 
+0

我以为有资本会给我输出中的四位数字(现在我觉得这太愚蠢了)。谢谢! – ajbentley

+0

不幸的是,改为更低的.case仍然留下了字符串。 – ajbentley

2

您的错误是由以下事实引起的,%Y是针对yyyy表示而不是yy。尝试使用:

dt.strptime(x, '%m/%d/%y') 

最简单的方式将其应用到整个列是使用的应用功能:

df.joined = df.joined.apply(lambda x: dt.strptime(x, '%m/%d/%y')) 
+0

我以为有资本会给我输出中的四位数(现在我觉得这太愚蠢了)。谢谢! – ajbentley

+0

在这之后,他们实际上仍然是字符串。 – ajbentley

+0

这应该做的伎俩,虽然jezreal已经给出了一个工作答案,我想:) – Skirrebattie