想要将以下内容合并到R中的datetime列中 数据

问题描述

我通过以下方式获得列

date,hour minute column

第一列在一起是年月日。 我想将第1、4、5列合并为R中的DateTime格式。请帮助我。我已经用as.date但出现错误

解决方法

以下函数将3列组合到类"POSIXct"的一个对象中。

  1. yyyymmdd格式组合年,月和日的列;
  2. 小时列;
  3. 分钟列。

秒设置为零。

toDateTime <- function(x){
  d <- as.Date(x[[1]],format = "%Y%m%d")
  ISOdatetime(format(d,"%Y"),format(d,"%m"),"%d"),hour = x[[2]],min = x[[3]],sec = 0L)
}

toDateTime(df1[c(1,4,5)])
# [1] "2001-01-01 01:00:00 WET" "2001-01-01 01:30:00 WET"
# [3] "2001-01-01 02:00:00 WET" "2001-01-01 02:30:00 WET"
# [5] "2001-01-01 03:00:00 WET" "2001-01-01 03:30:00 WET"
# [7] "2001-01-01 04:00:00 WET" "2001-01-01 04:30:00 WET"
# [9] "2001-01-01 05:00:00 WET" "2001-01-01 05:30:00 WET"
#[11] "2001-01-01 06:00:00 WET" "2001-01-01 06:30:00 WET"
#[13] "2001-01-01 07:00:00 WET" "2001-01-01 07:30:00 WET"

测试数据

在随后的测试数据中,我将第3列和第3列设置为NA,因为它们没有使用。

dates <- "20010101"
hour <- rep(1:7,each = 2)
min <- rep(c(0,30),length.out = 14)
df1 <- data.frame(dates,times = NA,d = NA,hour,min)
,

为了完整起见,这是一种不同的方法,该方法使用sprintf()创建一个字符日期时间向量,然后由as.POSIXct()进行转换。使用with(df1,)代替键入df1$datesdf1$hourdf1$min

with(df1,as.POSIXct(sprintf("%s%02i%02i",dates,min),tz = "UTC",format = "%Y%m%d%H%M"))
 [1] "2001-01-01 01:00:00 UTC" "2001-01-01 01:30:00 UTC" "2001-01-01 02:00:00 UTC"
 [4] "2001-01-01 02:30:00 UTC" "2001-01-01 03:00:00 UTC" "2001-01-01 03:30:00 UTC"
 [7] "2001-01-01 04:00:00 UTC" "2001-01-01 04:30:00 UTC" "2001-01-01 05:00:00 UTC"
[10] "2001-01-01 05:30:00 UTC" "2001-01-01 06:00:00 UTC" "2001-01-01 06:30:00 UTC"
[13] "2001-01-01 07:00:00 UTC" "2001-01-01 07:30:00 UTC"

还请注意,时区已明确设置。

另一种替代方法是使用anytime软件包:

with(df1,anytime::utctime(sprintf("%s %02i%02i",tz = "UTC"))
 [1] "2001-01-01 01:00:00 UTC" "2001-01-01 01:30:00 UTC" "2001-01-01 02:00:00 UTC"
 [4] "2001-01-01 02:30:00 UTC" "2001-01-01 03:00:00 UTC" "2001-01-01 03:30:00 UTC"
 [7] "2001-01-01 04:00:00 UTC" "2001-01-01 04:30:00 UTC" "2001-01-01 05:00:00 UTC"
[10] "2001-01-01 05:30:00 UTC" "2001-01-01 06:00:00 UTC" "2001-01-01 06:30:00 UTC"
[13] "2001-01-01 07:00:00 UTC" "2001-01-01 07:30:00 UTC"

请注意,不需要格式说明符。在dateshour之间只需插入一个空格。

最后,可以使用lubridate软件包:

with(df1,lubridate::ymd_hm(sprintf("%s%02i%02i",min)))
 [1] "2001-01-01 01:00:00 UTC" "2001-01-01 01:30:00 UTC" "2001-01-01 02:00:00 UTC"
 [4] "2001-01-01 02:30:00 UTC" "2001-01-01 03:00:00 UTC" "2001-01-01 03:30:00 UTC"
 [7] "2001-01-01 04:00:00 UTC" "2001-01-01 04:30:00 UTC" "2001-01-01 05:00:00 UTC"
[10] "2001-01-01 05:30:00 UTC" "2001-01-01 06:00:00 UTC" "2001-01-01 06:30:00 UTC"
[13] "2001-01-01 07:00:00 UTC" "2001-01-01 07:30:00 UTC"

数据

df1 <- data.frame(dates = rep("20010101",14L),hour = rep(1:7,each = 2L),min = rep(c(0L,30L),7L))