Рассчитать изменение значений с течением времени - PullRequest
1 голос
/ 09 июля 2019

Я хотел бы приблизить глубину прилива на основе глубины прилива и отлива для диапазона дат.

      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,66 м.Это ~ 0,27 м в час.

В идеале мой результат должен выглядеть следующим образом:

     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 Ответ

1 голос
/ 09 июля 2019

Это звучит как проблема линейной интерполяции, которая подсказала бы мне ?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 roximate 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

...