在R中将字符转换为日期

时间:2010-11-30 03:40:28

标签: r lubridate

我对R比较陌生,但这是我第一次不得不处理日期转换。我从CSV读取数据(使用read.table()),但我缩短了数据以突出显示我的问题。当读入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有多强大,我认为有一种非常简单的方法可以强制我的专栏成为有效日期,而且我忽略了一个非常明显的解决方案。

非常感谢您提供的任何帮助。

3 个答案:

答案 0 :(得分:52)

最简单的方法是使用lubridate:

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

此函数自动返回类POSIXct的对象,并且可以使用因子或字符。

答案 1 :(得分:45)

你可能会过度复杂化,有什么理由需要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")

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

答案 2 :(得分:-1)

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