我有一个包含日期的列的csv文件,但日期有两种不同的格式:“m / d / y H:M”和“y m d H:M:S”。我想以一种格式创建一个包含这些日期的新列(我不关心哪一个)。我尝试了parse_date_time函数,但它只适用于其中一种格式,而不是两种格式。我怎么能这样做呢?
以下是我尝试使用的代码:
newdata <- mutate(data,
newcolumn = parse_date_time(x = data$date_column,
orders = c("m/d/y H:M", "y m d H:M:S"),
locale = "eng") )
以下是该列的一些示例日期:
x <- c("6/21/2006 0:00",
"1889-06-13 00:00:00",
"6/28/2012 0:00",
"5/19/2015 0:00",
"6/6/2016 0:00",
"1884-05-24 00:00:00",
"7/28/2013 0:00")
答案 0 :(得分:2)
anytime
包就是这样 - 启发式地评估合理的格式:
R> library(anytime)
R> x <- c("6/21/2006 0:00",
+ "1889-06-13 00:00:00",
+ "6/28/2012 0:00",
+ "5/19/2015 0:00",
+ "6/6/2016 0:00",
+ "1884-05-24 00:00:00",
+ "7/28/2013 0:00")
R> anytime(x)
[1] "2006-06-21 CDT" "1889-06-13 CST" "2012-06-28 CDT"
[4] "2015-05-19 CDT" NA "1884-05-24 CST"
[7] "2013-07-28 CDT"
R>
默认情况下,它使用Boost的date_time库解析器,并且不执行单个数字月/日,因此元素6上的NA
。但我们还将R的解析器添加为后备:
R> anytime(x, useR=TRUE)
[1] "2006-06-21 CDT" "1889-06-13 CST" "2012-06-28 CDT"
[4] "2015-05-19 CDT" "2016-06-06 CDT" "1884-05-24 CST"
[7] "2013-07-28 CDT"
R>
所以所有只是工作没有单一的格式规范。
答案 1 :(得分:0)
所以我们首先将两者分开:
x <- c("03/20/2018 10:42", "2018-03-20 10:37:02")
DF <- data.frame(x = x, stringsAsFactors = FALSE)
slash_index <- grep("/", DF$x)
slash <- DF$x[slash_index]
dash <- DF$x[-slash_index]
然后我们转换它们。我喜欢lubridate,但如果您愿意,可以使用您的方法
library(lubridate)
slash <- mdy_hm(slash)
dash <- ymd_hms(dash)
然后我们将它们放入日期向量中:
date_times <- integer(0)
date_times[slash_index] <- slash
date_times[seq_along(DF$x)[-slash_index]] <- dash
DF$x <- as.POSIXct(date_times, origin = "1970-01-01 00:00:00")
DF
# x
# 1 2018-03-20 03:42:02
# 2 2018-03-20 03:37:02
注意:
这里棘手的部分是根据索引将矢量的一部分重新分配给矢量。当向量的一部分被分配给POSIXct
对象时,它的属性被剥离,将其转换为日期时间的内部整数代码。这是通过在开头剥离属性,然后在最后重新分配类来解决的。
以下是您的示例:
install.packages("lubridate")
library(lubridate)
x <- c("6/21/2006 0:00",
"1889-06-13 00:00:00",
"6/28/2012 0:00",
"5/19/2015 0:00",
"6/6/2016 0:00",
"1884-05-24 00:00:00",
"7/28/2013 0:00")
DF <- data.frame(x = x, stringsAsFactors = FALSE)
slash_index <- grep("/", DF$x)
slash <- DF$x[slash_index]
dash <- DF$x[-slash_index]
slash <- mdy_hm(slash)
dash <- ymd_hms(dash)
date_times <- integer(0)
date_times[slash_index] <- slash
date_times[seq_along(DF$x)[-slash_index]] <- dash
DF$x <- as.POSIXct(date_times, origin = "1970-01-01 00:00:00", tz = "UTC")
DF
# x
# 1 2006-06-21
# 2 1889-06-13
# 3 2012-06-28
# 4 2015-05-19
# 5 2016-06-06
# 6 1884-05-24
# 7 2013-07-28
由于这些都是"00:00:00"
的时间,因此它们已被截断。您可以使用this question的答案中描述的方法,使用"00:00:00"
显示它们。
答案 2 :(得分:0)
使用ColumnLayout
:
implicitHeight