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'
如何重写此代码以获得所需的输出?
解决方案
对我来说,to_datetime
使用类似于%I
12H 格式的 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
推荐阅读
- javascript - jQuery复选框选择所有不适用于Chrome
- javascript - 如果条件已验证 angularjs,如何添加 ng-dbclick?
- javascript - 如何在定义符号之前避免 javascript 解析?
- java - 实例化休眠配置引发错误:线程“主”java.lang.NoClassDefFoundError 中的异常:javax/xml/bind/JAXBException
- mongodb - Kubuntu:访问 mongodb?
- android - 需要帮助使用 ConstraintLayout 进行设计
- python - 用pymongo比较不同集合的MongoDB文档
- c# - C# WPF 适合应用程序,具体取决于在监视器之间移动后最大化/最小化后的监视器大小
- javascript - 如何在 Ruby on Rails 中测试 JS 私有方法而不更改任何代码
- mysql - 无法使用 PlanetHoster 服务器连接到 Sails 中的 MySQL