R包从日期和小时构建时间对象(整数)

时间:2015-03-13 10:35:23

标签: r datetime posixct date-conversion

我以日期告诉当天的形式提供数据(格式为“YYYY-MM-DD”,例如“2015-03-11”,以及当天的小时编号(0-23)。

制作表格

的时间对象最方便的方法是什么
"2015-03-11" and hour = 0 ->  "2015-03-11 00:00"
"2015-03-11" and hour = 1 ->  "2015-03-11 01:00"
"2015-03-11" and hour = 2 ->  "2015-03-11 02:00"

我可以使用Base中的Date函数或来自xts或timeDate的函数。 应该很容易,但我相信那里的人很快就会知道。

编辑:数据以2列提供,一列为日期,另一列为数字。

4 个答案:

答案 0 :(得分:5)

您不需要外部包装来做到这一点 如果您的数据采用以下格式:

df=data.frame(date=c("2015-03-11","2015-03-11","2015-03-11"),hour=0:2)

只需应用以下功能:

format(as.POSIXct(df$date)+df$hour*60*60, format = "%Y-%m-%d %H:%M")

答案 1 :(得分:4)

假设我们有这个输入:

date <- c("2015-03-11", "2015-03-12")
hour <- 2:3

然后尝试其中一个:

1)chron

library(chron)
as.chron(date) + hour/24

,并提供:

[1] (03/11/15 02:00:00) (03/12/15 03:00:00)

2)POSIXct 。这个只使用R的基数,没有包:

as.POSIXct(date) + 3600 * hour    

在我的系统上给予:

[1] "2015-03-11 02:00:00 EDT" "2015-03-12 03:00:00 EDT"

如果您想在UTC时区中使用结果:

as.POSIXct(date, tz = "UTC") + 3600 * hour  

3)lubridate

library(lubridate)
ymd(date) + hours(hour)

,并提供:

[1] "2015-03-11 02:00:00 UTC" "2015-03-12 03:00:00 UTC"

如果你想要它在当前时区,那么:

ymd(date, tz = "") + hours(hour)

请注意,chron解决方案提供的日期/时间类不使用时区,从而消除了时区可能导致的许多问题。 POSIXct和lubridate解决方案在特定时区提供日期/时间,如图所示。

答案 2 :(得分:3)

你可以尝试

dtime <- with(df, as.POSIXct(sprintf('%s %02d', date, hour),
                    format = "%Y-%m-%d %H")) 

然后像其他帖子一样使用format

或者

 library(lubridate)
 ymd_h(with(df, sprintf('%s %02d', date, hour)))

或稍微紧凑

ymd_h(do.call(paste, df))

答案 3 :(得分:2)

试试这个。如果你愿意的话,你可以使用format在没有几秒钟的情况下格式化它,尽管我认为最好将它保存在POSIXct类中,以便你可以在之后操作它(添加删除天,秒等)< / p>

as.POSIXct(do.call(paste, df), format = "%Y-%m-%d %H")
## [1] "2015-03-11 00:00:00 IST" "2015-03-11 01:00:00 IST" "2015-03-11 02:00:00 IST"

但是,如果你坚持确切的输出,请点击这里format

的解决方案
format(as.POSIXct(do.call(paste, df), format = "%Y-%m-%d %H"), "%Y-%m-%d %H:%M")
## [1] "2015-03-11 00:00" "2015-03-11 01:00" "2015-03-11 02:00"

数据

df <- structure(list(V1 = structure(c(1L, 1L, 1L), .Label = "2015-03-11", class = "factor"), 
    V2 = 0:2), .Names = c("V1", "V2"), class = "data.frame", row.names = c(NA, 
-3L))