0

我在 R 中努力处理日期时间格式。我相信这是一个简单的解决方法......有人可以给我写一行代码,将 Year、M、D、Time 中的所有值转换为新列“datetime” ?

数据是什么样的:

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
4

2 回答 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")
于 2019-11-05T08:44:41.150 回答
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"]))
于 2019-11-05T09:04:16.490 回答