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

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:按小时筛选规则

不需要输入完整的时分秒精确值,有两种常用筛选方式:

  1. 直接提取小时属性判断,示例:筛选所有上午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)]
  1. 直接与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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 08:15:04