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

如何在Julia中交叉检查字典并筛选符合条件的事件?

实现Julia字典的事件筛选(时间重叠+近距离)

可以直接对这个字典进行筛选,步骤如下:

1. 转换为DataFrame(更易操作)

首先使用DataFrames包将字典转为表格结构,方便后续的条件判断和筛选:

using DataFrames

# 你的原始字典
dt = Dict(:ID => [20, 30, 40, 50] , :Stime => [94, 142, 207, 208], :Etime => [1158, 4420, 1255, 2936],  :X => [4603895, 4601068, 4608327, 4606317],  :Y => [5809148, 5820498, 5828084, 5825361])
df = DataFrame(dt)

2. 定义条件判断函数

编写函数判断两个事件是否同时满足时间重叠和坐标距离小于1000单位:

  • 时间重叠:事件A的开始时间 ≤ 事件B的结束时间,且事件A的结束时间 ≥ 事件B的开始时间
  • 坐标距离:为提升计算效率,直接比较距离的平方是否小于1000²(避免开方运算)
function is_valid_pair(row1::DataFrameRow, row2::DataFrameRow)
    # 判断时间重叠
    time_overlap = row1.Stime <= row2.Etime && row1.Etime >= row2.Stime
    # 判断坐标距离是否小于1000
    dist_sq = (row1.X - row2.X)^2 + (row1.Y - row2.Y)^2
    dist_close = dist_sq < 1000^2
    return time_overlap && dist_close
end

3. 查找符合条件的事件对

遍历所有事件对(避免重复比较,只检查i < j的组合),收集满足条件的事件ID对:

n = nrow(df)
valid_pairs = []

for i in 1:n
    for j in i+1:n
        if is_valid_pair(df[i, :], df[j, :])
            push!(valid_pairs, (df[i, :ID], df[j, :ID]))
        end
    end
end

# 输出结果
if isempty(valid_pairs)
    println("没有找到满足条件的事件对")
else
    println("满足条件的事件对:")
    for pair in valid_pairs
        println(pair)
    end
end

4. 筛选涉及的事件行

如果需要提取所有符合条件的事件数据,可以从DataFrame中筛选出涉及这些事件的行:

# 提取所有符合条件的事件ID
valid_ids = unique(vcat(valid_pairs...))
# 筛选DataFrame
filtered_events = filter(row -> row.ID in valid_ids, df)

针对你的示例数据的结果

运行上述代码后,会输出没有找到满足条件的事件对——因为所有事件对要么时间重叠但坐标距离远大于1000,要么距离近但时间不重叠。

内容的提问来源于stack exchange,提问作者Chao

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 20:18:16