{"id":876,"date":"2015-08-13T16:48:51","date_gmt":"2015-08-13T23:48:51","guid":{"rendered":"http:\/\/homepages.uc.edu\/~yaozo\/wordpress\/?p=876"},"modified":"2015-08-13T16:48:51","modified_gmt":"2015-08-13T23:48:51","slug":"r-time-data-types","status":"publish","type":"post","link":"https:\/\/zhuoyao.net\/index.php\/2015\/08\/13\/r-time-data-types\/","title":{"rendered":"R Time Data Types"},"content":{"rendered":"<div id=\"contents\" class=\"contents local topic\">\n<p class=\"topic-title first\">Contents<\/p>\n<ul class=\"simple\">\n<li><a id=\"id1\" class=\"reference internal\" href=\"http:\/\/www.cyclismo.org\/tutorial\/R\/time.html#time-and-date-variables\">Time and Date Variables<\/a><\/li>\n<li><a id=\"id2\" class=\"reference internal\" href=\"http:\/\/www.cyclismo.org\/tutorial\/R\/time.html#time-operations\">Time Operations<\/a><\/li>\n<\/ul>\n<\/div>\n<p id=\"index-0\">The time data types are broken out into a separate section from the introductory section on data types. (<a class=\"reference internal\" href=\"http:\/\/www.cyclismo.org\/tutorial\/R\/types.html#basicdatatypes\"><em>Basic Data Types<\/em><\/a>) The reason for this is that dealing with time data can be subtle and must be done carefully because the data type can be cast in a variety of different ways. It is not an introductory topic, and if not done well can scare off the normal people.<\/p>\n<p>I will first go over the basic time data types and then explore the different kinds of operations that are done with the time data types. <strong>Please be cautious with time data and read the complete description including the caveats. There are some common mistakes that result in calculations that yield results that are very different from the intended values.<\/strong><\/p>\n<div id=\"time-and-date-variables\" class=\"section\">\n<h2><a class=\"toc-backref\" href=\"http:\/\/www.cyclismo.org\/tutorial\/R\/time.html#id1\">14.1. Time and Date Variables<\/a><\/h2>\n<p><span id=\"index-1\" class=\"target\"><\/span><\/p>\n<p id=\"index-2\">There are a variety of different types specific to time data fields in R. Here we only look at two, the POSIXct and POSIXlt data types:<\/p>\n<p>POSIXct<\/p>\n<blockquote>\n<div>The POSIXct data type is the number of seconds since the start of January 1, 1970. Negative numbers represent the number of seconds before this time, and positive numbers represent the number of seconds afterwards.<\/div>\n<\/blockquote>\n<p>POSIXlt<\/p>\n<blockquote>\n<div>\n<p>The POSIXlt data type is a vector, and the entries in the vector have the following meanings:<\/p>\n<ol class=\"arabic simple\">\n<li>seconds<\/li>\n<li>minutes<\/li>\n<li>hours<\/li>\n<li>day of month (1-31)<\/li>\n<li>month of the year (0-11)<\/li>\n<li>years since 1900<\/li>\n<li>day of the week (0-6 where 0 represents Sunday)<\/li>\n<li>day of the year (0-365)<\/li>\n<li>Daylight savings indicator (positive if it is daylight savings)<\/li>\n<\/ol>\n<\/div>\n<\/blockquote>\n<p>Part of the difficulty with time data types is that R prints them out in a way that is different from how it stores them internally. This can make type conversions tricky, and you have to be careful and test your operations to insure that R is doing what you think it is doing.<\/p>\n<p>To get the current time, the <em>Sys.time()<\/em> can be used, and you can play around a bit with the basic types to get a feel for what R is doing. The <em>as.POSIXct<\/em> and <em>as.POSIXlt<\/em> commands are used to convert the time value into the different formats.<\/p>\n<p><span id=\"index-3\" class=\"target\"><\/span><\/p>\n<div id=\"index-4\" class=\"highlight-rconsole\">\n<div class=\"highlight\">\n<pre><span class=\"gp\">&gt; <\/span>help<span class=\"p\">(<\/span>DateTimeClasses<span class=\"p\">)<\/span>\n<span class=\"gp\">&gt; <\/span>t <span class=\"o\">&lt;-<\/span> <span class=\"kp\">Sys.time<\/span><span class=\"p\">()<\/span>\n<span class=\"gp\">&gt; <\/span><span class=\"kp\">typeof<\/span><span class=\"p\">(<\/span><span class=\"kp\">t<\/span><span class=\"p\">)<\/span>\n<span class=\"go\">[1] \"double\"<\/span>\n<span class=\"gp\">&gt; <\/span><span class=\"kp\">t<\/span>\n<span class=\"go\">[1] \"2014-01-23 14:28:21 EST\"<\/span>\n<span class=\"gp\">&gt; <\/span><span class=\"kp\">print<\/span><span class=\"p\">(<\/span><span class=\"kp\">t<\/span><span class=\"p\">)<\/span>\n<span class=\"go\">[1] \"2014-01-23 14:28:21 EST\"<\/span>\n<span class=\"gp\">&gt; <\/span><span class=\"kp\">cat<\/span><span class=\"p\">(<\/span><span class=\"kp\">t<\/span><span class=\"p\">,<\/span><span class=\"s\">\"\\n\"<\/span><span class=\"p\">)<\/span>\n<span class=\"go\">1390505301<\/span>\n<span class=\"gp\">&gt; <\/span><span class=\"kt\">c<\/span> <span class=\"o\">&lt;-<\/span> <span class=\"kp\">as.POSIXct<\/span><span class=\"p\">(<\/span><span class=\"kp\">t<\/span><span class=\"p\">)<\/span>\n<span class=\"gp\">&gt; <\/span><span class=\"kp\">typeof<\/span><span class=\"p\">(<\/span><span class=\"kt\">c<\/span><span class=\"p\">)<\/span>\n<span class=\"go\">[1] \"double\"<\/span>\n<span class=\"gp\">&gt; <\/span><span class=\"kp\">print<\/span><span class=\"p\">(<\/span><span class=\"kt\">c<\/span><span class=\"p\">)<\/span>\n<span class=\"go\">[1] \"2014-01-23 14:28:21 EST\"<\/span>\n<span class=\"gp\">&gt; <\/span><span class=\"kp\">cat<\/span><span class=\"p\">(<\/span><span class=\"kt\">c<\/span><span class=\"p\">,<\/span><span class=\"s\">\"\\n\"<\/span><span class=\"p\">)<\/span>\n<span class=\"go\">1390505301<\/span>\n<span class=\"gp\">&gt;<\/span>\n<span class=\"gp\">&gt;<\/span>\n<span class=\"gp\">&gt; <\/span>l <span class=\"o\">&lt;-<\/span> <span class=\"kp\">as.POSIXlt<\/span><span class=\"p\">(<\/span><span class=\"kp\">t<\/span><span class=\"p\">)<\/span>\n<span class=\"gp\">&gt; <\/span>l\n<span class=\"go\">[1] \"2014-01-23 14:28:21 EST\"<\/span>\n<span class=\"gp\">&gt; <\/span><span class=\"kp\">typeof<\/span><span class=\"p\">(<\/span>l<span class=\"p\">)<\/span>\n<span class=\"go\">[1] \"list\"<\/span>\n<span class=\"gp\">&gt; <\/span><span class=\"kp\">print<\/span><span class=\"p\">(<\/span>l<span class=\"p\">)<\/span>\n<span class=\"go\">[1] \"2014-01-23 14:28:21 EST\"<\/span>\n<span class=\"gp\">&gt; <\/span><span class=\"kp\">cat<\/span><span class=\"p\">(<\/span>l<span class=\"p\">,<\/span><span class=\"s\">\"\\n\"<\/span><span class=\"p\">)<\/span>\n<span class=\"go\">Error in cat(list(...), file, sep, fill, labels, append) :<\/span>\n<span class=\"go\">argument 1 (type 'list') cannot be handled by 'cat'<\/span>\n<span class=\"gp\">&gt; <\/span><span class=\"kp\">names<\/span><span class=\"p\">(<\/span>l<span class=\"p\">)<\/span>\n<span class=\"go\">NULL<\/span>\n<span class=\"gp\">&gt; <\/span>l<span class=\"p\">[[<\/span><span class=\"m\">1<\/span><span class=\"p\">]]<\/span>\n<span class=\"go\">[1] 21.01023<\/span>\n<span class=\"gp\">&gt; <\/span>l<span class=\"p\">[[<\/span><span class=\"m\">2<\/span><span class=\"p\">]]<\/span>\n<span class=\"go\">[1] 28<\/span>\n<span class=\"gp\">&gt; <\/span>l<span class=\"p\">[[<\/span><span class=\"m\">3<\/span><span class=\"p\">]]<\/span>\n<span class=\"go\">[1] 14<\/span>\n<span class=\"gp\">&gt; <\/span>l<span class=\"p\">[[<\/span><span class=\"m\">4<\/span><span class=\"p\">]]<\/span>\n<span class=\"go\">[1] 23<\/span>\n<span class=\"gp\">&gt; <\/span>l<span class=\"p\">[[<\/span><span class=\"m\">5<\/span><span class=\"p\">]]<\/span>\n<span class=\"go\">[1] 0<\/span>\n<span class=\"gp\">&gt; <\/span>l<span class=\"p\">[[<\/span><span class=\"m\">6<\/span><span class=\"p\">]]<\/span>\n<span class=\"go\">[1] 114<\/span>\n<span class=\"gp\">&gt; <\/span>l<span class=\"p\">[[<\/span><span class=\"m\">7<\/span><span class=\"p\">]]<\/span>\n<span class=\"go\">[1] 4<\/span>\n<span class=\"gp\">&gt; <\/span>l<span class=\"p\">[[<\/span><span class=\"m\">8<\/span><span class=\"p\">]]<\/span>\n<span class=\"go\">[1] 22<\/span>\n<span class=\"gp\">&gt; <\/span>l<span class=\"p\">[[<\/span><span class=\"m\">9<\/span><span class=\"p\">]]<\/span>\n<span class=\"go\">[1] 0<\/span>\n<span class=\"gp\">&gt;<\/span>\n<span class=\"gp\">&gt; <\/span>b <span class=\"o\">&lt;-<\/span> <span class=\"kp\">as.POSIXct<\/span><span class=\"p\">(<\/span>l<span class=\"p\">)<\/span>\n<span class=\"gp\">&gt; <\/span><span class=\"kp\">cat<\/span><span class=\"p\">(<\/span>b<span class=\"p\">,<\/span><span class=\"s\">\"\\n\"<\/span><span class=\"p\">)<\/span>\n<span class=\"go\">1390505301<\/span>\n<\/pre>\n<\/div>\n<\/div>\n<p>There are times when you have a time data type and want to convert it into a string so it can be saved into a file to be read by another application. The <em>strftime<\/em> command is used to take a time data type and convert it to a string. You must supply an additional format string to let R what format you want to use. See the help page on <em>strftime<\/em> to get detailed information about the format string.<\/p>\n<div id=\"index-5\" class=\"highlight-rconsole\">\n<div class=\"highlight\">\n<pre><span class=\"gp\">&gt; <\/span>help<span class=\"p\">(<\/span><span class=\"kp\">strftime<\/span><span class=\"p\">)<\/span>\n<span class=\"gp\">&gt;<\/span>\n<span class=\"gp\">&gt; <\/span>t <span class=\"o\">&lt;-<\/span> <span class=\"kp\">Sys.time<\/span><span class=\"p\">()<\/span>\n<span class=\"gp\">&gt; <\/span><span class=\"kp\">cat<\/span><span class=\"p\">(<\/span><span class=\"kp\">t<\/span><span class=\"p\">,<\/span><span class=\"s\">\"\\n\"<\/span><span class=\"p\">)<\/span>\n<span class=\"go\">1390506463<\/span>\n<span class=\"gp\">&gt; <\/span>timeStamp <span class=\"o\">&lt;-<\/span>  <span class=\"kp\">strftime<\/span><span class=\"p\">(<\/span><span class=\"kp\">t<\/span><span class=\"p\">,<\/span><span class=\"s\">\"%Y-%m-%d %H:%M:%S\"<\/span><span class=\"p\">)<\/span>\n<span class=\"gp\">&gt; <\/span>timeStamp\n<span class=\"go\">[1] \"2014-01-23 14:47:43\"<\/span>\n<span class=\"gp\">&gt; <\/span><span class=\"kp\">typeof<\/span><span class=\"p\">(<\/span>timeStamp<span class=\"p\">)<\/span>\n<span class=\"go\">[1] \"character\"<\/span>\n<\/pre>\n<\/div>\n<\/div>\n<p>Commonly a time stamp is saved in a data file, and it must be converted into a time data type to allow for calculations. For example, you may be interested in how much time has elapsed between two observations. The <em>strptime<\/em> command is used to take a string and convert it into a time data type. Like <em>strftime<\/em> it requires a format string in addition to the time stamp.<\/p>\n<p>The <em>strptime<\/em> command is used to take a string and convert it into a form that R can use for calculations. In the following example a data frame is defined that has the dates stored as strings. If you read the data in from a csv file this is how R will keep track of the data. Note that in this context the strings are assumed to represent ordinal data, and R will assume that the data field is a set of factors. You have to use the <em>strptime<\/em> command to convert it into a time field.<\/p>\n<div id=\"index-6\" class=\"highlight-rconsole\">\n<div class=\"highlight\">\n<pre><span class=\"gp\">&gt; <\/span>myData <span class=\"o\">&lt;-<\/span> <span class=\"kt\">data.frame<\/span><span class=\"p\">(<\/span>time<span class=\"o\">=<\/span><span class=\"kt\">c<\/span><span class=\"p\">(<\/span><span class=\"s\">\"2014-01-23 14:28:21\"<\/span><span class=\"p\">,<\/span><span class=\"s\">\"2014-01-23 14:28:55\"<\/span><span class=\"p\">,<\/span>\n<span class=\"go\">                              \"2014-01-23 14:29:02\",\"2014-01-23 14:31:18\"),<\/span>\n<span class=\"go\">                      speed=c(2.0,2.2,3.4,5.5))<\/span>\n<span class=\"gp\">&gt; <\/span>myData\n<span class=\"go\">                 time speed<\/span>\n<span class=\"go\">1 2014-01-23 14:28:21   2.0<\/span>\n<span class=\"go\">2 2014-01-23 14:28:55   2.2<\/span>\n<span class=\"go\">3 2014-01-23 14:29:02   3.4<\/span>\n<span class=\"go\">4 2014-01-23 14:31:18   5.5<\/span>\n<span class=\"gp\">&gt; <\/span><span class=\"kp\">summary<\/span><span class=\"p\">(<\/span>myData<span class=\"p\">)<\/span>\n<span class=\"go\">                 time       speed<\/span>\n<span class=\"go\">2014-01-23 14:28:21:1   Min.   :2.000<\/span>\n<span class=\"go\">2014-01-23 14:28:55:1   1st Qu.:2.150<\/span>\n<span class=\"go\">2014-01-23 14:29:02:1   Median :2.800<\/span>\n<span class=\"go\">2014-01-23 14:31:18:1   Mean   :3.275<\/span>\n<span class=\"go\">                        3rd Qu.:3.925<\/span>\n<span class=\"go\">                        Max.   :5.500<\/span>\n<span class=\"gp\">&gt; <\/span>myData<span class=\"o\">$<\/span>time<span class=\"p\">[<\/span><span class=\"m\">1<\/span><span class=\"p\">]<\/span>\n<span class=\"go\">[1] 2014-01-23 14:28:21<\/span>\n<span class=\"go\">4 Levels: 2014-01-23 14:28:21 2014-01-23 14:28:55 ... 2014-01-23 14:31:18<\/span>\n<span class=\"gp\">&gt; <\/span><span class=\"kp\">typeof<\/span><span class=\"p\">(<\/span>myData<span class=\"o\">$<\/span>time<span class=\"p\">[<\/span><span class=\"m\">1<\/span><span class=\"p\">])<\/span>\n<span class=\"go\">[1] \"integer\"<\/span>\n<span class=\"gp\">&gt;<\/span>\n<span class=\"gp\">&gt;<\/span>\n<span class=\"gp\">&gt; <\/span>myData<span class=\"o\">$<\/span>time <span class=\"o\">&lt;-<\/span> <span class=\"kp\">strptime<\/span><span class=\"p\">(<\/span>myData<span class=\"o\">$<\/span>time<span class=\"p\">,<\/span><span class=\"s\">\"%Y-%m-%d %H:%M:%S\"<\/span><span class=\"p\">)<\/span>\n<span class=\"gp\">&gt; <\/span>myData\n<span class=\"go\">                 time speed<\/span>\n<span class=\"go\">1 2014-01-23 14:28:21   2.0<\/span>\n<span class=\"go\">2 2014-01-23 14:28:55   2.2<\/span>\n<span class=\"go\">3 2014-01-23 14:29:02   3.4<\/span>\n<span class=\"go\">4 2014-01-23 14:31:18   5.5<\/span>\n<span class=\"gp\">&gt; <\/span>myData<span class=\"o\">$<\/span>time<span class=\"p\">[<\/span><span class=\"m\">1<\/span><span class=\"p\">]<\/span>\n<span class=\"go\">[1] \"2014-01-23 14:28:21\"<\/span>\n<span class=\"gp\">&gt; <\/span><span class=\"kp\">typeof<\/span><span class=\"p\">(<\/span>myData<span class=\"o\">$<\/span>time<span class=\"p\">[<\/span><span class=\"m\">1<\/span><span class=\"p\">])<\/span>\n<span class=\"go\">[1] \"list\"<\/span>\n<span class=\"gp\">&gt; <\/span>myData<span class=\"o\">$<\/span>time<span class=\"p\">[<\/span><span class=\"m\">1<\/span><span class=\"p\">][[<\/span><span class=\"m\">2<\/span><span class=\"p\">]]<\/span>\n<span class=\"go\">[1] 28<\/span>\n<\/pre>\n<\/div>\n<\/div>\n<p>Now you can perform operations on the fields. For example you can determine the time between observations. (Please see the notes below on time operations. This example is a bit misleading!)<\/p>\n<div class=\"highlight-rconsole\">\n<div class=\"highlight\">\n<pre><span class=\"gp\">&gt; <\/span>N <span class=\"o\">=<\/span> <span class=\"kp\">length<\/span><span class=\"p\">(<\/span>myData<span class=\"o\">$<\/span>time<span class=\"p\">)<\/span>\n<span class=\"gp\">&gt; <\/span>myData<span class=\"o\">$<\/span>time<span class=\"p\">[<\/span><span class=\"m\">2<\/span><span class=\"o\">:<\/span>N<span class=\"p\">]<\/span> <span class=\"o\">-<\/span> myData<span class=\"o\">$<\/span>time<span class=\"p\">[<\/span><span class=\"m\">1<\/span><span class=\"o\">:<\/span><span class=\"p\">(<\/span>N<span class=\"m\">-1<\/span><span class=\"p\">)]<\/span>\n<span class=\"go\">Time differences in secs<\/span>\n<span class=\"go\">[1]  34   7 136<\/span>\n<span class=\"go\">attr(,\"tzone\")<\/span>\n<span class=\"go\">[1] \"\"<\/span>\n<\/pre>\n<\/div>\n<\/div>\n<p id=\"index-7\">In addition to the time data types R also has a date data type. The difference is that the date data type keeps track of numbers of days rather than seconds. You can cast a string into a date type using the <em>as.Date<\/em> function. The <em>as.Date<\/em>function takes the same arguments as the time data types discussed above.<\/p>\n<div id=\"index-8\" class=\"highlight-rconsole\">\n<div class=\"highlight\">\n<pre><span class=\"gp\">&gt; <\/span>theDates <span class=\"o\">&lt;-<\/span> <span class=\"kt\">c<\/span><span class=\"p\">(<\/span><span class=\"s\">\"1 jan 2012\"<\/span><span class=\"p\">,<\/span><span class=\"s\">\"1 jan 2013\"<\/span><span class=\"p\">,<\/span><span class=\"s\">\"1 jan 2014\"<\/span><span class=\"p\">)<\/span>\n<span class=\"gp\">&gt; <\/span>dateFields <span class=\"o\">&lt;-<\/span> <span class=\"kp\">as.Date<\/span><span class=\"p\">(<\/span>theDates<span class=\"p\">,<\/span><span class=\"s\">\"%d %b %Y\"<\/span><span class=\"p\">)<\/span>\n<span class=\"gp\">&gt; <\/span><span class=\"kp\">typeof<\/span><span class=\"p\">(<\/span>dateFields<span class=\"p\">)<\/span>\n<span class=\"go\">[1] \"double\"<\/span>\n<span class=\"gp\">&gt; <\/span>dateFields\n<span class=\"go\">[1] \"2012-01-01\" \"2013-01-01\" \"2014-01-01\"<\/span>\n<span class=\"gp\">&gt; <\/span>N <span class=\"o\">&lt;-<\/span> <span class=\"kp\">length<\/span><span class=\"p\">(<\/span>dateFields<span class=\"p\">)<\/span>\n<span class=\"gp\">&gt; <\/span>diff <span class=\"o\">&lt;-<\/span> dateFields<span class=\"p\">[<\/span><span class=\"m\">1<\/span><span class=\"o\">:<\/span><span class=\"p\">(<\/span>N<span class=\"m\">-1<\/span><span class=\"p\">)]<\/span> <span class=\"o\">-<\/span> dateFields<span class=\"p\">[<\/span><span class=\"m\">2<\/span><span class=\"o\">:<\/span>N<span class=\"p\">]<\/span>\n<span class=\"gp\">&gt; <\/span><span class=\"kp\">diff<\/span>\n<span class=\"go\">Time differences in days<\/span>\n<span class=\"go\">[1] -366 -365<\/span>\n<\/pre>\n<\/div>\n<\/div>\n<p>You can also define a date in terms of the number days after another date using the <em>origin<\/em> option.<\/p>\n<div id=\"index-9\" class=\"highlight-rconsole\">\n<div class=\"highlight\">\n<pre><span class=\"gp\">&gt; <\/span>infamy <span class=\"o\">&lt;-<\/span> <span class=\"kp\">as.Date<\/span><span class=\"p\">(<\/span><span class=\"m\">-179<\/span><span class=\"p\">,<\/span>origin<span class=\"o\">=<\/span><span class=\"s\">\"1942-06-04\"<\/span><span class=\"p\">)<\/span>\n<span class=\"gp\">&gt; <\/span>infamy\n<span class=\"go\">[1] \"1941-12-07\"<\/span>\n<span class=\"gp\">&gt;<\/span>\n<span class=\"gp\">&gt; <\/span>today <span class=\"o\">&lt;-<\/span> <span class=\"kp\">Sys.Date<\/span><span class=\"p\">()<\/span>\n<span class=\"gp\">&gt; <\/span>today\n<span class=\"go\">[1] \"2014-01-23\"<\/span>\n<span class=\"gp\">&gt; <\/span>today<span class=\"o\">-<\/span>infamy\n<span class=\"go\">Time difference of 26345 days<\/span>\n<\/pre>\n<\/div>\n<\/div>\n<p>Finally, a nice function to know about and use is the <em>format<\/em> command. It can be used in a wide variety of situations, and not just for dates. It is helpful for dates, though, because you can use it in <em>cat<\/em> and <em>print<\/em> statements to make sure that your output is in exactly the form that you want.<\/p>\n<div id=\"index-10\" class=\"highlight-rconsole\">\n<div class=\"highlight\">\n<pre><span class=\"gp\">&gt; <\/span>theTime <span class=\"o\">&lt;-<\/span> <span class=\"kp\">Sys.time<\/span><span class=\"p\">()<\/span>\n<span class=\"gp\">&gt; <\/span>theTime\n<span class=\"go\">[1] \"2014-01-23 16:15:05 EST\"<\/span>\n<span class=\"gp\">&gt; <\/span>a <span class=\"o\">&lt;-<\/span> rexp<span class=\"p\">(<\/span><span class=\"m\">1<\/span><span class=\"p\">,<\/span><span class=\"m\">0.1<\/span><span class=\"p\">)<\/span>\n<span class=\"gp\">&gt; <\/span>a\n<span class=\"go\">[1] 7.432072<\/span>\n<span class=\"gp\">&gt; <\/span><span class=\"kp\">cat<\/span><span class=\"p\">(<\/span><span class=\"s\">\"At about\"<\/span><span class=\"p\">,<\/span><span class=\"kp\">format<\/span><span class=\"p\">(<\/span>theTime<span class=\"p\">,<\/span><span class=\"s\">\"%H:%M\"<\/span><span class=\"p\">),<\/span><span class=\"s\">\"the time between occurances was around\"<\/span><span class=\"p\">,<\/span><span class=\"kp\">format<\/span><span class=\"p\">(<\/span>a<span class=\"p\">,<\/span>digits<span class=\"o\">=<\/span><span class=\"m\">3<\/span><span class=\"p\">),<\/span><span class=\"s\">\"seconds\\n\"<\/span><span class=\"p\">)<\/span>\n<span class=\"go\">At about 16:15 the time between occurances was around 7.43 seconds<\/span>\n<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<div id=\"time-operations\" class=\"section\">\n<h2><a class=\"toc-backref\" href=\"http:\/\/www.cyclismo.org\/tutorial\/R\/time.html#id2\">14.2. Time Operations<\/a><\/h2>\n<p>The most difficult part of dealing with time data can be converting it into the right format. Once a time or date is stored in R\u2019s internal format then a number of basic operations are available. The thing to keep in mind, though, is that the units you get after an operation can vary depending on the magnitude of the time values. Be very careful when dealing with time operations and vigorously test your codes.<\/p>\n<div class=\"highlight-rconsole\">\n<div class=\"highlight\">\n<pre><span class=\"gp\">&gt; <\/span>now <span class=\"o\">&lt;-<\/span> <span class=\"kp\">Sys.time<\/span><span class=\"p\">()<\/span>\n<span class=\"gp\">&gt; <\/span>now\n<span class=\"go\">[1] \"2014-01-23 16:31:00 EST\"<\/span>\n<span class=\"gp\">&gt; <\/span>now<span class=\"m\">-60<\/span>\n<span class=\"go\">[1] \"2014-01-23 16:30:00 EST\"<\/span>\n<span class=\"gp\">&gt;<\/span>\n<span class=\"gp\">&gt; <\/span>earlier <span class=\"o\">&lt;-<\/span> <span class=\"kp\">strptime<\/span><span class=\"p\">(<\/span><span class=\"s\">\"2000-01-01 00:00:00\"<\/span><span class=\"p\">,<\/span><span class=\"s\">\"%Y-%m-%d %H:%M:%S\"<\/span><span class=\"p\">)<\/span>\n<span class=\"gp\">&gt; <\/span>later <span class=\"o\">&lt;-<\/span> <span class=\"kp\">strptime<\/span><span class=\"p\">(<\/span><span class=\"s\">\"2000-01-01 00:00:20\"<\/span><span class=\"p\">,<\/span><span class=\"s\">\"%Y-%m-%d %H:%M:%S\"<\/span><span class=\"p\">)<\/span>\n<span class=\"gp\">&gt; <\/span>later<span class=\"o\">-<\/span>earlier\n<span class=\"go\">Time difference of 20 secs<\/span>\n<span class=\"gp\">&gt; <\/span><span class=\"kp\">as.double<\/span><span class=\"p\">(<\/span>later<span class=\"o\">-<\/span>earlier<span class=\"p\">)<\/span>\n<span class=\"go\">[1] 20<\/span>\n<span class=\"gp\">&gt;<\/span>\n<span class=\"gp\">&gt; <\/span>earlier <span class=\"o\">&lt;-<\/span> <span class=\"kp\">strptime<\/span><span class=\"p\">(<\/span><span class=\"s\">\"2000-01-01 00:00:00\"<\/span><span class=\"p\">,<\/span><span class=\"s\">\"%Y-%m-%d %H:%M:%S\"<\/span><span class=\"p\">)<\/span>\n<span class=\"gp\">&gt; <\/span>later <span class=\"o\">&lt;-<\/span> <span class=\"kp\">strptime<\/span><span class=\"p\">(<\/span><span class=\"s\">\"2000-01-01 01:00:00\"<\/span><span class=\"p\">,<\/span><span class=\"s\">\"%Y-%m-%d %H:%M:%S\"<\/span><span class=\"p\">)<\/span>\n<span class=\"gp\">&gt; <\/span>later<span class=\"o\">-<\/span>earlier\n<span class=\"go\">Time difference of 1 hours<\/span>\n<span class=\"gp\">&gt; <\/span><span class=\"kp\">as.double<\/span><span class=\"p\">(<\/span>later<span class=\"o\">-<\/span>earlier<span class=\"p\">)<\/span>\n<span class=\"go\">[1] 1<\/span>\n<span class=\"gp\">&gt;<\/span>\n<span class=\"gp\">&gt; <\/span>up <span class=\"o\">&lt;-<\/span> <span class=\"kp\">as.Date<\/span><span class=\"p\">(<\/span><span class=\"s\">\"1961-08-13\"<\/span><span class=\"p\">)<\/span>\n<span class=\"gp\">&gt; <\/span>down <span class=\"o\">&lt;-<\/span> <span class=\"kp\">as.Date<\/span><span class=\"p\">(<\/span><span class=\"s\">\"1989-11-9\"<\/span><span class=\"p\">)<\/span>\n<span class=\"gp\">&gt; <\/span>down<span class=\"o\">-<\/span>up\n<span class=\"go\">Time difference of 10315 days<\/span>\n<\/pre>\n<\/div>\n<\/div>\n<p>The two examples involving the variables <em>earlier<\/em> and <em>later<\/em> in the previous code sample should cause you a little concern. The value of the difference depends on the largest units with respect to the difference! The issue is that when you subtract dates R uses the equivalent of the <em>difftime<\/em> command. We need to know how this operates to reduce the ambiguity when comparing times.<\/p>\n<div id=\"index-11\" class=\"highlight-rconsole\">\n<div class=\"highlight\">\n<pre><span class=\"gp\">&gt; <\/span>help<span class=\"p\">(<\/span><span class=\"kp\">difftime<\/span><span class=\"p\">)<\/span>\n<span class=\"gp\">&gt;<\/span>\n<span class=\"gp\">&gt; <\/span>earlier <span class=\"o\">&lt;-<\/span> <span class=\"kp\">strptime<\/span><span class=\"p\">(<\/span><span class=\"s\">\"2000-01-01 00:00:00\"<\/span><span class=\"p\">,<\/span><span class=\"s\">\"%Y-%m-%d %H:%M:%S\"<\/span><span class=\"p\">)<\/span>\n<span class=\"gp\">&gt; <\/span>later <span class=\"o\">&lt;-<\/span> <span class=\"kp\">strptime<\/span><span class=\"p\">(<\/span><span class=\"s\">\"2000-01-01 01:00:00\"<\/span><span class=\"p\">,<\/span><span class=\"s\">\"%Y-%m-%d %H:%M:%S\"<\/span><span class=\"p\">)<\/span>\n<span class=\"gp\">&gt; <\/span><span class=\"kp\">difftime<\/span><span class=\"p\">(<\/span>later<span class=\"p\">,<\/span>earlier<span class=\"p\">)<\/span>\n<span class=\"go\">Time difference of 1 hours<\/span>\n<span class=\"gp\">&gt; <\/span><span class=\"kp\">difftime<\/span><span class=\"p\">(<\/span>later<span class=\"p\">,<\/span>earlier<span class=\"p\">,<\/span>units<span class=\"o\">=<\/span><span class=\"s\">\"secs\"<\/span><span class=\"p\">)<\/span>\n<span class=\"go\">Time difference of 3600 secs<\/span>\n<\/pre>\n<\/div>\n<\/div>\n<p>One thing to be careful about <em>difftime<\/em> is that it is a double precision number, but it has units attached to it. This can be tricky, and you should be careful about the ambiguity in using this command. I personally always try to specify the units to avoid this.<\/p>\n<div class=\"highlight-rconsole\">\n<div class=\"highlight\">\n<pre><span class=\"gp\">&gt; <\/span>earlier <span class=\"o\">&lt;-<\/span> <span class=\"kp\">strptime<\/span><span class=\"p\">(<\/span><span class=\"s\">\"2000-01-01 00:00:00\"<\/span><span class=\"p\">,<\/span><span class=\"s\">\"%Y-%m-%d %H:%M:%S\"<\/span><span class=\"p\">)<\/span>\n<span class=\"gp\">&gt; <\/span>later <span class=\"o\">&lt;-<\/span> <span class=\"kp\">strptime<\/span><span class=\"p\">(<\/span><span class=\"s\">\"2000-01-01 00:00:20\"<\/span><span class=\"p\">,<\/span><span class=\"s\">\"%Y-%m-%d %H:%M:%S\"<\/span><span class=\"p\">)<\/span>\n<span class=\"gp\">&gt; <\/span>d <span class=\"o\">&lt;-<\/span> <span class=\"kp\">difftime<\/span><span class=\"p\">(<\/span>later<span class=\"p\">,<\/span>earlier<span class=\"p\">)<\/span>\n<span class=\"gp\">&gt; <\/span>d\n<span class=\"go\">Time difference of 20 secs<\/span>\n<span class=\"gp\">&gt; <\/span><span class=\"kp\">typeof<\/span><span class=\"p\">(<\/span>d<span class=\"p\">)<\/span>\n<span class=\"go\">[1] \"double\"<\/span>\n<span class=\"gp\">&gt; <\/span><span class=\"kp\">as.double<\/span><span class=\"p\">(<\/span>d<span class=\"p\">)<\/span>\n<span class=\"go\">[1] 20<\/span>\n<\/pre>\n<\/div>\n<\/div>\n<p>Another way to define a time difference is to use the <em>as.difftime<\/em> command. It takes two dates and will compute the difference between them. It takes a time, its format, and the units to use. Note that in the following example R is able to figure out what the units are when making the calculation.<\/p>\n<div id=\"index-12\" class=\"highlight-rconsole\">\n<div class=\"highlight\">\n<pre><span class=\"gp\">&gt; <\/span>diff <span class=\"o\">&lt;-<\/span> <span class=\"kp\">as.difftime<\/span><span class=\"p\">(<\/span><span class=\"s\">\"00:30:00\"<\/span><span class=\"p\">,<\/span><span class=\"s\">\"%H:%M:%S\"<\/span><span class=\"p\">,<\/span>units<span class=\"o\">=<\/span><span class=\"s\">\"hour\"<\/span><span class=\"p\">)<\/span>\n<span class=\"gp\">&gt; <\/span><span class=\"kp\">diff<\/span>\n<span class=\"go\">Time difference of 0.5 hours<\/span>\n<span class=\"gp\">&gt; <\/span><span class=\"kp\">Sys.time<\/span><span class=\"p\">()<\/span>\n<span class=\"go\">[1] \"2014-01-23 16:45:39 EST\"<\/span>\n<span class=\"gp\">&gt; <\/span><span class=\"kp\">Sys.time<\/span><span class=\"p\">()<\/span><span class=\"o\">+<\/span><span class=\"kp\">diff<\/span>\n<span class=\"go\">[1] \"2014-01-23 17:15:41 EST\"<\/span>\n<\/pre>\n<\/div>\n<\/div>\n<p>The last thing to mention is that once a time stamp is cast into one of R\u2019s internal formats comparisons can be made in a natural way.<\/p>\n<div class=\"highlight-rconsole\">\n<div class=\"highlight\">\n<pre><span class=\"gp\">&gt; <\/span>diff <span class=\"o\">&lt;-<\/span> <span class=\"kp\">as.difftime<\/span><span class=\"p\">(<\/span><span class=\"s\">\"00:30:00\"<\/span><span class=\"p\">,<\/span><span class=\"s\">\"%H:%M:%S\"<\/span><span class=\"p\">,<\/span>units<span class=\"o\">=<\/span><span class=\"s\">\"hour\"<\/span><span class=\"p\">)<\/span>\n<span class=\"gp\">&gt; <\/span>now <span class=\"o\">&lt;-<\/span> <span class=\"kp\">Sys.time<\/span><span class=\"p\">()<\/span>\n<span class=\"gp\">&gt; <\/span>later <span class=\"o\">&lt;-<\/span> now <span class=\"o\">+<\/span> <span class=\"kp\">diff<\/span>\n<span class=\"gp\">&gt; <\/span>now\n<span class=\"go\">[1] \"2014-01-23 16:47:48 EST\"<\/span>\n<span class=\"gp\">&gt; <\/span>later\n<span class=\"go\">[1] \"2014-01-23 17:17:48 EST\"<\/span>\n<span class=\"gp\">&gt;<\/span>\n<span class=\"gp\">&gt; <\/span><span class=\"kr\">if<\/span><span class=\"p\">(<\/span>now <span class=\"o\">&lt;<\/span> later<span class=\"p\">)<\/span>\n<span class=\"go\">  {<\/span>\n<span class=\"go\">     cat(\"there you go\\n\")<\/span>\n<span class=\"go\">  }<\/span>\n<span class=\"go\">there you go<\/span><\/pre>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Contents Time and Date Variables Time Operations The time data types are broken out into a separate section from the introductory section on data types.&hellip; <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[20],"tags":[],"class_list":["post-876","post","type-post","status-publish","format-standard","hentry","category-r"],"_links":{"self":[{"href":"https:\/\/zhuoyao.net\/index.php\/wp-json\/wp\/v2\/posts\/876","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/zhuoyao.net\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/zhuoyao.net\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/zhuoyao.net\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/zhuoyao.net\/index.php\/wp-json\/wp\/v2\/comments?post=876"}],"version-history":[{"count":0,"href":"https:\/\/zhuoyao.net\/index.php\/wp-json\/wp\/v2\/posts\/876\/revisions"}],"wp:attachment":[{"href":"https:\/\/zhuoyao.net\/index.php\/wp-json\/wp\/v2\/media?parent=876"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/zhuoyao.net\/index.php\/wp-json\/wp\/v2\/categories?post=876"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/zhuoyao.net\/index.php\/wp-json\/wp\/v2\/tags?post=876"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}