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

如何让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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 00:05:28