从字符串中提取时间戳并转换为R POSIXct对象

时间:2018-06-13 17:03:05

标签: r lubridate

目前,我的数据集有一个时间变量(因子),格式如下:

weekday month day hour min seconds +0000 year

我不知道“+0000”字段是什么,但所有观察都有这个。例如:

"Tues Feb 02 11:05:21 +0000 2018" 
"Mon Jun 12 06:21:50 +0000 2017"
"Wed Aug 01 11:24:08 +0000 2018"

我想将这些值转换为POSIXltPOSIXct个对象(年 - 月 - 日小时:分:秒),并将它们设为数字。目前,使用as.numeric(as.character(time-variable))输出的值不正确。

感谢您的回复!我非常感激。

2 个答案:

答案 0 :(得分:1)

不确定如何重现从因子到char的转换,但从此代码开始应该起作用:

t <- unlist(strsplit(as.character("Tues Feb 02 11:05:21 +0000 2018")," "))
strptime(paste(t[6],t[2],t[3], t[4]),format='%Y %b %d %H:%M:%S')

PS:有关日期格式和转化的更多信息:https://www.stat.berkeley.edu/~s133/dates.html

答案 1 :(得分:0)

对于此问题,您可以不使用lubridate。首先,要提取个别日期,我们可以使用regmatchesgregexpr

date_char <- 'Tue Feb 02 11:05:21 +0000 2018 Mon Jun 12 06:21:50 +0000 2017'
ptrn <- '([[:alpha:]]{3} [[:alpha:]]{3} [[:digit:]]{2} [[:digit:]]{2}\\:[[:digit:]]{2}\\:[[:digit:]]{2} \\+[[:digit:]]{4} [[:digit:]]{4})'
date_vec <- unlist( regmatches(date_char, gregexpr(ptrn, date_char)))

> date_vec
[1] "Tue Feb 02 11:05:21 +0000 2018" "Mon Jun 12 06:21:50 +0000 2017"

您可以详细了解正则表达式here

在上面的示例中,+0000字段是UTC偏移量,以小时为单位,例如对于-0500时区,它将是EST。要转换为R日期时间对象:

> as.POSIXct(date_vec, format = '%a %b %d %H:%M:%S %z %Y', tz = 'UTC')
[1] "2018-02-02 11:05:21 UTC" "2017-06-12 06:21:50 UTC"

这是所需的输出。可以找到here格式,也可以使用lubridate::guess_formats()。如果您没有指定tz,那么您将在系统的时区中获得输出(例如,对于我来说,EST)。由于偏移量是以格式指定的,因此R正确执行转换。

要获取数值,以下方法有效:

> as.numeric(as.POSIXct(date_vec, format = '%a %b %d %H:%M:%S %z %Y', tz = 'UTC'))
[1] 1517569521 1497248510

注意:这是基于统一的字符串结构。在OP中,有Tues而不是Tue,这是行不通的。上面的例子基于三个字母的缩写,这是标准的报告格式。

但是,如果您的数据是不同格式的混合,您必须提取单个时间字符串(当然是自定义正则表达式),然后使用lubridate::guess_formats()获取格式,然后使用这些格式进行转换。

希望这有用!!