计算值随时间的变化

时间:2019-07-09 10:56:05

标签: r lubridate

我想根据一系列日期在高潮和低潮时的深度来估算潮汐深度。

      date  time depth tide_state     t_datetime
17/03/2018 20:26  0.43        Low 17/03/2018 20:26
18/03/2018 02:33  2.09       High 18/03/2018 02:33
18/03/2018 08:39  0.45        Low 18/03/2018 08:39
18/03/2018 14:47  2.14       High 18/03/2018 14:47
18/03/2018 20:54  0.41        Low 18/03/2018 20:54
19/03/2018 03:01  2.13       High 19/03/2018 03:01

我将df1$t_datetime转换为POSIXct。然后,我计算了每次潮汐之间的时间差:

df1 %>%
  mutate(diff = c(difftime(tail(t_datetime, -1), head(t_datetime, -1)),0))

这给了我

     date  time depth tide_state          t_datetime      diff
17/03/2018 20:26  0.43        Low 2018-03-17 20:26:00 6.116667 
18/03/2018 02:33  2.09       High 2018-03-18 02:33:00 6.100000 
18/03/2018 08:39  0.45        Low 2018-03-18 08:39:00 6.133333 
18/03/2018 14:47  2.14       High 2018-03-18 14:47:00 6.116667
18/03/2018 20:54  0.41        Low 2018-03-18 20:54:00 6.116667
19/03/2018 03:01  2.13       High 2018-03-19 03:01:00 6.133333

df1$diff以小时为单位。

我想使用df1$diff来大致计算所列深度之间每小时的潮汐深度。

我认为我需要计算潮汐之间的深度差,然后将其除以df1$diff,以获得每小时的深度变化。

以前两个为例,深度差为1.66m。这是每小时〜0.27m。

理想情况下,我的输出将如下所示:

     date  time depth tide_state          t_datetime      diff
17/03/2018 20:26  0.43        Low 2018-03-17 20:26:00 6.116667 
17/03/2018 21:26  0.70        Low 2018-03-17 21:26:00 6.116667 
17/03/2018 22:26  0.97        Low 2018-03-17 22:26:00 6.116667 
17/03/2018 23:26  1.24        Low 2018-03-17 23:26:00 6.116667 
17/03/2018 00:26  1.51        Low 2018-03-17 00:26:00 6.116667 
17/03/2018 01:26  1.78        Low 2018-03-17 01:26:00 6.116667 
18/03/2018 02:33  2.09       High 2018-03-18 02:33:00 6.100000 

由于我只是使用计算器而没有包括所有多余的小数,因此上面的深度略有不足。

我想添加具有新深度的额外行。但是我不确定如何在R中做到这一点,因为并非所有的潮汐期都一样长,而且我正努力知道该怎么做。

任何帮助将不胜感激。

数据:

structure(list(X = 1:6, date = structure(c(1L, 2L, 2L, 2L, 2L, 
3L), .Label = c("17/03/2018", "18/03/2018", "19/03/2018"), class = "factor"), 
    time = structure(c(5L, 1L, 3L, 4L, 6L, 2L), .Label = c("02:33", 
    "03:01", "08:39", "14:47", "20:26", "20:54"), class = "factor"), 
    depth = c(0.43, 2.09, 0.45, 2.14, 0.41, 2.13), tide_state = structure(c(2L, 
    1L, 2L, 1L, 2L, 1L), .Label = c("High", "Low"), class = "factor"), 
    t_datetime = structure(1:6, .Label = c("2018-03-17 20:26:00", 
    "2018-03-18 02:33:00", "2018-03-18 08:39:00", "2018-03-18 14:47:00", 
    "2018-03-18 20:54:00", "2018-03-19 03:01:00"), class = "factor"), 
    diff = c(6.11666666666667, 6.1, 6.13333333333333, 6.11666666666667, 
    6.11666666666667, 6.13333333333333)), class = "data.frame", row.names = c(NA, 
-6L))

1 个答案:

答案 0 :(得分:1)

这听起来像是线性插值问题,向我建议?approx

进行一些初始设置:

dat$t_datetime <- as.POSIXct(dat$t_datetime,tz="UTC")
dat$diff <- c(diff(dat$t_datetime),1)

apptimes <- rep(dat$t_datetime, dat$diff) +
            as.difftime(sequence(dat$diff)-1, units="hours")

有一个峰值并确保它起作用:

apptimes[1:5]
#[1] "2018-03-17 20:26:00 UTC" "2018-03-17 21:26:00 UTC"
#[3] "2018-03-17 22:26:00 UTC" "2018-03-17 23:26:00 UTC"
#[5] "2018-03-18 00:26:00 UTC"

然后,您可以使用以下app近似值times来对depth值进行线性插值:

approx(x=dat$t_datetime, y=dat$depth, xout=apptimes)$y
#[1] 0.4300000 0.7013896 0.9727793 1.2441689 1.5155586 1.7869482 2.0900000 ...

您可以将所有这些重新组合到您的母带中,然后:

cbind(
    dat[rep(seq_len(nrow(dat)),dat$diff), c("X","tide_state")],
    t_datetime = apptimes,
    depth = approx(x=dat$t_datetime, y=dat$depth, xout=apptimes)$y
)
#    X tide_state          t_datetime     depth
#1   1        Low 2018-03-17 20:26:00 0.4300000
#1.1 1        Low 2018-03-17 21:26:00 0.7013896
#1.2 1        Low 2018-03-17 22:26:00 0.9727793
#1.3 1        Low 2018-03-17 23:26:00 1.2441689
#1.4 1        Low 2018-03-18 00:26:00 1.5155586
#1.5 1        Low 2018-03-18 01:26:00 1.7869482
#2   2       High 2018-03-18 02:33:00 2.0900000
## etc etc

要显示其作用,请执行以下绘图:

plot(dat$t_datetime, dat$depth, xlab="Time", ylab="Depth", col="red", pch=19)
apprdep <- approx(x=dat$t_datetime, y=dat$depth, xout=apptimes)$y
lines(apptimes, apprdep, col="blue", type="o", lty=2)

enter image description here