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

Posted

技术标签:

【中文标题】将日期时间字符串转换为日期类【英文标题】:Convert date-time string to class Date 【发布时间】:2011-05-17 15:44:30 【问题描述】:

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

当我使用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

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

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

【问题讨论】:

您获得无效 0200 日期的原因是当天的字符长度不同(15 月 15 日为两位,10 月 9 日为一位)-您的字符串替换代码不是考虑到这一点。无论如何,您可以直接将 as.Date 或 strptime 与格式参数一起使用,而无需进一步处理字符。 【参考方案1】:

你可能把事情复杂化了,你有什么理由需要 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详细信息 部分中找到。确保转换规范的 order 以及任何 分隔符 与您的 input 字符串的格式完全对应。


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

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

我从你给出的部分结果中猜测你的实际数据可能会是什么样子。

【讨论】:

我会提醒不要使用strptime,因为它返回一个POSIXlt 对象,这往往会让新用户适应,因为他们没有意识到这是一个列表。如果您需要时间,请使用as.POSIXct,但请注意您的“日期”是否真的是因素...... true,但由于 R 2.11.0 "length() 现在返回相应抽象时间日期向量的长度,而不是总是 9(底层列表结构的长度)。(希望PR#14073 和 PR#10507。)”所以我想知道这是否值得让事情复杂化。无论如何,您都可以使用 as.POSIXct(strptime(x))。 我没有意识到这一点。感谢您的指点。虽然我想知道如果您在 data.frame 中有一个 POSIXlt 列是否仍然会令人困惑... 之后我意识到这并不完全有帮助 - 在 data.frame 中你仍然会遇到麻烦,尽管我认为可以将列表和数组等放在 data.frames 中作为列。但我认为最好了解 lt/ct 的区别并谨慎使用。 这对我来说似乎是一种误导,因为 as.Date 返回的 Date 类实际上并不处理时间。答案暗示确实如此。【参考方案2】:

library(lubridate) 如果您的日期格式是这样的 '04/24/2017 05:35:00' 然后像下面这样更改 prods.all$Date2&lt;-gsub("/","-",prods.all$Date2) 然后更改日期格式 parse_date_time(prods.all$Date2, orders="mdy hms")

【讨论】:

【参考方案3】:

最简单的方法是使用lubridate:

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

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

【讨论】:

我会提到该库中存在 ymd()、ymd_hms()、myd_hms() 等东西,以便一起处理日期和时间字段。顺便说一句,很棒的图书馆。我向你致敬... lubridate 是一个很棒的包。我在 2018 年仍在使用它并且无法获得足够的它。 github.com/rstudio/cheatsheets/raw/master/lubridate.pdf有一个“润滑”备忘单@ @hadley 当我成为国王时,你将被封为爵士。

以上是关于将日期时间字符串转换为日期类的主要内容,如果未能解决你的问题,请参考以下文章

将日期字符串转换为正确的格式

java中如何将字符串转换成日期型

如何将日期字符串转换为日期或日历对象?

python模块datetime将字符串转换为日期

将纪元时间转换为人类日期时间字符串,无需夏令时转换

linq 怎么转换日期为字符串