【问题标题】:How to work with times, distance and speed?如何处理时间、距离和速度?
【发布时间】:2013-01-23 03:34:40
【问题描述】:

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

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

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

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

【问题讨论】:

  • 将其转换为秒或更小。小时和分钟的表示实际上只是为了演示。
  • 您可能会发现 lubridate 包在处理日期时很有帮助。有一个 PDF 描述了在 Journal of Statistical Software 上发表的名为“使用 lubridate 轻松实现日期和时间”的软件包。快速搜索一下就可以了。

标签: r time-series


【解决方案1】:

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"

您可以执行速度计算,但您需要使用 as.numeric 将类从 dates 转换为数字。

dist <- 42.2
as.numeric(dist/x/24)
[1] 20.09524 11.80420 10.00856

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

【讨论】:

    【解决方案2】:

    我会使用POSIXct,您在基础 R 和附加包中拥有迄今为止最强大的支持。

    每当我使用与日期无关的日内数据时,我只需添加一个基准日期,例如当年的 1 月 1 日。对于所有的比较、差异等,这都会消失。

    另外值得注意的是:POSIXct 变量的as.numeric() 让您恢复到正常数字(自纪元以来的秒数.亚秒),这对于算术和需要存储(在没有日期时间的数据库中)都很方便),或转移到另一个系统或语言。每个人都有浮点数和(小数)秒,因为纪元很容易。 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> 
    

    【讨论】:

      【解决方案3】:

      您所看到的不是真正的时间,而是经过的时间。有经过时间的数据类型。在基础 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
      

      【讨论】:

        猜你喜欢
        • 2020-07-05
        • 1970-01-01
        • 2020-11-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-03
        • 1970-01-01
        相关资源
        最近更新 更多