{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Days and Dates\n",
    "\n",
    "This notebook (a) introduces the Date type; (b) discusses how to convert from one date format (for instance, Excel and Matlab) to Julia dates; (c) and how to do date arithmetics."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Load Packages and Extra Functions"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "printyellow (generic function with 1 method)"
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "using Printf, Dates\n",
    "\n",
    "include(\"jlFiles/printmat.jl\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Building a Calendar"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Dates and day of the week\n",
      "2014-01-31     5    \n",
      "2014-02-28     5    \n",
      "2014-03-31     1    \n",
      "2014-04-30     3    \n",
      "2014-05-31     6    \n",
      "2014-06-30     1    \n",
      "2014-07-31     4    \n",
      "2014-08-31     7    \n",
      "2014-09-30     2    \n",
      "2014-10-31     5    \n",
      "2014-11-30     7    \n",
      "2014-12-31     3    \n",
      "\n"
     ]
    }
   ],
   "source": [
    "dNb = Date(2014,1,31):Month(1):Date(2014,12,31)    #build a monthly calendar\n",
    "\n",
    "println(\"Dates and day of the week\")\n",
    "printmat([dNb Dates.dayofweek.(dNb)])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Converting from Other Date Formats"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Converting from yyyymmdd\n",
    "\n",
    "Background: financial data is often downloaded as CSV files (eg. from finance.yahoo), where the date may look like 20160331. The next cell shows a simple way to create a Julia Date."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2016-03-31\n",
      "2016-04-01\n",
      "\n"
     ]
    }
   ],
   "source": [
    "csvDate = [20160331;20160401]          #two dates\n",
    "\n",
    "jlDate = Date.(string.(csvDate),\"yyyymmdd\")    #convert to string and then Julia Date\n",
    "\n",
    "printmat(jlDate)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Converting from DateTime (Excel) to Date\n",
    "\n",
    "Background: importing xls sheets with ExcelReaders gives DateTime, even if the sheets only contain dates (daily data, say)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "DateTime and then converted to Date:\n",
      "2016-03-31T00:00:00\n",
      "2016-04-01T00:00:00\n",
      "\n",
      "2016-03-31\n",
      "2016-04-01\n",
      "\n"
     ]
    }
   ],
   "source": [
    "xlsDate = [DateTime(2016,3,31);DateTime(2016,4,1)]     #to be converted\n",
    "\n",
    "jlDate  = Date.(xlsDate)\n",
    "\n",
    "println(\"\\nDateTime and then converted to Date:\")\n",
    "printmat(xlsDate)\n",
    "printmat(jlDate)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Converting from Matlab's datenum to Date\n",
    "\n",
    "Background: in Matlab `datenum(2016,3,31)` gives 736420.0. In contrast, in Julia (which follows the ISO 8601 standard), `Dates.value(Date(2016,3,31))` gives 736054, which is 366 less (and it is an integer). A conversion is therefore required."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "matlab datenum and correct Julia Date:\n",
      "  736420.000  2016-03-31\n",
      "  736421.000  2016-04-01\n",
      "\n"
     ]
    }
   ],
   "source": [
    "dNml = [736420.0;736421.0]            #to be converted, 2016-03-31;2016-04-01\n",
    "\n",
    "jlDate = round.(Int,dNml) .- 366\n",
    "jlDate = Date.(rata2datetime.(jlDate))\n",
    "\n",
    "println(\"\\nmatlab datenum and correct Julia Date:\")\n",
    "printmat([dNml jlDate],width=12)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "# Time Arithmetics\n",
    "\n",
    "You can add and subtract Dates from each other."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "difference between two dates: 30 days\n",
      "as a fraction of the year:      0.082\n"
     ]
    }
   ],
   "source": [
    "d1 = Date(2016,3,31)\n",
    "d2 = Date(2016,4,30)\n",
    "\n",
    "dif    = d2 - d1               #count the number of days between d2 and d1\n",
    "difRel = Dates.value(dif)/daysinyear(d1)   #Dates.value() is the datenumber, needs prefix Dates\n",
    "\n",
    "println(\"difference between two dates: \",dif)\n",
    "printlnPs(\"as a fraction of the year: \",difRel)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "d1 and one month later: 2016-03-31 2016-04-30\n"
     ]
    }
   ],
   "source": [
    "d3 = d1 + Month(1)          #one month after d1\n",
    "\n",
    "println(\"d1 and one month later: \",d1,\" \",d3)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Looking up Day of the Week and More"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "day of the week of date: 2016-03-31 4\n",
      "day of the year of date: 2016-03-31 91\n",
      "\n",
      "Splitting up a date: 2016 3 31\n"
     ]
    }
   ],
   "source": [
    "println(\"day of the week of date: \",d1,\" \",dayofweek(d1))\n",
    "println(\"day of the year of date: \",d1,\" \",dayofyear(d1))\n",
    "\n",
    "(y,m,d)= yearmonthday(d1)            #splitting up a date\n",
    "println(\"\\nSplitting up a date: \",y,\" \",m,\" \",d)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Printing a Date\n",
    "\n",
    "with your own formatting (see the manual for many other formatting options)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "31 Mar 2016\n",
      "31-03-2016\n"
     ]
    }
   ],
   "source": [
    "println(Dates.format(d1,\"d u yyyy\"))                #needs prefix Dates\n",
    "println(Dates.format(d1,\"dd-mm-yyyy\"))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "@webio": {
   "lastCommId": null,
   "lastKernelId": null
  },
  "anaconda-cloud": {},
  "kernelspec": {
   "display_name": "Julia 1.6.2",
   "language": "julia",
   "name": "julia-1.6"
  },
  "language_info": {
   "file_extension": ".jl",
   "mimetype": "application/julia",
   "name": "julia",
   "version": "1.6.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
