跨工作日(周五至非周一)的消息时间差计算逻辑异常排查求助
大家好,我最近在实现一个基于消息交互数奇偶性配对、计算时间差的功能时遇到了逻辑漏洞,想请各位帮忙分析一下问题所在。
我的需求是:配对奇数交互数(用户消息)和后续的偶数交互数(客服回复),根据不同的时间场景计算两者的时间差。其中一个场景是周五发送的用户消息,后续回复不是在周一,这种情况应该走我的Block3逻辑处理,但目前有一个测试案例没有触发该逻辑,导致time_difference返回NaN,而另一个类似场景却正常工作。
我的代码逻辑
for index, row in df.iterrows(): if row["interaction_count"] % 2 == 0: if previous_odd_timestamp: even_time = row["timestamp"] odd_time = previous_odd_timestamp print(odd_time, row['interaction_count']) if odd_time.hour >= 8 and odd_time.hour < 19 and odd_time.weekday() < 5 and odd_time.weekday() == even_time.weekday(): print("phase 1: line", row['interaction_count']) time_diff = (even_time - odd_time).total_seconds()/60 time_diff_list.append(time_diff) df.at[index, 'time_difference'] = time_diff elif odd_time.hour <= 8 and odd_time.weekday() <= 4 and odd_time.weekday() == even_time.weekday(): print('phase 2: line', row['interaction_count']) odd_time = odd_time.replace(hour=8, minute=0, second=0, microsecond=0) time_diff = (even_time - odd_time).total_seconds()/60 time_diff_list.append(time_diff) df.at[index, 'time_difference'] = time_diff if 8 < odd_time.hour < 19 and odd_time.weekday() >= 4 and odd_time.weekday() != even_time.weekday(): print('phase 3: line ',row['interaction_count']) odd_difference_seven_pm = odd_time odd_difference_seven_pm = odd_time.replace(hour=19, minute=0, second=0, microsecond=0) odd_difference_seven_pm= odd_difference_seven_pm - odd_time if odd_time.weekday() == 4: # Saturday 这里注释错误,weekday=4实际是周五 odd_time = odd_time + timedelta(days=3) odd_time = odd_time.replace(hour=8, minute=0, second=0, microsecond=0) elif odd_time.weekday() == 5: # Saturday odd_time = odd_time + timedelta(days=2) odd_time = odd_time.replace(hour=8, minute=0, second=0, microsecond=0) elif odd_time.weekday() == 6: # Sunday odd_time = odd_time + timedelta(days=1) odd_time = odd_time.replace(hour=8, minute=0, second=0, microsecond=0) time_diff = (even_time - odd_time).total_seconds()/60 time_diff_list.append(time_diff) df.at[index, 'time_difference'] = time_diff + odd_difference_seven_pm.total_seconds()/60 previous_odd_timestamp = None elif row["interaction_count"] % 2 != 0: previous_odd_timestamp = row["timestamp"]
测试案例对比
正常工作的案例(周五18:31的消息,周一08:32回复)
[ { "timestamp": "2023-05-05 18:31:51.302", "interaction_count": 11, "time_difference": "NaN" }, { "timestamp": "2023-05-08 08:32:40.076", "interaction_count": 12, "time_difference": 60.812900 } ]
这个案例正常触发了Block3,计算出的时间差是:周五19:00-18:31的29分钟 + 周一08:32-08:00的32分钟,合计约60.8分钟,符合预期。
异常的案例(周五08:37的消息,周二15:37回复)
[ { "timestamp": "2023-05-05 08:37:43.902", "interaction_count": 23, "time_difference": "NaN" }, { "timestamp": "2023-05-09 15:37:21.645", "interaction_count": 24, "time_difference": "NaN" } ]
这个案例中,用户消息是周五08:37(属于工作时间),回复是周二15:37,两者工作日不同,理论上应该触发Block3,但实际没有,导致time_difference为NaN。
我自己的初步分析
我检查了条件,发现第二个案例中odd_time.hour是8,而Block3的触发条件是8 < odd_time.hour < 19——这里的8 <把hour等于8的情况排除了!所以周五08:37的消息不满足这个条件,自然不会进入Block3处理。而第一个案例的odd_time.hour是18,满足8 < 18 <19,所以正常触发。
另外我还发现代码里有个注释错误:if odd_time.weekday() == 4: # Saturday,实际上Python的datetime.weekday()中,4代表周五,5才是周六,这个注释可能会导致后续维护混淆。
寻求帮助的点
除了我发现的hour条件问题,想请各位帮忙确认:
- 调整Block3的hour条件为
odd_time.hour >=8 and odd_time.hour <19是否能解决这个问题? - 我的Block3中关于工作日的时间偏移逻辑是否正确?比如周五的消息,要跳到下周一的08:00,加3天是否正确?
- 是否还有其他潜在的逻辑漏洞需要注意?
备注:内容来源于stack exchange,提问作者Gustavo Lima

