我正在通过分析自行车比赛的结果来学习 R,但我遇到了时间数据问题(一个人完成比赛花了多少时间)。
时间数据的格式为“HH:MM:SS”。
我尝试将其转换为 posixct 但它向其中添加了一个日期组件。我也尝试了 chron 包,但它不会让我将数字除以时间对象
我想做的一件事是使用这段时间计算平均速度,所以我需要能够将距离除以时间。
我正在通过分析自行车比赛的结果来学习 R,但我遇到了时间数据问题(一个人完成比赛花了多少时间)。
时间数据的格式为“HH:MM:SS”。
我尝试将其转换为 posixct 但它向其中添加了一个日期组件。我也尝试了 chron 包,但它不会让我将数字除以时间对象
我想做的一件事是使用这段时间计算平均速度,所以我需要能够将距离除以时间。
该包chron
有处理时间的类,使用的功能是,等待它,times()
. 这是一个使用典型时间进行标准马拉松比赛的示例:
library(chron)
tms <- c("2:06:00", "3:34:30", "4:12:59")
x <- times(tms)
你现在有一个times
对象,代表一天的一小部分。
str(x)
Class 'times' atomic [1:3] 0.0875 0.149 0.1757
..- attr(*, "format")= chr "h:m:s"
您可以执行速度计算,但您需要使用 将类从转换dates
为数字as.numeric
。
dist <- 42.2
as.numeric(dist/x/24)
[1] 20.09524 11.80420 10.00856
你有它:以公里/小时为单位的速度。
我会使用POSIXct
你迄今为止在基本 R 和附加包中获得最强大支持的那个。
每当我使用与日期无关的日内数据时,我只需添加一个基准日期,例如当年的 1 月 1 日。对于所有的比较、差异等,这都会消失。
还需要注意 as.numeric()
的是:POSIXct
变量可以让您恢复到正常数字(自纪元以来的秒数.亚秒),这对于算术和您需要存储(在没有日期时间的数据库中)或转移到另一个系统或语言时都很方便. 每个人都有浮点数和(小数)秒,因为纪元很容易。 POSIXct
为您提供格式化、序列、差异、绘图等方面的额外好处...
这是一个小例子:
R> txt <- c("08:09:10", "09:10:11", "10:11:12", "11:12:13")
R> times <- as.POSIXct(paste("2013-01-01", txt))
R> times
[1] "2013-01-01 08:09:10 CST" "2013-01-01 09:10:11 CST"
+ "2013-01-01 10:11:12 CST" "2013-01-01 11:12:13 CST"
R> times - times[1]
Time differences in secs
[1] 0 3661 7322 10983
attr(,"tzone")
[1] ""
R> as.numeric(times - times[1])
[1] 0 3661 7322 10983
R>
你看到的不是真正的时间,而是经过的时间。有经过时间的数据类型。在基础 R 中,difftime
该类执行此操作。
tms <- c("2:06:00", "3:34:30", "4:12:59", "08:09:10",
"09:10:11", "10:11:12", "11:12:13")
ta <- as.difftime(tms)
显示为
> ta
Time differences in hours
[1] 2.100000 3.575000 4.216389 8.152778 9.169722 10.186667 11.203611
attr(,"tzone")
[1] ""
> format(ta)
[1] " 2.100000 hours" " 3.575000 hours" " 4.216389 hours" " 8.152778 hours" " 9.169722 hours"
[6] "10.186667 hours" "11.203611 hours"
您也可以通过转换为数字来进行数学运算。
> 42.2/as.numeric(ta)
[1] 20.095238 11.804196 10.008564 5.176150 4.602102 4.142670 3.766643
该lubridate
包还具有处理经过时间的类型,特别是duration
.
library("lubridate")
ti <- as.duration(as.difftime(tms))
显示为
> ti
[1] 7560s (~2.1 hours) 12870s (~3.58 hours) 15179s (~4.22 hours) 29350s (~8.15 hours)
[5] 33011s (~9.17 hours) 36672s (~10.19 hours) 40333s (~11.2 hours)
并且您可以在转换为数字后使用 is 进行数学运算(这里是秒而不是小时)
> 42.2/as.numeric(ti)
[1] 0.005582011 0.003278943 0.002780157 0.001437819 0.001278362 0.001150742 0.001046290