我有一个日期时间字符串,其中包含星期几和字符串中的一些元数据。
d <- "Fri, 14 Jul 2000 06:59:00 -0700 (PDT)"
我需要将它转换为日期时间对象(例如,我在data.table中有一列这些对象)以供进一步分析。我已经使用正则表达式来处理这个问题,以从字符串中去除元数据。 有更好的方法吗?
我拥有的是:
m <- regexpr("^\\w+,\\s+", d, perl=TRUE)
regmatches(d, m)
m <- regexpr("\\s-?\\d+\\s\\(\\w+\\)$", d, perl=TRUE)
regmatches(d, m)
ds <- sub("^\\w+,\\s+", "", d)
ds <- sub("\\s-?\\d+\\s\\(\\w+\\)$", "", ds)
现在我可以将其转换为类Date
,Posixlt
或Posixct
的日期时间对象,以便用于分析。
dd <- strptime(ds, format="%d %b %Y %H:%M:%S")
dd <- as.Date(ds, format="%d %b %Y %H:%M:%S")
dd <- as.POSIXct(ds, format="%d %b %Y %H:%M:%S")
答案 0 :(得分:3)
我写了anytime package来帮助(除其他外)这些愚蠢的格式字符串 - 所以它启发式地尝试了一些(并专注于理智的)。
您在这里的输入符合条件(实际上是一种非常常见的形式):
R> anytime("Fri, 14 Jul 2000 06:59:00 -0700 (PDT)")
[1] "2000-07-14 06:59:00 CDT"
R>
我们不目前尝试在最后捕获时区偏移信息,因此您必须在事后处理。显示屏位于CDT,这是我当地的时区。
有关于anytime on its webpage的更多信息。
答案 1 :(得分:0)
假设字符串的格式在数据中保持不变:
time = trimws(unlist(strsplit(d, "[,-]"))[2])
#[1] "14 Jul 2000 06:59:00"
tz = unlist(strsplit(d, "[,-]"))[3]
tz = gsub("[^A-Z]", "", tz)
#[1] "PDT"
> as.Date(time, format = "%d %b %Y")
[1] "2000-07-14"
> as.POSIXct(time, format = "%d %b %Y %H:%M:%S") #specify th etimezone with tz
[1] "2000-07-14 06:59:00 IST"