将字符转换为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的功能强大,我认为有一种非常简单的方法可以强制我的列成为有效的日期,并且我忽略了一个非常明显的解决方案。
任何帮助,您可以提供将不胜感激。
您可能会过于复杂的东西,是否有任何理由需要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")
我猜测你的实际数据可能会从你给出的部分结果中看出来。
我会提防`strptime`,因为它会返回一个'POSIXlt`对象,这往往会让新用户适应,因为他们没有意识到这是一个列表。如果您需要时间,请使用`as.POSIXct`,但要小心如果您的“日期”真的是因素... – 2010-11-30 04:44:30
是真的,但因为R 2.11.0“长度(
最简单的方法是使用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")
的原因,你所得到的是无效0200的日期是一天中的字符长度不同(15-Oct为两位数字,9-10月为一位数字) - 而您的字符串替换代码并不能解释这一点。无论如何,您可以直接使用as.Date或strptime格式agument,而无需进一步处理字符。 – mdsumner 2010-11-30 04:21:06