我有一个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'
如何重写此代码以获得所需的输出?
答案 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.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