Python中如何将object类型数据正确转换为纯time时间类型
问题原因
执行pd.to_datetime(data['Start_time'],format= '%H:%M:%S').dt.time后得到的是Python标准库原生datetime.time对象的集合,pandas没有为这类零散的Python原生时间对象提供内置的向量化数据类型,因此整列会自动归为object类型,这是pandas的存储机制导致的,不属于转换失败。
可选解决方案
根据实际使用需求选择对应方案即可:
- 追求计算性能,需要做时间比较、筛选、聚合等向量化操作
不要调用.dt.time剥离日期,直接保留pd.to_datetime返回的datetime64类型即可,这是pandas原生支持的时间类型,运算性能远高于object列:
后续如果需要提取时、分、秒维度的信息,直接使用data['Start_time'] = pd.to_datetime(data['Start_time'], format='%H:%M:%S').dt.hour、.dt.minute、.dt.second接口调用即可,不需要额外转成纯time对象。 - 需要存储纯时间值、且要求非object的原生pandas类型
把时分秒格式的字符串转为timedelta64类型即可,该类型支持所有时间大小比较、时间差计算等操作,完全满足纯时间值的使用需求:data['Start_time'] = pd.to_timedelta(data['Start_time']) - 使用pandas 2.0及以上版本,需要严格的专用time类型
基于pyarrow后端的扩展time类型可以实现纯time列的非object存储,需要提前安装pyarrow依赖:data['Start_time'] = pd.to_datetime(data['Start_time'], format='%H:%M:%S').dt.time.astype('time[pyarrow]') - 仅做简单逐行取值,无批量计算需求
你当前写的代码得到的object列本身可以正常使用,列内存储的确实是合法的datetime.time对象,只是存储类型显示为object,不需要额外修改。
内容的提问来源于stack exchange,提问作者BH_Houhou
相关产品推荐
相关产品推荐

