The Date Class
R has a special representation of date and time objects; dates are represented by the Date class, while times and intervals are represented by the POSIXct or POSIXlt classes.
Dates are stored internally as the number of days since 1/1/1970 while times and intervals are stored internally as the number of seconds elapsed since 1/1/1970
Classes for Times and Intervals
Dates are represented by the Date class and can be coerced (known as cast in other languages) by a string of characters as follows
x <- as.Date("1970-01-01")
x
[1] "1970-01-01"
> class(x)
[1] "Date"
Times and time intervals are represented using the classes
POSIXct and POSIXlt classes
-
POSIXctunder the “hood” is just a large integer and is used when you want to store times in something like a data frame -
POSIXltis stored internally as a list and contains a variety of other useful information such as day of the week, day of the year, and month (making it most useful when you need to perform manipulations)
There are a number of generic functions for date and time type objects
weekdays: returns the day of the weekmonths: returns the name of the monthquarters: returns the number of the quarter (“Q1”, “Q2”, “Q3”, “Q4”)
times can be obtained from a character string using the functions as.POSIXlt or as.POSIXct.
t1 <- Sys.time()
posix1<- as.POSIXlt(t1)
posix1$sec # extracts the seconds, I can do this because I built it as POSIXlt
or I can use the POSIXct format.
if dates are written in a different format, the strptime function can be used
datestring <- c("January 10, 2012 10:40", "December 9, 2011 9:10")
x <- strptime(datestring, "%B %d, %Y %H:%M")
#returns "2012-01-10 10:40:00 EST" "2011-12-09 09:10:00 EST" and interestingly I applied it to a list
Operations on Date and POSIX* type objects
You can use the mathematical operations + and - on dates and times as well as comparison operations such as == and <=
lct <- Sys.getlocale("LC_TIME"); Sys.setlocale("LC_TIME", "C")
x <- as.Date("2012-01-01");y <- strptime("January 10, 2012 10:40", "%B %d, %Y %H:%M")
x-y
Error in x - y : non-numeric argument transformed into binary operator
Also: Warning message:
Incompatible methods ("-.Date", "-.POSIXt") for "-"
x <- as.POSIXlt(x) # the types were incompatible I transform everything to POSIXlt
x-y
Time difference of -9.402778 days
# unclass also tells us that the only attribute we can draw on is the one we have already obtained, namely the difference in days
> unclass(difference)
[1] -9.402778
attr(, "units")
[1] "days"
# as anticipated I can also apply the sorting operators
x>y
[1] FALSE
R also keeps track of leap years, daylight saving time and time zones.
> x <- as.Date("2012-03-01")
> y <- as.Date("2012-02-28")
> x-y
Time difference of 2 days
x <- as.POSIXct("2012-10-25 01:00:00")
y <- as.POSIXct("2012-10-25 06:00:00", tz = "GMT")
y-x
Time difference of 1 hour
