在R中计算行之间的日期时间差异

10

我希望在R中计算时间差(delta time)。时间戳存储在一个两列的数据框中,时间以日期-时间(年-月-日 时:分:秒.毫秒)的形式表示,例如前三行:

c_id    c_time
6875    2012-08-15 00:00:40.169
6874    2012-08-15 00:01:40.055
6876    2012-08-15 00:02:40.542

我想输出一个带有差异的列,例如:
c_diff
0
00:01:0.886
00:01:0.487

请问有人能告诉我如何做到这一点吗?如果您有其他/更好的建议如何保留结果,将不胜感激。 非常感谢您提前的帮助! Mishu


我在使用diff(c_time)时遇到了“意外数字常量”错误。另外,如何对所有行执行后续差异?谢谢! - Mishu
dput(yourdataframe) 的输出粘贴到上面的问题中,以便我们可以使用您的实际数据。 - Simon O'Hanlon
2012-09-06 11:41:38.978, "2012-09-06 11:42:38.514", "2012-09-06 11:43:39.001", 2012-09-06 11:44:38.656, "2012-09-06 11:45:38.923", "2012-09-06 11:46:38.999", 2012-09-06 11:47:38.375, "2012-09-06 11:48:38.091", "2012-09-06 11:49:37.646", 2012-09-06 11:50:37.272), class = "factor")), .Names = c("c_id", c_timestamp), class = "data.frame", row.names = c(NA, -32487L)) - Mishu
以上是从dput(mydataframe)输出的最后几行。谢谢! - Mishu
3个回答

7
尝试这个(我假设您的数据在名为mydfdata.frame中),并且您想要第一个时间戳和所有后续时间戳之间的差异:
c_time <- as.POSIXlt( mydf$c_time )
difftime( c_time[1] , c_time[2:length(c_time)] )
  #Time differences in secs
  #[1]  -59.886 -120.373
  #attr(,"tzone")
  #[1] ""

编辑

但是如果您想要连续时间戳之间的差异,您需要反转您的观察结果(因为第一次循环得到的是 time1 - time2,这将是负数),因此您可以使用以下方法代替:

c_time <- rev( c_time )
difftime(c_time[1:(length(c_time)-1)] , c_time[2:length(c_time)])
  #Time differences in secs
  #[1] 60.487 59.886
  #attr(,"tzone")
  #[1] ""

1
我不会给你完整的答案,但这将帮助你接近目标:
x="2012-07-11 04:22:40.169"
datex=strptime(x,format='%Y-%m-%d %H:%M:%S') #this converts your date string 
#into a date value recognized in r

y="2012-08-15 08:32:40.169"
datey=strptime(y,format='%Y-%m-%d %H:%M:%S')

time_diff=as.numeric(difftime(datey,datex)) #in decimal days
>35.17361

从十进制日期转换回你想要的任何时间格式,但是根据你想要做什么,你可能希望将其保留为数字形式(例如通过将time_diff乘以24转换为十进制小时)...


0

从另一列中减去连续行并创建新列的最多才多艺的方法之一是结合 dplyr::mutatedplyr::lag

df <- df %>%
  mutate(c_diff = c_time - lag(c_time,1))

我之所以说这个方法是多功能的,是因为它不受时间限制,并且适用于任何可减变量。例如,如果您有沿着高速公路的位置数据,您可以使用相同的代码计算公里或英里的变化。而且,如果您使用 dplyr::group_by,您可以对不同组(例如,在长数据集中为每个试验或个体重新启动任务)进行迭代执行。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接