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

pandas将时间戳划入3个时段时出现datetime64与time比较报错如何解决

错误原因

代码中df_sum['time']经过pd.to_datetime转换后为datetime64[ns]类型(会自动填充默认日期前缀),而am_peak_start这类阈值变量是Python原生time类型,两类数据类型不匹配,无法直接进行大小比较,因此抛出报错。

修正后代码

只需要调整time列的生成逻辑,直接从原始datetime列提取时间部分,和阈值类型匹配即可:

import pandas as pd
import numpy as np

df_sum['start_time'] = pd.to_datetime(df_sum['start_time'])
# 直接提取时间部分,生成time类型的列,删除冗余的字符串转换步骤
df_sum['time'] = df_sum['start_time'].dt.time

# 阈值定义部分无需修改
am_peak_start = pd.Timestamp('2021-01-01 06:00:00').time()
am_peak_end = pd.Timestamp('2021-01-01 09:00:00').time()
md_peak_end = pd.Timestamp('2021-01-01 16:00:00').time()
pm_peak_end = pd.Timestamp('2021-01-01 19:00:00').time()

# 条件判断和分箱逻辑完全保留即可
am_condition = ((df_sum['time'] >= am_peak_start) & (df_sum['time'] < am_peak_end))
md_condition = ((df_sum['time'] >= am_peak_end) & (df_sum['time'] < md_peak_end))
pm_condition = ((df_sum['time'] >=  md_peak_end) & (df_sum['time'] < pm_peak_end))

conditions = [am_condition, md_condition, pm_condition]
choices = ['am', 'md', 'pm']
df_sum['peak_period'] = np.select(conditions, choices, default = 'off-peak')

性能优化方案

如果数据量较大,可以用timedelta类型替代time类型做比较,运算效率更高:

# 计算当前时间和当日0点的时间差
df_sum['time_delta'] = df_sum['start_time'] - df_sum['start_time'].dt.normalize()

# 阈值统一转成timedelta类型
am_peak_start = pd.Timedelta(hours=6)
am_peak_end = pd.Timedelta(hours=9)
md_peak_end = pd.Timedelta(hours=16)
pm_peak_end = pd.Timedelta(hours=19)

# 后续条件判断和分箱逻辑和上述代码一致

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 22:57:00