将日期时间字符串转换为日期类
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.POSIXct
或 strptime
:
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(data.frame
中有一个 POSIXlt
列是否仍然会令人困惑...
之后我意识到这并不完全有帮助 - 在 data.frame 中你仍然会遇到麻烦,尽管我认为可以将列表和数组等放在 data.frames 中作为列。但我认为最好了解 lt/ct 的区别并谨慎使用。
这对我来说似乎是一种误导,因为 as.Date 返回的 Date 类实际上并不处理时间。答案暗示确实如此。【参考方案2】:
library(lubridate)
如果您的日期格式是这样的 '04/24/2017 05:35:00' 然后像下面这样更改
prods.all$Date2<-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 当我成为国王时,你将被封为爵士。以上是关于将日期时间字符串转换为日期类的主要内容,如果未能解决你的问题,请参考以下文章