使用不同格式解析日期

时间:2018-03-20 17:33:14

标签: r date parsing

我有一个包含日期的列的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")

3 个答案:

答案 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
相关问题