5

我正在通过分析自行车比赛的结果来学习 R,但我遇到了时间数据问题(一个人完成比赛花了多少时间)。

时间数据的格式为“HH:MM:SS”。

我尝试将其转换为 posixct 但它向其中添加了一个日期组件。我也尝试了 chron 包,但它不会让我将数字除以时间对象

我想做的一件事是使用这段时间计算平均速度,所以我需要能够将距离除以时间。

4

3 回答 3

5

该包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

你有它:以公里/小时为单位的速度。

于 2013-01-23T13:30:51.280 回答
5

我会使用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> 
于 2013-01-23T13:35:37.527 回答
5

你看到的不是真正的时间,而是经过的时间。有经过时间的数据类型。在基础 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
于 2013-01-23T19:31:36.653 回答