将日期时间字符串转换为类日期

Convert date-time string to class Date

提问人:Btibert3 提问时间:11/30/2010 最后编辑:HenrikBtibert3 更新时间:2/5/2022 访问量:305434

问:

我有一个数据框,其中包含日期时间的字符列。

当我使用 时,除了少数实例外,我的大多数字符串都被正确解析。下面的例子希望能告诉你发生了什么。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

如您所见,某些日期的年份不准确。当一天达到两位数时,这种模式似乎会发生。

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

润滑剂 AS.Date R-FAQ

评论

0赞 mdsumner 11/30/2010
您收到无效的 0200 日期的原因是当天的字符长度不同(10 月 15 日为两位数,10 月 9 日为一位数字) - 您的字符串替代代码没有考虑到这一点。无论如何,您可能都可以用作。Date 或 strptime 直接使用格式 agument,无需进一步处理字符。

答:

79赞 mdsumner 11/30/2010 #1

您可能将事情复杂化了,您有什么理由需要纵梁包吗?您可以使用 and 其参数来指定字符串的输入格式。as.Dateformat

 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.POSIXctstrptime

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

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

评论

1赞 Joshua Ulrich 11/30/2010
我会告诫不要,因为它返回一个对象,这往往会给新用户带来契合,因为他们没有意识到它是一个列表。如果你需要时间,请使用,但要小心你的“日期”是否真的是因素......strptimePOSIXltas.POSIXct
1赞 mdsumner 11/30/2010
true,但从 R 2.11.0 开始,“length(<POSIXlt>) 现在返回相应抽象 timedate-vector 的长度,而不是总是 9(底层列表结构的长度)。(PR#14073 和 PR#10507 的愿望。所以我想知道这是否值得让事情复杂化。你可以像这样。无论如何,POSIXct(strptime(x))。
0赞 Joshua Ulrich 11/30/2010
我没有意识到这一点。谢谢你的指点。虽然我想知道如果你在 ...POSIXltdata.frame
0赞 mdsumner 12/1/2010
之后我意识到这并不完全有用 - 在 data.frame 中,您仍然会遇到麻烦,尽管我认为可以将列表和数组等作为列放在 data.frames 中。但我认为最好了解lt / ct的区别并谨慎使用它们。
1赞 Mike Wise 3/13/2015
这对我来说似乎具有误导性,因为 Date 类是。Date 返回实际上并不处理时间。答案意味着它确实如此。
91赞 hadley 12/1/2010 #2

最简单的方法是使用润滑剂:

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

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

评论

11赞 Mike Wise 3/13/2015
我将提到该库中存在诸如 ymd()、ymd_hms()、myd_hms() 等的东西来同时处理日期和时间字段。顺便说一句,很棒的图书馆。我向你致敬......
4赞 Lobbie 4/28/2018
Lubridate是一个很棒的包装。我在 2018 年仍在使用它,并且无法获得足够的它。github.com/rstudio/cheatsheets/raw/master/lubridate.pdf 有一张“润滑剂”备忘单
1赞 shekeine 1/21/2021
@hadley 当我作王时,你将被封为爵士。
0赞 Nayab khan 11/14/2017 #3

library(lubridate)如果您的日期格式是这样的“04/24/2017 05:35:00”,请按如下方式更改它,然后更改日期格式prods.all$Date2<-gsub("/","-",prods.all$Date2)parse_date_time(prods.all$Date2, orders="mdy hms")

评论

0赞 camille 11/30/2022
无需将斜杠更改为破折号,无论哪种方式都会解析它parse_date_time
1赞 LMc 2/5/2022 #4

如果您不知道可以使用的格式,它会尝试与常见格式匹配: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"