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

将DataFrame中object类型纯时间列转为datetime类型遇问题求助

问题与解决方案

问题背景

我尝试将DataFrame的df['start_time_time']列从object类型转换为datetime类型。该列是从df['start_time']列中提取出的纯时间数据,示例如下:

start_timestart_time_time
2019-01-01 00:04:3700:04:37
2019-01-01 00:14:5200:14:52

先后尝试了两种方法:

  • 执行pd.to_datetime(df['start_time_time'], format='%H:%M:%S').dt.time,转换后数据类型仍为object。
  • 执行pd.to_datetime(df['start_time_time'], format='%H:%M:%S'),成功转为datetime64类型,但结果附带默认日期1900-01-01,示例如下:
start_timestart_time_time
2019-01-01 00:04:371900-01-01 00:04:37
2019-01-01 00:14:521900-01-01 00:14:52

疑问:datetime格式必须包含日期吗?如何忽略日期,仅按时间对行进行排序?


解答

1. datetime格式是否必须包含日期?

是的,Pandas中的datetime64类型本质是日期+时间的组合,无法单独存储纯时间信息。当仅传入时间字符串时,Pandas会自动补充默认日期(通常为1900-01-01)来构建完整的datetime对象。

而通过.dt.time提取的time对象属于Python标准库的datetime.time类型,Pandas会将其存储为object类型,因为它不属于Pandas原生的数值/时间序列类型。

2. 按纯时间排序的可行方案

核心需求是按时间排序,无需纠结是否为datetime类型,以下三种方案均可:

方案一:直接使用datetime64类型排序

虽然带有默认日期,但所有行的日期一致,排序时只会比较时间部分,完全不影响结果:

df = df.sort_values(by='start_time_time')

方案二:转换为Timedelta类型

将纯时间字符串转换为timedelta64类型(代表从00:00:00开始的时间差),该类型支持排序:

df['start_time_time'] = pd.to_timedelta(df['start_time_time'])
# 执行排序
df = df.sort_values(by='start_time_time')

转换后的值会显示为0 days 00:04:37格式,排序逻辑符合需求。

方案三:直接对字符串排序

由于时间字符串是HH:MM:SS固定格式,字符串的字典序与时间先后顺序完全一致,可直接排序:

df = df.sort_values(by='start_time_time')

这种方法最简单,无需任何类型转换。


内容的提问来源于stack exchange,提问作者3timemvpnikolajokic

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 10:21:12