【问题标题】:computing and formatting averages and squares of time intervals计算和格式化时间间隔的平均值和平方
【发布时间】:2016-11-28 15:56:10
【问题描述】:

我有一个模型可以预测某些事件的持续时间,并测量这些事件的持续时间。然后我想计算预测和测量之间的差异、平均差异和 RMSE。我可以做到,但格式真的很尴尬,不是我所期望的:

database <- data.frame(Predicted = c(strptime(c("4:00", "3:35", "3:38"), format = "%H:%M")),
                       Measured = c(strptime(c("3:39", "3:40", "3:53"), format = "%H:%M")))
database
>             Predicted            Measured
1 2016-11-28 04:00:00 2016-11-28 03:39:00
2 2016-11-28 03:35:00 2016-11-28 03:40:00
3 2016-11-28 03:38:00 2016-11-28 03:53:00

这是第一个怪事:为什么 R 会显示时间日期,即使我明确指定了仅时间格式 (%H:%M),而且我的文件中没有日期数据开始?变得更奇怪了:

database$Error <- with(database, Predicted-Measured)
database$Mean_Error <- with(database, mean(Predicted-Measured))
database$RMSE <- with(database, sqrt(mean(as.numeric(Predicted-Measured)^2)))
> database
            Predicted            Measured    Error Mean_Error     RMSE
1 2016-11-28 04:00:00 2016-11-28 03:39:00  21 mins  0.3333333 15.17674
2 2016-11-28 03:35:00 2016-11-28 03:40:00  -5 mins  0.3333333 15.17674
3 2016-11-28 03:38:00 2016-11-28 03:53:00 -15 mins  0.3333333 15.17674

为什么变量Error 用分钟表示?对于Error,这不是一个糟糕的选择,但对于Mean_Error,它变得很难阅读。对于RMSE,情况更糟,但这可能是由于as.numeric 功能:如果我删除它,R 会抱怨'^' not defined for "difftime" objects。我的问题是:

  1. 是否可以显示以%H:%M 格式显示的前两列(PredictedMeasured)?
  2. 对于其他 3 列(ErrorMean_ErrorRMSE)我想在几秒钟内比较 %M:%S 格式和格式,然后在两者中进行选择。可能吗?

编辑:为了更清楚,我的目标是将时间间隔的观察结果插入数据帧并计算时间间隔差异向量。然后,计算该向量的一些统计数据:平均值、RMSE 等。我知道我可以输入以秒为单位的时间观测值,但这看起来不太好:很难说 13200 秒是 3 小时 40 分钟.因此,我希望能够将时间间隔存储在%H:%M 中,然后能够以代数方式操作它们并以我选择的格式显示结果。这可能吗?

【问题讨论】:

  • 对于第一个奇怪的东西,strptime 转换为POSIXlt,它会添加今天的日期。要仅显示小时和分钟,请使用:format(strptime(c("4:00", "3:35", "3:38"), format = "%H:%M"), format="%H:%M"),它们只是字符(即,您丢失了日期时间类)
  • @aichao,我试过database$Predicted &lt;- format(strptime(database$Predicted, format = "%H:%M"), format="%H:%M"),但我得到了&gt; database$Predicted [1] NA NA NA。我想这里真正的问题是我不需要 Date-Time 对象,但更像是一个时间间隔对象......是否有可能获得它? "

标签: r time


【解决方案1】:

我们可以使用difftime 来指定时间差的单位。 difftime 的输出是类 difftime 的对象。当这个 difftime 对象使用 as.numeric 强制转换为数字时,我们可以更改这些单位(参见 ?difftime 中的示例):

## Note we don't convert to date-time because we just want %H:%M
database <- data.frame(Predicted = c("4:00", "3:35", "3:38"),
                       Measured = c("3:39", "3:40", "3:53"))
## We now convert to date-time and use difftime to compute difference in minutes
database$Error <- with(database, difftime(strptime(Predicted,format="%H:%M"),strptime(Measured,format="%H:%M"), units="mins"))
## Use as.numeric to change units to seconds
database$Mean_Error <- with(database, mean(as.numeric(Error,units="secs")))
database$RMSE <- with(database, sqrt(mean(as.numeric(Error,units="secs")^2)))
##  Predicted Measured    Error Mean_Error     RMSE
##1      4:00     3:39  21 mins         20 910.6042
##2      3:35     3:40  -5 mins         20 910.6042
##3      3:38     3:53 -15 mins         20 910.6042

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-08
    相关资源
    最近更新 更多