You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 12:27:45