处理包含星期几的日期时间字符串

时间:2016-12-12 17:41:56

标签: r regex datetime

我有一个日期时间字符串,其中包含星期几和字符串中的一些元数据。

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)

现在我可以将其转换为类DatePosixltPosixct的日期时间对象,以便用于分析。

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")

2 个答案:

答案 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"