我有两个时间戳数据 A 和 B。
A = c("2015-11-02 08:30:00.054", "2015-11-02 08:30:00.060", "2015-11-02 08:30:00.060", "2015-11-02 08:30:00.062", "2015-11-02 08:30:00.952")
B = c("2015-11-02 08:30:00.016", "2015-11-02 08:30:00.029", "2015-11-02 08:30:00.030", "2015-11-02 08:30:00.045", "2015-11-02 08:30:00.048", "2015-11-02 08:30:00.054", "2015-11-02 08:30:00.056", "2015-11-02 08:30:00.078", "2015-11-02 08:30:00.079", "2015-11-02 08:30:00.079", "2015-11-02 08:30:00.246", "2015-11-02 08:30:00.247", "2015-11-02 08:30:00.251", "2015-11-02 08:30:00.251", "2015-11-02 08:30:00.252")
我将向量 A 和 B 中的每个时间元素表示为 i 和 j。所以在这种情况下,$A \in {1,...,5}$ 和 $B \in {1,...,15}$。所需的输出矩阵 Z 是 ai x j 矩阵,在本例中为 5 x 15。
我想检查 i 和 j 的每个间隔是否重叠,以及它们是否在 Z_{i,j} 中记录了 1。因此,如果 [A_i,A_{i+1}] 和 [B_j, B_{j+1}] 时间间隔完全重叠,我将记录 1。
例如,对于 i=1 和 j=1,["2015-11-02 08:30:00.054", "2015-11-02 08:30:00.060"] 和 ["2015-11-02 08:30 :00.016", "2015-11-02 08:30:00.029"] 不重叠,因此 Z_{1,1} 的输出为 0。
我现在尝试的是对于每个 i 和 j,我遍历整个向量并在 lubridate 包中使用 as.interval 和 int_overlaps 函数。但是,如果可能的话,我想要一个矢量化的解决方案来解决这个问题。它非常慢,因为我的 A 和 B 向量通常包含超过 10,000 个变量。
我尝试使用以下方法生成价格乘以 ii 乘以 jj 矩阵,这是非常低效的:
r1 = as.interval( strptime(as.POSIXlt((A), format = "%Y-%m-%d %H:%M:%OS"), format = "%Y-%m-%d %H:%M:%OS")[ii], strptime(as.POSIXlt((A), format = "%Y-%m-%d %H:%M:%OS"), format = "%Y-%m-%d %H:%M:%OS")[ii+1])
r1 = as.interval( strptime(as.POSIXlt((B), format = "%Y-%m-%d %H:%M:%OS"), format = "%Y-%m-%d %H:%M:%OS")[jj], strptime(as.POSIXlt((B), format = "%Y-%m-%d %H:%M:%OS"), format = "%Y-%m-%d %H:%M:%OS")[jj+1])
int_overlaps(r1,r2)
总而言之,我现在有以下内容。它可以工作,但速度非常慢。
tch = function(time_vector){
strptime(as.POSIXlt(as.character(time_vector), format = "%Y-%m-%d %H:%M:%OS",
tzone = "CT"), format = "%Y-%m-%d %H:%M:%OS")}
Z = matrix(0, length(A)-1, length(B)-1)
for (ii in 1:(length(A)-1)){
for (jj in 1:(length(B)-1)){
r1 = as.interval(tch(A)[ii], tch(A)[ii+1])
r2 = as.interval(tch(B)[jj], tch(B)[jj+1])
# save all overlaps and compute all the vectors
if( int_overlaps(r1,r2) ){
Z[ii,jj] = 1
}
if (jj > 1){
if (Z[ii,jj] == 0 & Z[ii,(jj-1)] == 1){
break
}}
}
print(paste(jj,ii))}
任何帮助将不胜感激!