R Programming Date and Time Tutorial
Created By: Debasis Das (4-Sep-2016)
In this tutorial we will see how date and time works in R Programming and we will create a lot of samples
Date & Time in R
- In R Programming Dates are represented by the Date Class and Times are represented by the POSIXct and POSIXlt classes.
- Dates are stored internally as the number of days since 1970-01-01
- In POSIXct Times are stored internally as the number of seconds since 1970-01-01
- In POSIXlt times are stored as list of seconds, minutes, hours etc
Date and Time in R Programming
Sys.date()
lets get started with an example
> date1 <- Sys.Date()
> date1
[1] “2016-09-04”
> class(date1)
[1] “Date”
> unclass(date1)
[1] 17048
when we unclassed date1 we saw the number of days passed since 1970-01-01
as.Date()
We can also create dates using as.Date() function
> date2 <- as.Date(“2016-09-09”)
> date2
[1] “2016-09-09”
> class(date2)
[1] “Date”
> unclass(date2)
[1] 17053
For creating dates prior to 1970-01-01
> date3<-as.Date(“1967-01-01”)
> date3
[1] “1967-01-01”
> class(date3)
[1] “Date”
> unclass(date3)
[1] -1096
Here the date is stored as a negative number as the date is earlier than 1970-01-01
> weekdays(date1)
[1] “Sunday”
> format(date1,”%d %b %Y”)
[1] “04 Sep 2016”
> date4<-as.Date(“04/21/2016″, format=”%m/%d/%Y”)
> date4
[1] “2016-04-21”
> date5<-as.Date(“October 10,2016”,format = “%B %d,%Y”)
> date5
[1] “2016-10-10”
> weekdays(date5)
[1] “Monday”
> months(date5)
[1] “October”
> weekdays(time5)
[1] “Sunday”
> months(time5)
[1] “September”
> quarters(time5)
[1] “Q3”
> julian(time5)
Time difference of 17048.63 days
> julian(time5,origin = as.POSIXct(“2000-01-01”, tz = “GMT”))
Time difference of 6091.626 days
Formatting the date
The following symbols can be used with the format() function to print dates
%d – day as a number (0-31)
%a – abbreviated weekday (Mon)
%A – Unabbreviated weekday (Monday)
%m – month (00-12)
%b – abbreviated month – Jan
%B – unabbreviated month (January)
%y – 2 digit year (16)
%Y – 4 digit year (2016)
> today<-Sys.Date()
> today
[1] “2016-09-04”
> format(today, format=”%d-%m-%y”)
[1] “04-09-16”
> format(today, format=”%d-%m-%Y”)
[1] “04-09-2016”
> format(today, format=”%d-%b-%Y”)
[1] “04-Sep-2016”
> format(today, format=”%d-%B-%Y”)
[1] “04-September-2016”
> format(today, format=”%a %d-%B-%Y”)
[1] “Sun 04-September-2016”
> format(today, format=”%A %d-%B-%Y”)
[1] “Sunday 04-September-2016”
Time difference using difftime
> date4-date5
Time difference of -172 days
> date5-date4
Time difference of 172 days
> difftime(date5, date4, units = “weeks”)
Time difference of 24.57143 weeks
> difftime(date5, date4, units = “hours”)
Time difference of 4128 hours
> difftime(date5, date4, units = “secs”)
Time difference of 14860800 secs
> difftime(date5, date4, units = “days”)
Time difference of 172 days
> difftime(date5, date4, units = “mins”)
Time difference of 247680 mins
> difftime(date5, date4, units = “auto”)
Time difference of 172 days
> difftime(date5, date4) #units not specified here, so default should be used
Time difference of 172 days
> dateVec<-as.Date(c(“2016-01-01″,”2017-01-01″,”2019-01-01”))
> dateVec
[1] “2016-01-01” “2017-01-01” “2019-01-01”
> diff(dateVec)
Time differences in days
[1] 366 730
Creating a sequence of dates
> date5
[1] “2016-10-10”
> dateSequence<-seq(date5, length=10, by = “day”)
> dateSequence
[1] “2016-10-10” “2016-10-11” “2016-10-12” “2016-10-13” “2016-10-14” “2016-10-15” “2016-10-16” “2016-10-17” “2016-10-18” “2016-10-19”
> dateSequence1<-seq(date5, length=10, by = “week”)
> dateSequence1
[1] “2016-10-10” “2016-10-17” “2016-10-24” “2016-10-31” “2016-11-07” “2016-11-14” “2016-11-21” “2016-11-28” “2016-12-05” “2016-12-12”
> dateSequence2<-seq(date5, length=10, by = 2) #skipping one day, alternate day
> dateSequence2
[1] “2016-10-10” “2016-10-12” “2016-10-14” “2016-10-16” “2016-10-18” “2016-10-20” “2016-10-22” “2016-10-24” “2016-10-26” “2016-10-28”
POSIXCt
> time1<-as.POSIXct(“2016-09-05 22:32:12”)
> time1
[1] “2016-09-05 22:32:12 IST”
> time2 <- as.POSIXct(“2016-09-06 18:32:07”, format = “%Y-%m-%d %H:%M:%S”)
> time2
[1] “2016-09-06 18:32:07 IST”
> time2-time1
Time difference of 19.99861 hours
> time2>time1
[1] TRUE
> time3<-time2+24
> time3
[1] “2016-09-06 18:32:31 IST”
> time2
[1] “2016-09-06 18:32:07 IST”
> time3-time2
Time difference of 24 secs
> unclass(time3)
[1] 1473166951
POSIXlt
> time4<-as.POSIXlt(“2016-09-04 23:56:23”)
> time4
[1] “2016-09-04 23:56:23 IST”
> unclass(time4)
$sec
[1] 23
$min
[1] 56
$hour
[1] 23
$mday
[1] 4
$mon
[1] 8
$year
[1] 116
$wday
[1] 0
$yday
[1] 247
$isdst
[1] 0
$zone
[1] “IST”
$gmtoff
[1] NA
> unlist(time4)
sec min hour mday mon year wday yday isdst zone gmtoff
“23” “56” “23” “4” “8” “116” “0” “247” “0” “IST” NA
> time4$sec
[1] 23
> time4$mday
[1] 4
> time4$zone
[1] “IST”
> str(unclass(time4))
List of 11
$ sec : num 23
$ min : int 56
$ hour : int 23
$ mday : int 4
$ mon : int 8
$ year : int 116
$ wday : int 0
$ yday : int 247
$ isdst : int 0
$ zone : chr “IST”
$ gmtoff: int NA
> time5<-as.POSIXlt(Sys.time())
> time5
[1] “2016-09-04 20:31:23 IST”
> class(time5)
[1] “POSIXlt” “POSIXt”
> str(unclass(time5))
List of 11
$ sec : num 23.9
$ min : int 31
$ hour : int 20
$ mday : int 4
$ mon : int 8
$ year : int 116
$ wday : int 0
$ yday : int 247
$ isdst : int 0
$ zone : chr “IST”
$ gmtoff: int 19800
– attr(*, “tzone”)= chr [1:3] “” “IST” “IST”
> time6<-“October 17, 1986 08:24”
> time6Created<-strptime(time6, “%B %d, %Y %H:%M”)
> time6Created
[1] “1986-10-17 08:24:00 IST”
> class(time6Created)
[1] “POSIXlt” “POSIXt”
Leave a Reply