我想用R来计算R中两个军用时间(例如,13:00和7:00)之间的时差。假设我有以下数据表:
| ID| start.time | end.time |
| --|--|--|
| 1 |18点整|两点|
| 2 |18点整|20点整|
| 3 |两点|四点|
我想计算start.time和end. time之间的时间差。我希望我的结果如下:
| ID| start.time | end.time |diff|
| --|--|--|--|
| 1 |18点整|两点| 8 |
| 2 |18点整|20点整| 2 |
| 3 |两点|四点| 2 |
**as.POSIXct()
& difftime()
**我尝试过使用as.posixct(start.time, format = '%H:%M')
和as.POSIXct(end.time, format = '%H:%M')
将start.time和end.time转换为datetime类,并使用difftime()
查找它们之间的时间差。这只适用于2和3。对于第一个,as.POSIXct()
参数将所有时间转换为相同的日期,因此它们之间的差值不等于8。
- 我的问题是:是否有一个代码可以考虑所有这些场景?*
3条答案
按热度按时间ih99xse11#
你可以先将你的小时数转换成R POSIXct对象,然后如果
end.time
早于start.time
,则给end.time
加上一天。最后使用difftime
计算它们的小时数差,并删除任何不需要的列(最后一个select
函数)。字符串
xcitsw882#
下面的代码将实现您正在寻找的功能,尽管它可能很难泛化。
字符串
如果
end.time
较大,则只需从start.time
中减去end.time
。如果start.time
较大,则先从24中减去start.time
,然后加上end.time
。这取决于分钟是否无关紧要,因为我使用gsub()
删除了:
之后的所有内容。dnph8jn43#
您可以将24*60^2秒(一天)添加到行差小于零的日期时间。由于结果将是秒,因此我们将其除以
60^2
。matrixStats::rowDiffs
在这里将是 lightning 般的快。字符串
如果没有 matrixStats,你可以做以下事情,当然,这会更慢:
型
型