Pandas中将小时格式object列转为datetime64类型及按小时筛选问题
问题原因排查
- 第一次执行代码时加了
.dt.time,会将pandas原生datetime64类型转换为Python标准库的datetime.time对象,这类对象在DataFrame中会统一存储为object类型,无法直接提取时间属性或做时间运算。 - 第二次执行转换时,列中已经存在
datetime.time类型的对象,pd.to_datetime不支持直接转换该类对象,因此抛出类型错误。
问题1:转换为可提取小时的时间类型
两种常用兼容方案,按需选择:
方案1:转为带虚拟日期的datetime64类型(兼容性最高,推荐)
直接省略.dt.time后缀即可,pandas会自动补充默认占位日期(通常为1900-01-01),完全不影响时间部分的提取、计算、排序:
# 转换代码 new['Time'] = pd.to_datetime(new['Time'], format='%H:%M:%S')
转换完成后可直接通过.dt.hour提取小时、.dt.minute提取分钟、.dt.second提取秒。
方案2:转为timedelta类型(适合时间差计算场景)
可以将时分秒格式的时间转换为从0点开始计算的时长类型:
new['Time'] = pd.to_timedelta(new['Time'])
转换完成后通过.dt.components.hours提取小时值即可。
问题2:按小时筛选规则
不需要输入完整的时分秒精确值,有两种常用筛选方式:
- 直接提取小时属性判断,示例:筛选所有上午8点(含8点)之后的数据
filter_df = new[new['Time'].dt.hour >= 8]
如果需要更细粒度的筛选,也可以组合多属性判断,比如筛选8点30分之后的数据:
filter_df = new[(new['Time'].dt.hour >= 8) & (new['Time'].dt.minute >= 30)]
- 直接与
datetime.time对象比较,不需要补全日期:
from datetime import time # 筛选8点之后的数据 filter_df = new[new['Time'].dt.time >= time(8, 0, 0)]
按时间排序实现
转换完成后直接按Time列排序即可:
new = new.sort_values('Time', ascending=True)
内容的提问来源于stack exchange,提问作者Baobab
相关产品推荐
相关产品推荐

