如何让Numpy仅对两个数组相同索引执行操作?(时间交集场景)
问题分析
你的代码错误在于使用了.any()——这个方法会判断整个数组中是否存在任意一个元素满足条件,而不是逐位置判断每组时间段的交集。所以只要数组里有一组满足某个条件,就会对所有组执行对应的计算,导致第二组本无交集却被错误计算。
正确解法
计算两组时间段的交集时长,核心逻辑是:
- 对每组对应的时间段,取两个开始时间的最大值作为交集起始点
- 取两个结束时间的最小值作为交集结束点
- 如果起始点 < 结束点,时长为结束点 - 起始点;否则时长为0
可以用向量化操作直接处理整个数组,无需写多个if-elif分支,代码更简洁高效:
import numpy as np import pandas as pd # 修复原数组语法错误并转换为numpy数组 per_1_start_time = np.array([ [pd.Timestamp('2014-01-20 13:06:00+0100', tz='pytz.FixedOffset(60)')], [pd.Timestamp('2014-02-04 10:31:00+0100', tz='pytz.FixedOffset(60)')] ]) per_1_stop_time = np.array([ [pd.Timestamp('2014-01-20 13:10:11.372000+0100', tz='pytz.FixedOffset(60)')], [pd.Timestamp('2014-02-04 10:35:47.338000+0100', tz='pytz.FixedOffset(60)')] ]) per_2_start_time = np.array([ [pd.Timestamp('2014-01-20 13:08:00+0100', tz='pytz.FixedOffset(60)')], [pd.Timestamp('2014-01-20 13:08:00+0100', tz='pytz.FixedOffset(60)')] ]) per_2_stop_time = np.array([ [pd.Timestamp('2014-01-20 13:09:03.472000+0100', tz='pytz.FixedOffset(60)')], [pd.Timestamp('2014-01-20 13:09:03.472000+0100', tz='pytz.FixedOffset(60)')] ]) # 计算每组的交集起始和结束时间 intersect_start = np.maximum(per_1_start_time, per_2_start_time) intersect_end = np.minimum(per_1_stop_time, per_2_stop_time) # 计算时长:存在交集则取差值,否则为0 intersept_loc = np.where(intersect_start < intersect_end, intersect_end - intersect_start, pd.Timedelta(0)) print(intersept_loc)
输出结果
运行后会得到正确的逐组结果:
array([[Timedelta('0 days 00:01:03.472000')], [Timedelta('0 days 00:00:00')]], dtype=object)
(注:第一组的正确交集时长为1分3秒左右,你之前的代码因逻辑匹配错误得到了不正确的结果)
内容的提问来源于stack exchange,提问作者Andrey Matveev
相关产品推荐
相关产品推荐

