33

R has is.vector, is.list, is.integer, is.double, is.numeric, is.factor, is.character, etc. Why is there no is.POSIXct, is.POSIXlt or is.Date?

I need a reliable way to detect POSIXct object, and class(x)[1] == "POSIXct" seems really... dirty.

Zach
  • 29,791
  • 35
  • 142
  • 201

3 Answers3

35

I would personally just use inherits as joran suggested. You could use it to create your own is.POSIXct function.

# functions
is.POSIXct <- function(x) inherits(x, "POSIXct")
is.POSIXlt <- function(x) inherits(x, "POSIXlt")
is.POSIXt <- function(x) inherits(x, "POSIXt")
is.Date <- function(x) inherits(x, "Date")
# data
d <- data.frame(pct = Sys.time())
d$plt <- as.POSIXlt(d$pct)
d$date <- Sys.Date()
# checks
sapply(d, is.POSIXct)
#   pct   plt  date 
#  TRUE FALSE FALSE 
sapply(d, is.POSIXlt)
#   pct   plt  date 
# FALSE  TRUE FALSE 
sapply(d, is.POSIXt)
#   pct   plt  date 
#  TRUE  TRUE FALSE 
sapply(d, is.Date)
#   pct   plt  date 
# FALSE FALSE  TRUE 
Community
  • 1
  • 1
Joshua Ulrich
  • 173,410
  • 32
  • 338
  • 418
21

The lubridate package has is.POSIXt, is.POSIXct, is.POSIXlt, and is.Date functions.

eipi10
  • 91,525
  • 24
  • 209
  • 285
9

You can try is(). This is what the lubridate functions is.Date and is.POSIX* rely on anyway.

x <- Sys.time()
class(x)
# [1] "POSIXct" "POSIXt" 
is(x, "Date")
#v[1] FALSE
is(x, "POSIXct")
# [1] TRUE

y <- Sys.Date()
class(y)
# [1] "Date"
is(y, "POSIXct")
# [1] FALSE
is(y, "Date")
# [1] TRUE
Rich Scriven
  • 97,041
  • 11
  • 181
  • 245
  • 4
    Not that it really matters in this case, but `inherits` was designed for S3 and goes straight to C code, while `is` needs to handle S4 and makes several calls to other R functions. – Joshua Ulrich Oct 16 '14 at 20:49