Pandas to_datetime()格式转换报错、AM/PM识别及去零问题咨询
Pandas时间格式转换问题解决方案
1. 报错原因修正
你遇到的ValueError: 's' is a bad directive报错是因为格式符使用错误,核心错误点如下:
- 秒的格式符为大写
%S,小写%s是UNIX时间戳标识,不属于Python strptime支持的时间格式指令 - 分钟的格式符为大写
%M,你误用了代表月份数字的%m - 原时间串的月份为英文缩写(如
AUG),需要用%b匹配,不能用%m - 原时间串尾部的纳秒序列需要用
%f匹配,无需提前处理也可完成转换
正确的转换代码示例:
import pandas as pd # 输入时间字符串 time_str = "03-AUG-20 02.55.32.000000000 AM" # 按输入格式完成时间类型转换 dt = pd.to_datetime(time_str, format="%d-%b-%y %I.%M.%S.%f %p") # 转换为你需要的 日-月-年 时(24):分:秒 格式 result = dt.strftime("%d-%m-%Y %H:%M:%S")
执行后result的输出为03-08-2020 02:55:32,符合预期格式。
2. 正则去除尾部多余零的方法
如果你需要提前剔除时间字符串尾部的纳秒零,可用如下正则表达式实现:
- 匹配规则:
r'\.\d+(?=\s+[AP]M)',作用是匹配AM/PM前所有小数点开头的数字序列 - 代码示例:
import re processed_str = re.sub(r'\.\d+(?=\s+[AP]M)', '', time_str) # 处理后得到字符串:03-AUG-20 02.55.32 AM
处理后转换时间时,可将格式串中的.%f移除,改为format="%d-%b-%y %I.%M.%S %p"即可。
内容的提问来源于stack exchange,提问作者Saurus
相关产品推荐
相关产品推荐

