Timestamp与str类型比较报错:TypeError: '>'不支持两者运算
问题描述
运行基于pandas的Python脚本时触发如下错误:
TypeError: '>' not supported between instances of 'Timestamp' and 'str'
报错代码行:
if len(shift_eval) != 0 and ts > '2022-07-25 08:00:00' and ts <= '2022-09-12 08:00:00' and ts.hour == 8:
用户已将ts转换为Timestamp格式,但仍出现类型不兼容错误,完整脚本代码如下:
monitoring_ipr = pd.read_excel(output_path + 'monitoring_ipr.xlsx', sheet_name=None) downtime = ipr_lib.system_downtime(mysql=mysql) for name in monitoring_ipr.keys(): indiv_ipr = monitoring_ipr[name] indiv_ipr.columns = indiv_ipr.columns.astype(str) for ts in indiv_ipr.columns[5:]: ts = pd.to_datetime(ts) ts_end = ts + timedelta(0.5) shift_release = sched.loc[(sched.data_ts > ts) & (sched.data_ts <= ts_end), :] if ts >= pd.to_datetime('2021-04-01'): shift_eval = eval_df.loc[(eval_df.shift_ts >= ts) & (eval_df.shift_ts <= ts+timedelta(1)) & ((eval_df['evaluated_MT'] == name) | (eval_df['evaluated_CT'] == name) | (eval_df['evaluated_backup'] == name)), :].drop_duplicates('shift_ts', keep='last') shift_eval = shift_eval.drop_duplicates('shift_ts', keep='last')[0:1] # bug reports | ensure system is working shift_downtime = downtime.loc[(((downtime.start_ts<=ts_end)&(downtime.end_ts>=ts_end)) | ((downtime.start_ts<=ts)&(downtime.end_ts>=ts_end)) | ((downtime.start_ts<=ts)&(downtime.end_ts>=ts)) | ((downtime.start_ts>=ts)&(downtime.end_ts<=ts_end))) & (downtime.reported == 0), :] if len(shift_downtime) == 0: grade_sys = 1 else: grade_sys = 1 - np.sum(shift_downtime.loc[:, ['start_ts', 'end_ts']].apply(lambda row: (min(ts_end, row.end_ts) - max(ts, row.start_ts)).total_seconds()/3600, axis=1))/12.5 if all(shift_eval[['bug_log', 'relayed']].isnull().values.flatten()): grade_bug = np.nan elif set(shift_eval[['bug_log', 'relayed']].values.flatten())-(set(['Yes', np.nan])) == set(): grade_bug = 1 else: grade_bug = 0 if len(shift_release) != 0: indiv_ipr.loc[indiv_ipr.Output1 == 'ensure system is working', str(ts)] = grade_sys indiv_ipr.loc[indiv_ipr.Output1 == 'bug reports', str(ts)] = grade_bug else: if not np.isnan(grade_bug): grade = np.mean([grade_sys, grade_bug]) else: grade = grade_sys indiv_ipr.loc[indiv_ipr.Output2 == 'ensure system is working', str(ts)] = grade # contacts updating if len(shift_release) == 0 and len(shift_eval) != 0: if ts.hour == 20: grade_contacts = np.nan elif shift_eval.contacts.values[0] == 'NAN EEEE': grade_contacts = 0 else: grade_contacts = min(1, len(shift_eval.contacts.values[0].split(', ')) / 5) indiv_ipr.loc[indiv_ipr.Output2 == 'updating of contacts', str(ts)] = grade_
问题原因与解决方法
原因分析
尽管你已经将ts转换为Timestamp类型,但在条件判断中,你将它与字符串格式的时间直接比较,Python不支持Timestamp和str类型之间的大小比较操作,因此触发类型错误。
解决方法
统一比较双方的类型即可,推荐将字符串时间转换为Timestamp类型(时间比较用Timestamp更可靠,避免字符串格式不匹配的问题):
方法1:提前定义时间变量
# 提前将固定时间转换为Timestamp start_time = pd.to_datetime('2022-07-25 08:00:00') end_time = pd.to_datetime('2022-09-12 08:00:00') if len(shift_eval) != 0 and ts > start_time and ts <= end_time and ts.hour == 8:
方法2:直接在条件中转换
if len(shift_eval) != 0 and ts > pd.to_datetime('2022-07-25 08:00:00') and ts <= pd.to_datetime('2022-09-12 08:00:00') and ts.hour == 8:
额外提示
建议使用方法1,提前定义时间变量可以避免重复调用pd.to_datetime,提升代码运行效率。
内容的提问来源于stack exchange,提问作者Jel
相关产品推荐
相关产品推荐

