如何重建一个时间序列,知道行间的时间间隔(向量“A”)和“A”的一个特定值的时间
How to reconstruct a time series knowing time-lapses among rows (Vector `A`) and the time for one specific value of `A`
我有一个向量 Delay
表示不同时刻之间的延时(以秒为单位)。下面我展示一个小例子:
Delay <- c(120,180,90,110)
关键是我想使用向量 Delay
重新构建一个序列时间,并且知道 Delay
的特定位置(即延迟 [3])的时间是 2016-08-30 12:00:00
。正如您在下面的示例中所见,向后和向前的重建是不同的。从我们的 "reference time" 开始,向后移动意味着减去 90 秒到 2016-08-30 12:00:00
。向前移动意味着向 2016-08-30 12:00:00
添加 110 秒。最后一个条件是我只想要 2 个特定日期之间的序列时间,例如,在此示例中 2016-08-30 11:38:00
和 2016-08-30 12:19:00
之间。
我对这个例子的期望是:
Delay DateTime
1 120 2016-08-30 11:38:50 . . .
2 180 2016-08-30 11:41:50 . . .
3 90 2016-08-30 11:43:20 . . .
4 110 2016-08-30 11:45:10 . . .
5 120 2016-08-30 11:47:10 . . .
6 180 2016-08-30 11:50:10 . . .
7 90 2016-08-30 11:51:40 . . .
8 110 2016-08-30 11:53:30 . . .
9 120 2016-08-30 11:55:30 # I have subtracted 180 seconds to the time `2016-08-30 11:58:30`
10 180 2016-08-30 11:58:30 # I have subtracted 90 seconds to the time `2016-08-30 12:00:00`
11 90 2016-08-30 12:00:00 # Starting point from which we move backwards and forwards using the sequence of times specified in `Delay`
12 110 2016-08-30 12:01:50 # I have added 110 seconds to the time `2016-08-30 12:00:00`
13 120 2016-08-30 12:03:50 # I have added 120 seconds to the time `2016-08-30 12:01:50`
14 180 2016-08-30 12:06:50 . . .
15 90 2016-08-30 12:08:20 . . .
16 110 2016-08-30 12:10:10 . . .
17 120 2016-08-30 12:12:10 . . .
18 180 2016-08-30 12:15:10 . . .
19 90 2016-08-30 12:16:40 . . .
20 110 2016-08-30 12:18:30 . . .
我怎么负担得起这个?
应用@Ian Campbell 提出的代码,但更改矢量 Delay
和一些截止日期,我发现:
Delay <- c(120,180,90,110,150,170)
KnownTime <- as_datetime("2016-08-30 12:00:00")
KnownTimePosition <- 3
TargetTimePast <- as_datetime("2016-08-30 11:38:00")
TargetTimeFuture <- as_datetime("2016-08-30 12:13:00")
DelaySpan <- sum(Delay)
TargetPastSeconds <- time_length(KnownTime - TargetTimePast)
TotalSpan <- time_length(TargetTimeFuture - TargetTimePast)
DelaysBack <- ceiling((TargetPastSeconds - sum(Delay[1:(KnownTimePosition)]))/DelaySpan)
TotalDelays <- ceiling(TotalSpan/DelaySpan)
FullDelayVector <- rep(Delay,TotalDelays)
Start <- KnownTime - seconds(sum(Delay[1:(KnownTimePosition)])) - DelaysBack * DelaySpan
Result <- as_datetime(Reduce(function(x,y){x + seconds(y)},FullDelayVector,Start,accumulate = TRUE))
Result <- Result[Result >= TargetTimePast & Result <= TargetTimeFuture]
Result <- as.data.frame(Result)
colnames(Result)[1] <- "DateTimeUTC"
Result
foo <- Result %>%
arrange(DateTimeUTC) %>%
mutate(diff = as.POSIXct(DateTimeUTC, "%Y-%m-%d %H:%M:%OS") - lag(as.POSIXct(DateTimeUTC, "%Y-%m-%d %H:%M:%OS"), default = as.POSIXct(DateTimeUTC, "%Y-%m-%d %H:%M:%OS")[1]),
diff_secs = as.numeric(diff, units = 'secs'))
foo
DateTimeUTC diff diff_secs
1 2016-08-30 11:39:50 0 secs 0
2 2016-08-30 11:41:50 120 secs 120
3 2016-08-30 11:44:50 180 secs 180
4 2016-08-30 11:46:20 90 secs 90
5 2016-08-30 11:48:10 110 secs 110
6 2016-08-30 11:50:40 150 secs 150
7 2016-08-30 11:53:30 170 secs 170
8 2016-08-30 11:55:30 120 secs 120
9 2016-08-30 11:58:30 180 secs 180
10 2016-08-30 12:00:00 90 secs 90
11 2016-08-30 12:01:50 110 secs 110
12 2016-08-30 12:04:20 150 secs 150
13 2016-08-30 12:07:10 170 secs 170
如您所见,数据帧的初始时间是可以的,因为我将时间 2016-08-30 11:38:00
确定为截止时刻,因此 foo
中的前一行到第一行将是 2016-08-30 11:37:00
(减去 170 秒到 2016-08-30 11:38:00
),超出 2016-08-30 11:38:00
然后它就不会出现。但是,对于我的数据框 foo
的另一个限制,我发现上次 2016-08-30 12:07:10
,当限制为 2016-08-30 12:13:00
时,应该有更多行使用 Delay
作为标准。
我认为这会满足您的要求。我们可以使用 Reduce
跟随 Delay
向量。为了方便起见,我将使用 lubridate
library(lubridate)
Delay <- c(120,180,90,110)
KnownTime <- as_datetime("2016-08-30 12:00:00")
KnownTimePosition <- 3
TargetTimePast <- as_datetime("2016-08-30 11:38:00")
TargetTimeFuture <- as_datetime("2016-08-30 12:19:00")
DelaySpan <- sum(Delay)
TargetPastSeconds <- time_length(KnownTime - TargetTimePast)
TotalSpan <- time_length(TargetTimeFuture - TargetTimePast)
DelaysBack <- ceiling((TargetPastSeconds - sum(Delay[1:(KnownTimePosition)]))/DelaySpan)
TotalDelays <- ceiling(TotalSpan/DelaySpan)
FullDelayVector <- rep(Delay,TotalDelays)
Start <- KnownTime - seconds(sum(Delay[1:(KnownTimePosition)])) - DelaysBack * DelaySpan
Result <- as_datetime(Reduce(function(x,y){x + seconds(y)},FullDelayVector,Start,accumulate = TRUE))
Result[Result >= TargetTimePast & Result <= TargetTimeFuture]
# [1] "2016-08-30 11:38:50 UTC" "2016-08-30 11:41:50 UTC" "2016-08-30 11:43:20 UTC" "2016-08-30 11:45:10 UTC" "2016-08-30 11:47:10 UTC"
# [6] "2016-08-30 11:50:10 UTC" "2016-08-30 11:51:40 UTC" "2016-08-30 11:53:30 UTC" "2016-08-30 11:55:30 UTC" "2016-08-30 11:58:30 UTC"
#[11] "2016-08-30 12:00:00 UTC" "2016-08-30 12:01:50 UTC" "2016-08-30 12:03:50 UTC" "2016-08-30 12:06:50 UTC" "2016-08-30 12:08:20 UTC"
#[16] "2016-08-30 12:10:10 UTC" "2016-08-30 12:12:10 UTC" "2016-08-30 12:15:10 UTC" "2016-08-30 12:16:40 UTC" "2016-08-30 12:18:30 UTC"
我有一个向量 Delay
表示不同时刻之间的延时(以秒为单位)。下面我展示一个小例子:
Delay <- c(120,180,90,110)
关键是我想使用向量 Delay
重新构建一个序列时间,并且知道 Delay
的特定位置(即延迟 [3])的时间是 2016-08-30 12:00:00
。正如您在下面的示例中所见,向后和向前的重建是不同的。从我们的 "reference time" 开始,向后移动意味着减去 90 秒到 2016-08-30 12:00:00
。向前移动意味着向 2016-08-30 12:00:00
添加 110 秒。最后一个条件是我只想要 2 个特定日期之间的序列时间,例如,在此示例中 2016-08-30 11:38:00
和 2016-08-30 12:19:00
之间。
我对这个例子的期望是:
Delay DateTime
1 120 2016-08-30 11:38:50 . . .
2 180 2016-08-30 11:41:50 . . .
3 90 2016-08-30 11:43:20 . . .
4 110 2016-08-30 11:45:10 . . .
5 120 2016-08-30 11:47:10 . . .
6 180 2016-08-30 11:50:10 . . .
7 90 2016-08-30 11:51:40 . . .
8 110 2016-08-30 11:53:30 . . .
9 120 2016-08-30 11:55:30 # I have subtracted 180 seconds to the time `2016-08-30 11:58:30`
10 180 2016-08-30 11:58:30 # I have subtracted 90 seconds to the time `2016-08-30 12:00:00`
11 90 2016-08-30 12:00:00 # Starting point from which we move backwards and forwards using the sequence of times specified in `Delay`
12 110 2016-08-30 12:01:50 # I have added 110 seconds to the time `2016-08-30 12:00:00`
13 120 2016-08-30 12:03:50 # I have added 120 seconds to the time `2016-08-30 12:01:50`
14 180 2016-08-30 12:06:50 . . .
15 90 2016-08-30 12:08:20 . . .
16 110 2016-08-30 12:10:10 . . .
17 120 2016-08-30 12:12:10 . . .
18 180 2016-08-30 12:15:10 . . .
19 90 2016-08-30 12:16:40 . . .
20 110 2016-08-30 12:18:30 . . .
我怎么负担得起这个?
应用@Ian Campbell 提出的代码,但更改矢量 Delay
和一些截止日期,我发现:
Delay <- c(120,180,90,110,150,170)
KnownTime <- as_datetime("2016-08-30 12:00:00")
KnownTimePosition <- 3
TargetTimePast <- as_datetime("2016-08-30 11:38:00")
TargetTimeFuture <- as_datetime("2016-08-30 12:13:00")
DelaySpan <- sum(Delay)
TargetPastSeconds <- time_length(KnownTime - TargetTimePast)
TotalSpan <- time_length(TargetTimeFuture - TargetTimePast)
DelaysBack <- ceiling((TargetPastSeconds - sum(Delay[1:(KnownTimePosition)]))/DelaySpan)
TotalDelays <- ceiling(TotalSpan/DelaySpan)
FullDelayVector <- rep(Delay,TotalDelays)
Start <- KnownTime - seconds(sum(Delay[1:(KnownTimePosition)])) - DelaysBack * DelaySpan
Result <- as_datetime(Reduce(function(x,y){x + seconds(y)},FullDelayVector,Start,accumulate = TRUE))
Result <- Result[Result >= TargetTimePast & Result <= TargetTimeFuture]
Result <- as.data.frame(Result)
colnames(Result)[1] <- "DateTimeUTC"
Result
foo <- Result %>%
arrange(DateTimeUTC) %>%
mutate(diff = as.POSIXct(DateTimeUTC, "%Y-%m-%d %H:%M:%OS") - lag(as.POSIXct(DateTimeUTC, "%Y-%m-%d %H:%M:%OS"), default = as.POSIXct(DateTimeUTC, "%Y-%m-%d %H:%M:%OS")[1]),
diff_secs = as.numeric(diff, units = 'secs'))
foo
DateTimeUTC diff diff_secs
1 2016-08-30 11:39:50 0 secs 0
2 2016-08-30 11:41:50 120 secs 120
3 2016-08-30 11:44:50 180 secs 180
4 2016-08-30 11:46:20 90 secs 90
5 2016-08-30 11:48:10 110 secs 110
6 2016-08-30 11:50:40 150 secs 150
7 2016-08-30 11:53:30 170 secs 170
8 2016-08-30 11:55:30 120 secs 120
9 2016-08-30 11:58:30 180 secs 180
10 2016-08-30 12:00:00 90 secs 90
11 2016-08-30 12:01:50 110 secs 110
12 2016-08-30 12:04:20 150 secs 150
13 2016-08-30 12:07:10 170 secs 170
如您所见,数据帧的初始时间是可以的,因为我将时间 2016-08-30 11:38:00
确定为截止时刻,因此 foo
中的前一行到第一行将是 2016-08-30 11:37:00
(减去 170 秒到 2016-08-30 11:38:00
),超出 2016-08-30 11:38:00
然后它就不会出现。但是,对于我的数据框 foo
的另一个限制,我发现上次 2016-08-30 12:07:10
,当限制为 2016-08-30 12:13:00
时,应该有更多行使用 Delay
作为标准。
我认为这会满足您的要求。我们可以使用 Reduce
跟随 Delay
向量。为了方便起见,我将使用 lubridate
library(lubridate)
Delay <- c(120,180,90,110)
KnownTime <- as_datetime("2016-08-30 12:00:00")
KnownTimePosition <- 3
TargetTimePast <- as_datetime("2016-08-30 11:38:00")
TargetTimeFuture <- as_datetime("2016-08-30 12:19:00")
DelaySpan <- sum(Delay)
TargetPastSeconds <- time_length(KnownTime - TargetTimePast)
TotalSpan <- time_length(TargetTimeFuture - TargetTimePast)
DelaysBack <- ceiling((TargetPastSeconds - sum(Delay[1:(KnownTimePosition)]))/DelaySpan)
TotalDelays <- ceiling(TotalSpan/DelaySpan)
FullDelayVector <- rep(Delay,TotalDelays)
Start <- KnownTime - seconds(sum(Delay[1:(KnownTimePosition)])) - DelaysBack * DelaySpan
Result <- as_datetime(Reduce(function(x,y){x + seconds(y)},FullDelayVector,Start,accumulate = TRUE))
Result[Result >= TargetTimePast & Result <= TargetTimeFuture]
# [1] "2016-08-30 11:38:50 UTC" "2016-08-30 11:41:50 UTC" "2016-08-30 11:43:20 UTC" "2016-08-30 11:45:10 UTC" "2016-08-30 11:47:10 UTC"
# [6] "2016-08-30 11:50:10 UTC" "2016-08-30 11:51:40 UTC" "2016-08-30 11:53:30 UTC" "2016-08-30 11:55:30 UTC" "2016-08-30 11:58:30 UTC"
#[11] "2016-08-30 12:00:00 UTC" "2016-08-30 12:01:50 UTC" "2016-08-30 12:03:50 UTC" "2016-08-30 12:06:50 UTC" "2016-08-30 12:08:20 UTC"
#[16] "2016-08-30 12:10:10 UTC" "2016-08-30 12:12:10 UTC" "2016-08-30 12:15:10 UTC" "2016-08-30 12:16:40 UTC" "2016-08-30 12:18:30 UTC"