44

我有一个带有日期时间字符列的数据框。

当我使用 时as.Date,我的大部分字符串都被正确解析,除了少数情况。下面的示例有望向您展示发生了什么。

# my attempt to parse the string to 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

如您所见,某些日期的年份不准确。当日期为两位数时,似乎会出现这种模式。

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

4

4 回答 4

81

最简单的方法是使用 lubridate:

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

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

于 2010-11-30T18:51:47.653 回答
65

你可能把事情复杂化了,你有什么理由需要 stringr 包吗?您可以使用as.Date及其format参数来指定字符串的输入格式。

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

请注意的详细信息部分?as.Date

根据指定格式尽可能处理字符串:忽略任何尾随字符

因此,这也有效:

as.Date(df$Date, format =  "%m/%d/%Y")
# [1] "2009-10-09" "2009-10-15"

可用于指定输入的所有转换规范都可以format在 中的详细信息部分中找到?strptime。确保转换规范的顺序以及任何分隔符与输入字符串的格式完全对应。


更一般地说,如果您还需要时间组件,请使用as.POSIXctor strptime

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

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

于 2010-11-30T04:17:02.193 回答
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")

于 2017-11-14T12:23:01.837 回答
0

如果您不知道可以使用的格式anytime::anydate,它会尝试匹配常见格式:

library(anytime)

date <- c("01/01/2000 0:00:00", "Jan 1, 2000 0:00:00", "2000-Jan-01 0:00:00")

anydate(date)
[1] "2000-01-01" "2000-01-01" "2000-01-01"
于 2022-02-04T18:09:21.500 回答