Вычисление длительности по двум значениям времени без даты в R - PullRequest
2 голосов
/ 17 февраля 2020

Я пытаюсь рассчитать продолжительность сна, в часах, из двух самоотчетов в дневнике. У меня время сна и бодрствования в 24-часовом формате (например, для времени сна "23:00" - это 11:00, "0:00" - полночь, "1:00" - 1:00; для времени пробуждения "9: 00 "это 9 утра). Я думал, что функция difftime будет полезна для извлечения продолжительности сна, но я сталкиваюсь с проблемой в некоторых случаях.

df$duration2<-difftime(df$Waketime2, df$Bedtime2, units="hours")

При использовании приведенного выше синтаксиса он правильно рассчитывает продолжительность для случаев, когда человек ложился спать в полночь позже. Проблема возникает, когда время ложиться спать до полуночи - (я думаю), потому что это технически время в другой день, которое все портит. В этих случаях этот синтаксис будет возвращать отрицательное число.

(difftime (8:00, 0:00)) 

вернет 8, но

(difftime (6:45,23:00)) 

вернет -16.25.

У меня нет данных для даты, которая соответствует времени, только значения времени, но я знаю, что последовательность такова, что, если кто-то ложится спать после полуночи, предполагается, что время пробуждения будет включено в тот же день.

Спасибо за любую помощь !!

Эта функция имеет смысл, но она дает мне 0 значений для разницы во времени в часах (сначала она показала 0 для всей длительности в секундах, поэтому я изменила ее на часы в своем коде ниже). Я также вставляю структуру моих переменных времени сна и бодрствования в надежде, что это поможет.

sleepTime <- function(bed, wake){
  wake <- paste(Sys.Date(), wake)
  tmpbed <- paste(Sys.Date(), bed)
  adjust <- -(difftime(wake, tmpbed) < 0)
  tmpbed <- paste(Sys.Date() + adjust, bed)
  difftime(wake, tmpbed, units="hours")
}

df$Duration2<-sleepTime(df$Bedtime2, df$Waketime2)
df$sTST2
Time differences in hours
  [1] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 [67] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
[133] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
str(S2trim$Bedtime2)

 'ITime' int [1:436] 23:00:00 NA 23:00:00 21:00:00 22:30:00 21:30:00 00:00:00 22:30:00 23:45:00 22:30:00 ...
str(S2trim$Waketime2)
 'ITime' int [1:436] 06:45:00 06:05:00 07:00:00 10:00:00 06:30:00 05:30:00 07:15:00 07:10:00 NA 05:30:00 ...

1 Ответ

1 голос
/ 17 февраля 2020

Это взлом, но это работает. По крайней мере, это относится к введенным входным данным.

sleepTime <- function(bed, wake){
  wake <- paste(Sys.Date(), wake)
  tmpbed <- paste(Sys.Date(), bed)
  d <- apply(data.frame(tmpbed, wake), 1, function(x) difftime(x[2], x[1], units = "hours"))
  adjust <- -(d < 0)
  tmpbed <- paste(Sys.Date() + adjust, bed)
  apply(data.frame(tmpbed, wake), 1, function(x) difftime(x[2], x[1], units = "hours"))
}

bedtime2 <- c("0:00", "23:00")
waketime2 <- c("8:00", "6:45")
sleepTime(bedtime2, waketime2)
#[1]  8.00 7.75

Другой пример, к данным в выходных данных str, опубликованных в вопросе.

sleepTime(bedtime, waketime)
# [1]  7.750000  6.083333  8.000000 13.000000  8.000000  8.000000
# [7]  7.250000  8.666667  0.250000  7.000000

Данные.

bedtime <-
c("23:00:00", NA, "23:00:00", "21:00:00", "22:30:00", "21:30:00", 
"00:00:00", "22:30:00", "23:45:00", "22:30:00")

waketime <-
c("06:45:00", "06:05:00", "07:00:00", "10:00:00", "06:30:00", 
"05:30:00", "07:15:00", "07:10:00", NA, "05:30:0")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...