在posixct向量上使用grep

时间:2017-11-14 09:18:26

标签: r posixct

我有多个日期时间列,我需要验证其中哪些属于时区 CEST

dat <- structure(c(1491199401.363, 1491201912.62, 1491205392.67, 1491205933.457, 1491206198.027, 1491206802.243), class = c("POSIXct", "POSIXt"), tzone = "")
dat
#[1] "2017-04-03 08:03:21 CEST" "2017-04-03 08:45:12 CEST" [3]
#"2017-04-03 09:43:12 CEST" "2017-04-03 09:52:13 CEST" [5] "2017-04-03
#09:56:38 CEST" "2017-04-03 10:06:42 CEST"

any(grep("CEST", dat))
#[1] FALSE
any(grep("CEST", "2017-04-03 08:03:21 CEST"))
#[1] TRUE

如果我将元素复制/粘贴到grep函数中,我可以使用此方法,但如果我在向量本身上运行它,则不行。使用as.character(dat)也无效。我该怎么做?

1 个答案:

答案 0 :(得分:0)

我们可以使用format提取时区并使用%in%来获取

"CEST" %in% format(dat, format="%Z")
#[1] TRUE

转换为unclass并提取POSIXlt

后,另一个选项是zone
"CEST" %in% unclass(as.POSIXlt(dat))$zone
#[1] TRUE

在OP grep ping的单个元素中,它是character类,而datPOSIXct类。因此,它将能够使用grep找到子字符串。即使我们将'dat'转换为character,它也会失去属性,即

as.character(dat)
#[1] "2017-04-03 08:03:21" "2017-04-03 08:45:12" "2017-04-03 09:43:12" "2017-04-03 09:52:13" "2017-04-03 09:56:38" "2017-04-03 10:06:42"

因此grep将无法选择

grepl("CEST", as.character(dat))
#[1] FALSE FALSE FALSE FALSE FALSE FALSE