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
相关产品推荐
相关产品推荐

