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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 17:45:46