Pandas如何将带日期的时间字符串转换为仅含时间的datetime格式值
问题核心
需要将"2022-03-01 1:01:42 AM"这类字符串处理为仅保留时:分:秒部分、可正常用于后续绘图的时间格式,现有方案存在自动附加当前日期、类型不兼容绘图的问题。
现有错误实现代码:
def time(): df['Time'] = df['TIME'].apply(lambda x: x.split(' ')[1]) df['Time'] = pd.to_datetime(df.Time, format = '%H:%M:%S', errors='ignore').dt.time
错误原因
- 字符串拆分逻辑错误:原始字符串用双空格分隔日期与时间、单空格分隔时间与AM/PM标识,按空格拆分后仅取下标1的内容会丢失AM/PM上下午标识,12小时制时间解析必然出错。
- 解析规则配置错误:
%H:%M:%S是24小时制时间的匹配格式,与原始字符串12小时制带AM/PM的结构不匹配;errors='ignore'参数会让解析失败的内容直接返回原始字符串,不会抛出异常提示问题。 - 类型选择错误:
.dt.time返回的原生Pythondatetime.time对象不兼容pandas、matplotlib的大部分时间序列处理、绘图逻辑,容易出现刻度错乱、排序异常的问题。
可行方案
不要手动拆分字符串,直接用pandas原生时间解析能力处理全量字符串,再统一归一化日期即可,最终结果保留datetime64类型,完全兼容绘图、时间计算等后续操作:
# 完整解析原始带日期、AM/PM的时间字符串,注意12小时制小时用%I匹配,AM/PM用%p匹配,日期和时间之间保留两个空格 df['Time'] = pd.to_datetime(df['TIME'], format='%Y-%m-%d %I:%M:%S %p') # 将所有记录的日期统一替换为同一个固定基准日期,仅保留时间差异,避免自动附加当前日期、跨天时间排序错误的问题 df['Time'] = df['Time'].apply(lambda x: x.replace(year=1900, month=1, day=1))
如果绘图时不需要显示统一的基准日期,只需要配置时间轴的显示格式即可,不需要修改底层存储的数据类型,以matplotlib为例:
import matplotlib.dates as mdates # 将X轴时间格式设置为仅显示时:分:秒 ax.xaxis.set_major_formatter(mdates.DateFormatter('%H:%M:%S'))
如果不需要做绘图、时间计算,仅需提取纯时间对象,直接修正解析规则即可,无需手动拆分字符串:
df['Time'] = pd.to_datetime(df['TIME'], format='%Y-%m-%d %I:%M:%S %p').dt.time
内容的提问来源于stack exchange,提问作者tozzy
相关产品推荐
相关产品推荐

