问题描述
我通过以下方式获得列
第一列在一起是年月日。 我想将第1、4、5列合并为R中的DateTime格式。请帮助我。我已经用as.date但出现错误。
解决方法
以下函数将3列组合到类"POSIXct"
的一个对象中。
- 以
yyyymmdd
格式组合年,月和日的列; - 小时列;
- 分钟列。
秒设置为零。
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$dates
,df1$hour
,df1$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"
请注意,不需要格式说明符。在dates
和hour
之间只需插入一个空格。
最后,可以使用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))