目前,我的数据集有一个时间变量(因子),格式如下:
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"
我想将这些值转换为POSIXlt
或POSIXct
个对象(年 - 月 - 日小时:分:秒),并将它们设为数字。目前,使用as.numeric(as.character(time-variable))
输出的值不正确。
感谢您的回复!我非常感激。
答案 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
。首先,要提取个别日期,我们可以使用regmatches
和gregexpr
:
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()
获取格式,然后使用这些格式进行转换。
希望这有用!!