减去R中的时间值

时间:2018-10-05 10:05:05

标签: r date time

我的值例如:

df[,1:2]

结果enter image description here

我想创建一个具有Ins和Outs区别的新列。 这些是TIME值 预期输出为:

1201 0718(忽略负值) ..依此类推。

2 个答案:

答案 0 :(得分:0)

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

这是您要寻找的吗?

答案 1 :(得分:0)

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

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

作为另一个挑战,没有以标准时间格式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"