【问题标题】:Calculating time duration from two time values with no date in R从R中没有日期的两个时间值计算持续时间
【发布时间】:2020-06-01 18:28:44
【问题描述】:

我正在尝试根据日记中自我报告的两次来计算睡眠持续时间(以小时为单位)。我有 24 小时格式的就寝和起床时间(例如,就睡时间,“23:00”是晚上 11 点,“0:00”是午夜,“1:00”是凌晨 1 点;对于起床时间,“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 ...

【问题讨论】:

  • 您好!即使您的问题有点简单地认为是答案,您的问题也可以通过提供minimal reproducible example 的数据得到回答并且更完整。

标签: r datetime time


【解决方案1】:

这是一个 hack,但它有效。至少它与发布的输入数据有关。

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")

【讨论】:

  • 这个函数很直观,但由于某种原因,当我使用这个函数时,我得到的所有值都是 0。我在原始问题中附加了更多信息。
  • @AlyciaBisson 我无法理解为什么它不起作用。但是我已经修改了代码,现在看看吧。
  • 是的!这个有效。非常感谢您的帮助!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-28
  • 2014-02-28
  • 2021-11-28
  • 1970-01-01
  • 1970-01-01
  • 2016-12-31
相关资源
最近更新 更多