在R中转换日期/时间

问题描述 投票:0回答:2

我正在努力地使用R中的日期时间格式。我确信这是一个简单的解决方法……有人可以给我写一行代码,它将Year,M,D,Time的所有值转换为新列”日期时间”?

看起来像什么:

x year m   d   time
A 2019 2   23  11:12 PM
B 2019 1   31   2:04 PM
C 2018 12  31  12:01 AM
D 2017 2   1   10:14 AM

我想要的是:

x datetime
A 2/23/19 11:12 PM
B 1/31/19 11:12 PM
C 12/31/18 12:01 AM
D 2/23/17 10:14 PM
r date time
2个回答
3
投票

由于它是日期时间值,我们可以通过将值粘贴在一起将其转换为标准格式。

df$datetime <- with(df, as.POSIXct(paste(year, m, d, time), 
                        format = "%Y %m %d %I:%M %p", tz = "UTC"))

df
#  x year  m  d    time            datetime
#1 A 2019  2 23 11:12PM 2019-02-23 23:12:00
#2 B 2019  1 31  2:04PM 2019-01-31 14:04:00
#3 C 2018 12 31 12:01AM 2018-12-31 00:01:00
#4 D 2017  2  1 10:14AM 2017-02-01 10:14:00

或使用lubridate

library(dplyr)
library(lubridate)

df %>% mutate(datetime = ymd_hm(paste(year, m, d, time)))

数据

df <- structure(list(x = structure(1:4, .Label = c("A", "B", "C", "D"
), class = "factor"), year = c(2019L, 2019L, 2018L, 2017L), m = c(2L, 
1L, 12L, 2L), d = c(23L, 31L, 31L, 1L), time = c("11:12 PM", 
"2:04 PM", "12:01 AM", "10:14 AM")), row.names = c(NA, -4L), class = "data.frame")

1
投票

我认为以下内容应能达到您的目标:

df <- data.frame(datetime = apply(df,1, function(v) sprintf("%s/%s/%s %s",v["d"], v["m"], v["year"], v["time"])))

如果要将新列附加到现有data.frame df,则使用:

df$datetime <- apply(df,1, function(v) sprintf("%s/%s/%s %s",v["d"], v["m"], v["year"], v["time"]))
© www.soinside.com 2019 - 2024. All rights reserved.