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

