将DataFrame中object类型纯时间列转为datetime类型遇问题求助
问题与解决方案
问题背景
我尝试将DataFrame的df['start_time_time']列从object类型转换为datetime类型。该列是从df['start_time']列中提取出的纯时间数据,示例如下:
| start_time | start_time_time |
|---|---|
| 2019-01-01 00:04:37 | 00:04:37 |
| 2019-01-01 00:14:52 | 00: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_time | start_time_time |
|---|---|
| 2019-01-01 00:04:37 | 1900-01-01 00:04:37 |
| 2019-01-01 00:14:52 | 1900-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
相关产品推荐
相关产品推荐

