在R中减去由日期和时间组成的两列

时间:2012-02-21 05:12:32

标签: r

我遇到了在单个单元格中减去包含日期和时间的表格的两列的问题。

> TimeData

DEPARTURE_TIME      LAB_TIME
1/30/2010 4:18      1/30/2010 0:29
1/30/2010 4:18      1/30/2010 0:29
1/30/2010 6:49      1/30/2010 0:48
1/30/2010 6:49      1/30/2010 0:48
1/30/2010 9:42      1/30/2010 1:29
1/30/2010 9:42      1/30/2010 1:29
1/30/2010 7:25      1/30/2010 1:16

我需要以小时和分钟的形式获得出发时间和实验室时间之间的差异。

我是否需要分开时间和日期,还是有办法以这种方式减去数据?

我真的很感激任何帮助。

1 个答案:

答案 0 :(得分:13)

试试TimeData$DEPARTURE_TIME - TimeData$LAB_TIME

这取决于您的xxx_TIME列是否为字符串,或者您是否已将它们转换为日期时间。

假设它们是字符串(它们是使用read.csv或类似的东西读过的);然后将它们转换为可以使用as.POSIXct的日期时间对象(请参阅?as.POSIXctstrptime):

# convert the string columns to dates
TimeData$DEPARTURE_TIME <- as.POSIXct(TimeData$DEPARTURE_TIME,
                                      format='%m/%d/%Y %H:%M')
TimeData$LAB_TIME       <- as.POSIXct(TimeData$LAB_TIME,
                                      format='%m/%d/%Y %H:%M')

注意format参数:看起来像你的月/日/年时:分钟(25小时制)格式。有关日期格式的详细信息,请参阅?strptime

然后要计算差异,你可以这样做:

diffs <- TimeData$DEPARTURE_TIME - TimeData$LAB_TIME

为您选择合适的时间单位,或者指定可以使用difftime的小时数(请参阅?difftime):

# like saying DEPARTURE_TIME-LAB_TIME but more control over the output
diffs <- difftime(TimeData$DEPARTURE_TIME,TimeData$LAB_TIME,units="hours")

生成的对象diffs如下所示:

> diffs
Time differences in hours
[1] 3.816667 3.816667 6.016667 6.016667 8.216667 8.216667 6.150000
attr(,"tzone")
[1] ""

要仅提取数字部分,请使用as.numeric(diffs)。 将其转换为小时矢量和分钟矢量......好吧,60分钟到一秒钟等等:

# use as.numeric(diffs) to retrieve just the vector.
# let's convert to hours & minutes...
diffs.hours <- floor(as.numeric(diffs))
diffs.minutes <- (as.numeric(diffs)%%1 * 60)

给你:

> diffs.hours
[1] 3 3 6 6 8 8 6
> diffs.minutes
[1] 49 49  1  1 13 13  9