如何重建一个时间序列,知道行间的时间间隔(向量“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:002016-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"