将格式为m / d / yy的orderdate转换为R中的YYYY-MM-DD

时间:2017-12-06 17:26:14

标签: r

我的orderdate是因素,我想将其转换为mm / dd / yy格式为YYYY-MM-DD格式。

 orderdate : Factor w/ 155932 levels "1/1/2017 1:05:00 AM",..: 41 1 1 89 100 102 106 107 119 122 ...

我尝试了几件事:

orders2017$newdate <- (factor(orders2017$orderdate))
orders2017$newdate1 <- as.Date(orders2017$newdate,format="%Y-%m-%d")

但没有任何结果,并且给我新的列为空。任何帮助表示赞赏

2 个答案:

答案 0 :(得分:2)

如果您确实拥有"1/1/2017 1:05:00 AM"之类的值,那么这些日期并不是日期,因此您必须为日期和时间部分指定格式字符。

所以,首先你需要通过指定日期时间的所有部分,将你的日期时间变成R所理解的形式(例如POSIXct):

test <- as.POSIXct("1/1/2017 1:05:00 AM", format = '%m/%d/%Y %I:%M:%S %p')
test

> test
[1] "2017-01-01 01:05:00 CST"

如果您不熟悉上面使用的所有格式化占位符,请参阅?strftime,并注意使用%I%p的条件。

然后您可以将POSIXct矢量转换为您想要的日期格式

format(test, format = '%Y-%m-%d')

> format(test, format = '%Y-%m-%d')
[1] "2017-01-01"

对您而言,一个复杂因素是R已将您的角色日期时间转换为因子,因此您需要在转换为日期时间之前将它们转换回字符向量。例如(未进行测试,因为您没有提供示例数据)

orders2017 <- transform(orders2017,
                        orderdate = as.POSIXct(as.character(orderdate),
                                               format = '%m/%d/%Y %I:%M:%S %p'))
orders2017 <- transform(orders2017,
                        newdate = format(orderdate, format = '%Y-%m-%d'))

答案 1 :(得分:1)

您与as.Date(orders2017$newdate,format="%Y-%m-%d")非常接近,您只需要使format字符串与您的实际格式匹配。

您的实际格式为mm / dd / YYYY,因此请使用%m/%d/%Y作为格式字符串:

as.Date("1/1/2017 1:05:00 AM", format = "%m/%d/%Y")
# [1] "2017-01-01"

然后默认打印Date格式对象就是你想要的。

所以对于你的数据,

orders2017$newdate1 <- as.Date(orders2017$newdate,format="%Y/%m/%d")

时间部分将被忽略。