R - 将变量格式从int更改为小时

时间:2013-12-31 14:56:55

标签: r time

我在数据框中有一个列,其中报告了事件发生的小时。只是几小时,而不是几分钟或几秒钟。 这被格式化为整数,但我想让R将其读作一小时(时间)。我已经检查了as.Date的文档,但没有什么可以帮助我。

我已尝试使用以下命令,但它会返回错误消息:

> attach(data)
> Hour <- as.Date(Hour, "%H")

但它返回以下错误消息:

Error in charToDate(x) : 
  character string is not in a standard unambiguous format

非常感谢,

詹卢卡

2 个答案:

答案 0 :(得分:2)

日期对象是时间点 - 日期和时间也是如此。

如果您想将小时格式化为一种不错的格式,请使用sprintf

 sprintf("%02d:00",1:24)
 [1] "01:00" "02:00" "03:00" "04:00" "05:00" "06:00" "07:00" "08:00" "09:00"
[10] "10:00" "11:00" "12:00" "13:00" "14:00" "15:00" "16:00" "17:00" "18:00"
[19] "19:00" "20:00" "21:00" "22:00" "23:00" "24:00"

但这只是为了你想要漂亮的输出,而不是计算。

这是另一个想法。为小时整数创建一个类......

> h = 1:24
> class(h)="hours"
> h
 [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
attr(,"class")
[1] "hours"

到目前为止所做的就是添加'class'属性。我们来写一个格式方法:

 format.hours<- function(x,...){sprintf("%02d:00",x)}
 format.hours(h)
 [1] "01:00" "02:00" "03:00" "04:00" "05:00" "06:00" "07:00" "08:00" "09:00"
[10] "10:00" "11:00" "12:00" "13:00" "14:00" "15:00" "16:00" "17:00" "18:00"
[19] "19:00" "20:00" "21:00" "22:00" "23:00" "24:00"

我们不想继续输入format所以让我们把它挂钩到打印功能中:

> print.hours <- function(x,...){print(format(x))}
> h
 [1] "01:00" "02:00" "03:00" "04:00" "05:00" "06:00" "07:00" "08:00" "09:00"
[10] "10:00" "11:00" "12:00" "13:00" "14:00" "15:00" "16:00" "17:00" "18:00"
[19] "19:00" "20:00" "21:00" "22:00" "23:00" "24:00"

甜。我们还可以使用小时类向量创建数据框列:

 df = data.frame(h = as.numeric(h),x=runif(24)) ; class(df$h)="hours"
 df
       h          x
1  01:00 0.74339236
2  02:00 0.61240165
3  03:00 0.65007809
4  04:00 0.24844327
5  05:00 0.80499618

如果您编写更多数据框方法,可以使最后一个示例更好地工作。

然后你可以继续编写小时类的算术方法,这样增加小时数就不会达到24(它只是mod 24 airthmetic),或者你可以修改它来包括分钟,秒和打包一个整体加载时钟处理代码....

但是我已经飞得很好了......

答案 1 :(得分:0)

我建议您从lubridate包(http://cran.r-project.org/web/packages/lubridate/index.html)开始,该包具有一系列深思熟虑的时间处理函数。你最终可能不会使用它们,但文档肯定会让你思考整个问题,你肯定会发现它有用。

例如,您可以显式表示持续时间,然后将它们与传统的时间表示结合使用,例如日期或时间类:

> dminutes(3)
[1] "180s (~3 minutes)"
> Sys.Date()
[1] "2013-12-31"
> Sys.Date() - dminutes(3)
[1] "2013-12-30 23:57:00 UTC"

文档说,

"Details

When paired with date-times, these functions allow date-times to be manipulated in a method similar to object oriented programming. Period objects can be added to Date, POSIXct, and POSIXlt objects to calculate new date-times."