熊猫-转换乱序字符串的日期时间

时间:2020-03-15 16:42:19

标签: python-3.x pandas

我有一个DataFrame列,其中包含日期/时间(输入数据)的字符串值。我需要将其转换为半时间戳格式(所需的输出数据)。有些行是空白的,需要保持空白。我将引号用于说明目的。我正在使用strptime,但收到错误消息(见下文)。

输入数据(字符串):

Mar 8 12:00 PM  2020
'                   '
Mar 8  1:00 PM  2020
Mar 8  6:00 PM  2020
Mar 9  8:00 AM  2020

所需的输出数据:

3/8/2020 12:00:00
'                '
3/8/2020 13:00:00
3/8/2020 18:00:00
3/9/2020 08:00:00

代码:

import datetime as dt
df['date'].apply(lambda x: dt.datetime.strptime(x, '%b %d %H:%M %p  %Y'))  

错误:

ValueError: time data '' does not match format '%b %d %H:%M %p %Y'

如何重写此代码以获得所需的输出?

1 个答案:

答案 0 :(得分:1)

对于我来说,to_datetime的格式类似于您的%I格式的12小时格式的小时,errors='coerce'也用于缺少值(NaT),如果某些值不匹配:

df['date'] = pd.to_datetime(df['date'], format='%b %d %I:%M %p  %Y', errors='coerce')
print (df)
                 date
0 2020-03-08 12:00:00
1                 NaT
2 2020-03-08 13:00:00
3 2020-03-08 18:00:00
4 2020-03-09 08:00:00

最后一种自定义格式将Series.dt.strftimeSeries.replace结合使用:

df['date'] = (pd.to_datetime(df['date'], format='%b %d %I:%M %p  %Y', errors='coerce')
                .dt.strftime('%m/%d/%y %H:%M:%S')
                .replace('NaT', ''))

print (df)
                date
0  03/08/20 12:00:00
1                   
2  03/08/20 13:00:00
3  03/08/20 18:00:00
4  03/09/20 08:00:00

或将多个语音替换为一个空格:

df['date'] = (pd.to_datetime(df['date'].replace('\s+', ' ', regex=True), format='%b %d %I:%M %p %Y', errors='coerce')
                .dt.strftime('%m/%d/%y %H:%M:%S')
                .replace('NaT', ''))

print (df)
                date
0  03/08/20 12:00:00
1                   
2  03/08/20 13:00:00
3  03/08/20 18:00:00
4  03/09/20 08:00:00