首页 > 解决方案 > 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'

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

标签: python-3.xpandas

解决方案


对我来说,to_datetime使用类似于%I12H 格式的 select hours 的格式,如果某些值不匹配,也会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.strftime格式Series.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

推荐阅读