【问题标题】:Subtract Time Values in R减去 R 中的时间值
【发布时间】:2018-10-05 10:05:04
【问题描述】:

我有如下价值观:

df[,1:2]

中的结果

我想创建一个新列,其中包含 Ins 和 Outs 之间的差异。 这些是 TIME 值, 预期输出为:

1201 0718(忽略负值) ..等等。

【问题讨论】:

  • df$diff <- df$In - df$Out ?
  • 仅给出差异,而不是 24 小时格式。 @OttoKässi
  • 先将InOut转换为date-time对象,然后使用difftime()
  • 我该怎么做? @ANG
  • 1431344 是什么意思 InOut

标签: r date time


【解决方案1】:
library(stringr)

# generate few rows of data
In <- c('143','1239')
Out <- c('1344','521')
df <- data.frame(cbind(In, Out), stringsAsFactors=FALSE)

# pad with zero if needed (e.g. 143 -> 0143)
df$In[str_length(df$In) == 3] <- paste(0,df$In[str_length(df$In) == 3], sep='')
df$Out[str_length(df$Out) == 3] <- paste(0,df$Out[str_length(df$Out) == 3], sep='')

df$In <- strptime(df$In, format='%H%M')
df$Out <- strptime(df$Out, format='%H%M')

df$diff <- df$In - df$Out

这给出:

> df$diff
Time differences in hours
[1] -12.01667   7.30000

这是你要找的吗?

【讨论】:

  • 是的,但不应该是 0730 吗?
  • 13:44 和 05:21 之间的差是 7 小时 18 分钟,即 7.3 小时。
  • @OttoKässi 感谢您在这方面为 OP 提供帮助,但我无法弄清楚在不考虑日期的情况下区分 In 和 Out 时间的逻辑。您如何处理 In = "12:39" 和 Out = "5:21" 的情况?对于 OP,差异为 7.3 小时,但如果您假设 In 时间在 Out 时间之前,我认为这不是真的
【解决方案2】:

如果我理解正确,OP 想要计算 绝对 时差,其中 一天中的时间(忽略日期)以字符串形式给出HMMHHMM

有些类直接支持一天中的时间(无日期),例如,hms 包或data.table 包的ITime 类。

作为一个额外的挑战,时间戳不是以标准时间格式HH:MM 给出的,例如09:43

这是一种在填充字符串后使用as.ITime() 的方法。

# create sample data frame
df <- data.frame(In  = c("143", "1239"), 
                 Out = c("1344", "521"))

library(magrittr)   # piping is used for readability

# pad strings and coerce to ITime class
df$In %<>% 
  stringr::str_pad(4L, pad = "0") %>% 
  data.table::as.ITime("%H%M")
df$Out %<>% 
  stringr::str_pad(4L, pad = "0") %>% 
  data.table::as.ITime("%H%M")

# compute absolute difference
df$absdiff <- abs(df$In - df$Out)

df
        In      Out  absdiff
1 01:43:00 13:44:00 12:01:00
2 12:39:00 05:21:00 07:18:00

现在,OP 似乎期望结果与输入值具有相同的非标准格式 HHMM(没有 : 字段分隔符)。这可以通过

df$absdiff %>% 
  as.POSIXct() %>% 
  format("%H%M")
[1] "1201" "0718"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-13
    • 1970-01-01
    • 2018-03-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多