计算两列之间的时间差

16
在将POSIXCT格式的因子转换为日期时间格式后,我想要计算pos1和pos2之间的日期时间差异。但是,当我对整个数据集执行此操作时,控制台只输出数字,并且数据框以这些数字显示,如您所见。
在尝试计算差异时,如何在数据框中获取小时数?我正在使用lubridate包,是否有任何函数可以实现?
以下是描述RStudio中数据的示例代码/图片。
CR_Date <- data.frame(
  pos1="2014-07-01 00:00:00",
  pos2=c("2014-07-01 00:00:00","2014-07-01 10:15:00")
)
CR_Date[] <- lapply(CR_Date,as.POSIXct)
CR_Date

#        pos1                pos2
#1 2014-07-01 2014-07-01 00:00:00
#2 2014-07-01 2014-07-01 10:15:00

CR_Date$pos2[2] - CR_Date$pos1[2]
#Time difference of 10.25 hours
CR_Date$hours <- CR_Date$pos2 - CR_Date$pos1

在这里输入图片描述


2
它是以秒为单位,而不是小时。您可以将“CR_date”除以3600。 - user3710546
2个回答

25

首先,这与lubridate无关。

其次,RStudio在显示窗口中打印变量时出了问题。如果您在命令行窗口中输入CR_Date$hours,您会发现它会打印:

#Time differences in secs
#[1]     0 36900

并且head(CR_Date)的结果是:

#        pos1                pos2      hours
#1 2014-07-01 2014-07-01 00:00:00     0 secs
#2 2014-07-01 2014-07-01 10:15:00 36900 secs

其中任何一个都会让你知道它显示的是什么。

正如@Victorp所建议的那样,difftime是解决这个问题的方法:

CR_Date$hours <- with(CR_Date, difftime(pos2,pos1,units="hours") )
CR_Date

#        pos1                pos2       hours
#1 2014-07-01 2014-07-01 00:00:00  0.00 hours
#2 2014-07-01 2014-07-01 10:15:00 10.25 hours

12

您还可以使用"as.double方法"及其units参数(请参见?diffime):

as.double 方法 [as.double(x, units = "auto", ...)] 返回以指定单位表示的数值

...其中x

一个从类"difftime"继承而来的对象

应用于您的示例中,其中pos2 - pos1将导致一个difftime对象:

CR_Date$hours <- as.double(CR_Date$pos2 - CR_Date$pos1, units = "hours")
CR_Date

#        pos1                pos2 hours
#1 2014-07-01 2014-07-01 00:00:00  0.00
#2 2014-07-01 2014-07-01 10:15:00 10.25

或其他单位:

as.double(CR_Date$pos2 - CR_Date$pos1, units = "mins")
#[1]   0 615

as.double(CR_Date$pos2 - CR_Date$pos1, units = "days")
#[1] 0.0000000 0.4270833

1
对我来说也是新闻 - 显然,尽管很久以前就已经将其推广为转换difftime对象的“规范方式”! https://stat.ethz.ch/pipermail/r-help/2008-May/162719.html - thelatemail
是的,我认为我没有看到很多人使用它(至少在SO上)。 - Ronak Shah

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