将字符转换为R中的日期

问题描述:

我对R相对较新,但这是我第一次必须处理日期转换。我从CSV读取数据(使用read.table()),但是我缩短了数据以突出显示我的问题。当读入R时,日期字段是字符。将字符转换为R中的日期

简单地说,除了少数情况外,我的大部分日期都会被正确强制。下面的例子会希望告诉你发生了什么。

# my attempt to coerce the date -- uses the stringr package 
prods.all$Date2 <- as.Date(str_sub(prods.all$Date, 1, 
       str_locate(prods.all$Date, " ")[1]-1), 
       "%m/%d/%Y") 

# grab two rows to highlight my issue 
temp <- prods.all[c(1925:1926), c(1,8)] 

> temp 
        Date  Date2 
1925 10/9/2009 0:00:00 2009-10-09 
1926 10/15/2009 0:00:00 0200-10-15 

正如您所看到的,某些日期的年份并不准确。这种模式似乎发生在一天是两位数的时候。

我已经浏览了几本书,并试图Google更好的方式,但一切似乎表明,我的数据输入格式不正确。

鉴于R的功能强大,我认为有一种非常简单的方法可以强制我的列成为有效的日期,并且我忽略了一个非常明显的解决方案。

任何帮助,您可以提供将不胜感激。

+0

的原因,你所得到的是无效0200的日期是一天中的字符长度不同(15-Oct为两位数字,9-10月为一位数字) - 而您的字符串替换代码并不能解释这一点。无论如何,您可以直接使用as.Date或strptime格式agument,而无需进一步处理字符。 – mdsumner 2010-11-30 04:21:06

您可能会过于复杂的东西,是否有任何理由需要stringr包?

df <- data.frame(Date = c("10/9/2009 0:00:00", "10/15/2009 0:00:00")) 
as.Date(df$Date, "%m/%d/%Y %H:%M:%S") 

[1] “2009-10-09”, “2009-10-15”

更一般地,如果需要的时间分量为好,使用strptime:

strptime(df$Date, "%m/%d/%Y %H:%M:%S") 

我猜测你的实际数据可能会从你给出的部分结果中看出来。

+0

我会提防`strptime`,因为它会返回一个'POSIXlt`对象,这往往会让新用户适应,因为他们没有意识到这是一个列表。如果您需要时间,请使用`as.POSIXct`,但要小心如果您的“日期”真的是因素... – 2010-11-30 04:44:30

+1

是真的,但因为R 2.11.0“长度()现在返回相应抽象时间向量的长度而不是总是9(基础列表结构的长度)(公关#14073和公关#10507的愿望)“所以我想知道这是否值得使用复杂的东西。无论如何,你可以像as.POSIXct(strptime(x))一样。 – mdsumner 2010-11-30 06:19:26

最简单的方法是使用lubridate:

library(lubridate) 
prods.all$Date2 <- mdy(prods.all$Date2) 

此功能自动返回POSIXct类的对象,将与任何因素或字符工作。

library(lubridate) 如果你的日期格式是这样的'04 /2017分之2405:35:00'then改变它像下面 prods.all$Date2<-gsub("/","-",prods.all$Date2) 然后更改日期格式 parse_date_time(prods.all$Date2, orders="mdy hms")