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

pandas使用np.where比较时间字段报TypeError该如何解决?

解决步骤

1. 统一字段类型为datetime格式

你遇到的报错核心原因是三个object类型的列中混合了datetime.time对象和字符串格式的时间值,跨类型无法直接比较;直接用pd.datetime()无法批量转换Series,也无法处理已存在的datetime.time类型元素。
首先执行以下代码统一转换三个字段为pandas标准datetime类型:

for col in ['Start Time', 'End Time', 'Repayment_Time']:
    # 先统一转为字符串,再转换为datetime,errors='coerce'会把格式异常的值转为NaT空值
    final_df_SDC[col] = pd.to_datetime(final_df_SDC[col].astype(str), errors='coerce')

2. 处理异常值

转换后可以先检查是否存在格式错误导致的空值:

# 筛选存在空值的行
invalid_rows = final_df_SDC[final_df_SDC[['Start Time', 'End Time', 'Repayment_Time']].isna().any(axis=1)]
print(invalid_rows)

你提供的样例中最后一行Repayment_Time为2021-12-01 12:11:2属于格式异常(秒数仅1位),修正这类异常值后重新执行转换步骤即可。

3. 执行时间比较

转换完成后三个字段的dtype会变为datetime64,此时你原来的比较代码就可以正常运行:

np.where((final_df_SDC['Start Time']>= final_df_SDC['Repayment_Time']) & (final_df_SDC['End Time'] <= final_df_SDC['Repayment_Time']),"OCC","-")

附加说明:仅需比较时间部分的场景

如果你的业务不需要判断日期,仅需比较时分秒,可以转换完成后提取时间部分再比较:

for col in ['Start Time', 'End Time', 'Repayment_Time']:
    final_df_SDC[col] = final_df_SDC[col].dt.time

此时三个列的元素都是统一的datetime.time类型,不会出现字符串混存的问题,也可以正常比较。


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

相关产品推荐
方舟 Agent Plan

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

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