{ "cells": [ { "cell_type": "markdown", "id": "4a87b5ef", "metadata": {}, "source": [ "--- \n", " \n", "\n", "

Department of Data Science

\n", "

Course: Tools and Techniques for Data Science

\n", "\n", "---\n", "

Instructor: Muhammad Arif Butt, Ph.D.

" ] }, { "cell_type": "markdown", "id": "ab0dc25c", "metadata": {}, "source": [ "

Lecture 3.20 (Pandas-12)

" ] }, { "cell_type": "markdown", "id": "e2e9e8c5", "metadata": {}, "source": [ "\"Open" ] }, { "cell_type": "markdown", "id": "19f82705", "metadata": {}, "source": [ "\n", "\n", "## _Working with Time Series Data_\n", "\n", "**Read Documentation for details:** \n", "https://pandas.pydata.org/docs/user_guide/timeseries.html#overview" ] }, { "cell_type": "code", "execution_count": null, "id": "b153b19a", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "5f2f60b8", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "7109496b", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "a9e20ddb", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": 1, "id": "ec33647f", "metadata": {}, "outputs": [], "source": [ "# To install this library in Jupyter notebook\n", "#import sys\n", "#!{sys.executable} -m pip install pandas" ] }, { "cell_type": "code", "execution_count": 2, "id": "671d3985", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "('1.4.1',\n", " ['/Users/arif/opt/anaconda3/envs/python10/lib/python3.10/site-packages/pandas'])" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import pandas as pd\n", "pd.__version__ , pd.__path__" ] }, { "cell_type": "code", "execution_count": null, "id": "24e3f49c", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "ae69a7b9", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "3daf1a87", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "8dcbafbd", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "12db95e1", "metadata": {}, "source": [ "## Learning agenda of this notebook\n", "1. Recap of Python's Built-in Time and Datetime Modules\n", " - Python Time module\n", " - Python Datetime module\n", " - Time Zones\n", "2. Overview of Pandas Time Series Data Structures\n", "3. Converting Strings to Pandas DateTime64 type\n", " - Convert a Scalar String to DateTime\n", " - Convert Pandas Series to DateTime\n", " - Handling Issues of DateTime Formats\n", " - Convert a Single Integer to Pandas DateTime\n", "4. Practicing with a Simple Dataset\n", "5. Practicing with UFO Dataset\n", "6. Practicing with Crypto-Currency Dataset\n", "7. Bonus:" ] }, { "cell_type": "code", "execution_count": null, "id": "3d3af656", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "c63ececf", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "b2e8052c", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "c8ce0dd8", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "d2f1c77f", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "cf573669", "metadata": {}, "source": [ "## Overview of Time Series Data\n", "#### What is Time Series Data?\n", "- Time series data, also referred to as time-stamped data, is a sequence of data recorded at specific intervals of time (can be monthly, daily, hourly, ....).\n", "- These data points are analyzed to forecast the future.\n", "- It is time dependent.\n", "- Time series data is effected by four components:\n", " - **Trend:** Increase or decrease in the series over a period of time. It persist over a long period of time. For Example, population growth of a country over years\n", " - **Seasonality:** Regular patterns of up and down fluctuations, e.g., Sale of icecream increases in every summer\n", " - **Cyclicity:** Variations that are caused at irregular intervals. Forexample, 5 years of economic growth, followed by 3 years of recession, followed by 7 years of economic growth, followed. by 1 year of recession\n", " - **Irregularity:** It refers to variations which occur due to unpredictable factors and also do not repeat in particular patterns. For examples, fluctuations caused by earthquakes, floods, wars, etc\n", " \n", "#### What is time series Analysis?\n", "- Time series analysis is the use of statistical methods to analyze time series data and extract meaningful statistics and characteristics about the data. Time series analysis helps identify trends, cycles, and seasonal variances to aid in the forecasting of a future event.\n", "- Time series analysis can be useful to see how a given variable changes over time (while time itself, in time series data, is often the independent variable). Time series analysis can also be used to examine how the changes associated with the chosen data point compare to shifts in other variables over the same time period." ] }, { "cell_type": "code", "execution_count": null, "id": "d2413820", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "93b17f62", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "e642f910", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "0a04df60", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "30308522", "metadata": {}, "source": [ "## 1. Recap of Python Modules Related to Date and Time" ] }, { "cell_type": "markdown", "id": "1a058d60", "metadata": {}, "source": [ "## a. Python Time Module\n", "- Python Time module is principally for working with UNIX time stamps; expressed as a floating point number taken to be seconds since the unix epoch (00:00:00 UTC on 1 January 1970)" ] }, { "cell_type": "code", "execution_count": 3, "id": "64a13665", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['_STRUCT_TM_ITEMS', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'altzone', 'asctime', 'ctime', 'daylight', 'get_clock_info', 'gmtime', 'localtime', 'mktime', 'monotonic', 'monotonic_ns', 'perf_counter', 'perf_counter_ns', 'process_time', 'process_time_ns', 'sleep', 'strftime', 'strptime', 'struct_time', 'time', 'time_ns', 'timezone', 'tzname', 'tzset']\n" ] } ], "source": [ "# Use `dir()` to get the list of methods in the Python `time` module\n", "import time\n", "print(dir(time))" ] }, { "cell_type": "code", "execution_count": null, "id": "6e181cdd", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "8459a6de", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "0da747cd", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "f704287d", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "b7c7db69", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "911697e9", "metadata": {}, "source": [ "**(i) The `time.time()` method returns the current time in seconds since UNIX Epoch (00:00:00 UTC on 1 January 1970)**" ] }, { "cell_type": "code", "execution_count": 4, "id": "d0fa8a98", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1645623933.013344" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "seconds = time.time()\n", "seconds" ] }, { "cell_type": "markdown", "id": "9ee734d8", "metadata": {}, "source": [ "> You can achieve the same using the system `date` command and passing it `+%s` command line arugment" ] }, { "cell_type": "code", "execution_count": 5, "id": "5cc8b863", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1645623933\r\n" ] } ], "source": [ "!date +%s" ] }, { "cell_type": "code", "execution_count": null, "id": "83d89815", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "48e7a924", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "5f1587c0", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "ef8bc3c0", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "34cc80ff", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "39132701", "metadata": {}, "source": [ "**(ii) The `time.ctime()` method returns a date time string corresponding to the number of seconds passed to it since UNIX Epoch.**" ] }, { "cell_type": "code", "execution_count": 6, "id": "70d0bb12", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'Thu Jan 1 05:00:00 1970'" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Showing `+5:00` hours time delta because of local time zone (PKT) differs from UTC with 5 hours\n", "dtg1 = time.ctime(0)\n", "dtg1" ] }, { "cell_type": "code", "execution_count": 7, "id": "3e3bb56a", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'Wed Feb 23 18:45:33 2022'" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#If you pass the current elapsed seconds since UNIX epoch to the `ctime()` method, it returns current datetime\n", "seconds = time.time()\n", "dtg2 = time.ctime(seconds)\n", "dtg2" ] }, { "cell_type": "code", "execution_count": 8, "id": "6431482c", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Wed Feb 23 18:45:33 PKT 2022\r\n" ] } ], "source": [ "#Get time using shell command\n", "!date" ] }, { "cell_type": "code", "execution_count": null, "id": "78a88a21", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "abe89e6c", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "815d83fd", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "56b95f64", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "5e47340a", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "54006989", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "9445c4b5", "metadata": {}, "source": [ "## b. Python Datetime Module\n", "The `datetime` module can support many of the same operations as `time` module, but provides a more object oriented set of types, and also has some limited support for time zones as well." ] }, { "cell_type": "code", "execution_count": 9, "id": "121ebc36", "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['MAXYEAR', 'MINYEAR', '__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'date', 'datetime', 'datetime_CAPI', 'sys', 'time', 'timedelta', 'timezone', 'tzinfo']\n" ] } ], "source": [ "# use dir() to get the list of complete functions in datetime module\n", "import datetime\n", "print(dir(datetime))" ] }, { "cell_type": "code", "execution_count": null, "id": "f544498b", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "33aa7221", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "09c0b7b2", "metadata": {}, "source": [ "**(i) The `datetime.datetime(year, month, day[, hour[, minute[, second[, microsecond[,tzinfo]]]]])` method is used to create any random date, along with time**" ] }, { "cell_type": "code", "execution_count": 10, "id": "929a2bc2", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2021-12-31 00:00:00\n", "\n" ] } ], "source": [ "dtg = datetime.datetime(2021,12,31)\n", "print(dtg)\n", "print(type(dtg))" ] }, { "cell_type": "code", "execution_count": 11, "id": "dd1869b6", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2021-12-31 04:30:54.000678\n" ] } ], "source": [ "print(datetime.datetime(2021, 12, 31, 4, 30, 54, 678))" ] }, { "cell_type": "code", "execution_count": null, "id": "a46febb5", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "992d4a09", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "5b197019", "metadata": {}, "source": [ "**(ii) The `time([hour[, minute[, second[, microsecond[, tzinfo]]]]]) ` methods returns a time object. All arguments are optional**" ] }, { "cell_type": "code", "execution_count": 12, "id": "b4c51969", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "10:15:00\n", "\n" ] } ], "source": [ "t1 = datetime.time(10, 15)\n", "print(t1)\n", "print(type(t1))" ] }, { "cell_type": "code", "execution_count": null, "id": "d1e210f4", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "f9e7146d", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "b4ddbdda", "metadata": {}, "source": [ "**(iii) You can explore some commonly used attributes related with the ``.**\n", "- `dtg.year:` returns the year\n", "- `dtg.month:` returns the month\n", "- `dtg.day:` returns the date\n", "- `dtg.hour:` returns the hour\n", "- `dtg.minute:` returns the minutes\n", "- `dtg.second:` returns the seconds" ] }, { "cell_type": "code", "execution_count": 13, "id": "a9cac04f", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2021-12-31 04:25:58\n", "\n" ] } ], "source": [ "dtg = datetime.datetime(2021, 12, 31, 4, 25, 58)\n", "print(dtg)\n", "print(type(dtg))" ] }, { "cell_type": "code", "execution_count": 14, "id": "7fb3b193", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2021" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dtg.year" ] }, { "cell_type": "code", "execution_count": 15, "id": "0fe16a1d", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "12" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dtg.month" ] }, { "cell_type": "code", "execution_count": 16, "id": "4c20a73c", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "31" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dtg.day" ] }, { "cell_type": "code", "execution_count": 17, "id": "a5d9ffcb", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "4" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dtg.hour" ] }, { "cell_type": "code", "execution_count": 18, "id": "99a1c2e7", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "25" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dtg.minute" ] }, { "cell_type": "code", "execution_count": 19, "id": "50e73280", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "58" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dtg.second" ] }, { "cell_type": "code", "execution_count": null, "id": "2acd54e1", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "28946f80", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "db4c9e9f", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "8adc7c68", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "65f05563", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "e63806ac", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "f76a57ac", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "3ece3d07", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "344873f3", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "18438927", "metadata": {}, "source": [ "### c. Time Zones:\n", "\n", "\n", "\n", "- Since noon happens at different times in different parts of the world, therefore, the world is divided in different time zones.\n", "- On Mac, Linux, and Windows operating systems, the information about these time zones is kept in files.\n", "- Let me show you the contents of these files on my Mac system" ] }, { "cell_type": "code", "execution_count": 20, "id": "caa5d76b", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'Thu Jan 1 05:00:00 1970'" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# The UNIX Epoch in system local time is five hours ahead of mid night 1st Jan 1970\n", "# (Coordinated Universal Time a successor to Greenwich Mean Time)\n", "dtg1 = time.ctime(0)\n", "dtg1" ] }, { "cell_type": "markdown", "id": "c8098a53", "metadata": {}, "source": [ "> You may have noticed that above cell does not display the exact UNIX epoch, i.e., mid-night 1st January 1970 rather is 5 hours ahead. This is because my machine is configured as per the time zone of Pakistan having a `+5:00` timedelta from Cooridnated Universtal Time (UTC a successor to GMT)" ] }, { "cell_type": "code", "execution_count": 21, "id": "1333e296", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "+VERSION \u001b[34mCanada\u001b[m\u001b[m GB Iran NZ-CHAT UCT\r\n", "\u001b[34mAfrica\u001b[m\u001b[m \u001b[34mChile\u001b[m\u001b[m GB-Eire Israel Navajo \u001b[34mUS\u001b[m\u001b[m\r\n", "\u001b[34mAmerica\u001b[m\u001b[m Cuba GMT Jamaica PRC UTC\r\n", "\u001b[34mAntarctica\u001b[m\u001b[m EET GMT+0 Japan PST8PDT Universal\r\n", "\u001b[34mArctic\u001b[m\u001b[m EST GMT-0 Kwajalein \u001b[34mPacific\u001b[m\u001b[m W-SU\r\n", "\u001b[34mAsia\u001b[m\u001b[m EST5EDT GMT0 Libya Poland WET\r\n", "\u001b[34mAtlantic\u001b[m\u001b[m Egypt Greenwich MET Portugal Zulu\r\n", "\u001b[34mAustralia\u001b[m\u001b[m Eire HST MST ROC iso3166.tab\r\n", "\u001b[34mBrazil\u001b[m\u001b[m \u001b[34mEtc\u001b[m\u001b[m Hongkong MST7MDT ROK leapseconds\r\n", "CET \u001b[34mEurope\u001b[m\u001b[m Iceland \u001b[34mMexico\u001b[m\u001b[m Singapore posixrules\r\n", "CST6CDT Factory \u001b[34mIndian\u001b[m\u001b[m NZ Turkey zone.tab\r\n" ] } ], "source": [ "!ls /usr/share/zoneinfo/" ] }, { "cell_type": "code", "execution_count": 22, "id": "4a57581c", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Aden Chongqing Jerusalem Novokuznetsk Tashkent\r\n", "Almaty Chungking Kabul Novosibirsk Tbilisi\r\n", "Amman Colombo Kamchatka Omsk Tehran\r\n", "Anadyr Dacca Karachi Oral Tel_Aviv\r\n", "Aqtau Damascus Kashgar Phnom_Penh Thimbu\r\n", "Aqtobe Dhaka Kathmandu Pontianak Thimphu\r\n", "Ashgabat Dili Katmandu Pyongyang Tokyo\r\n", "Ashkhabad Dubai Khandyga Qatar Tomsk\r\n", "Atyrau Dushanbe Kolkata Qostanay Ujung_Pandang\r\n", "Baghdad Famagusta Krasnoyarsk Qyzylorda Ulaanbaatar\r\n", "Bahrain Gaza Kuala_Lumpur Rangoon Ulan_Bator\r\n", "Baku Harbin Kuching Riyadh Urumqi\r\n", "Bangkok Hebron Kuwait Saigon Ust-Nera\r\n", "Barnaul Ho_Chi_Minh Macao Sakhalin Vientiane\r\n", "Beirut Hong_Kong Macau Samarkand Vladivostok\r\n", "Bishkek Hovd Magadan Seoul Yakutsk\r\n", "Brunei Irkutsk Makassar Shanghai Yangon\r\n", "Calcutta Istanbul Manila Singapore Yekaterinburg\r\n", "Chita Jakarta Muscat Srednekolymsk Yerevan\r\n", "Choibalsan Jayapura Nicosia Taipei\r\n" ] } ], "source": [ "!ls /usr/share/zoneinfo/Asia" ] }, { "cell_type": "code", "execution_count": null, "id": "0263a5c6", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "921fed43", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "9e127fbc", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "6086280e", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "28b459e1", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "4718752b", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "9250cda6", "metadata": {}, "source": [ ">On all UNIX based systems (Mac, Linux), `TZ` is an environment variable that can be set to any of the above files to get the date of that appropriate zone. By default the system is configured to set it to the local time of the country" ] }, { "cell_type": "code", "execution_count": 23, "id": "1fa0d04a", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Wed Feb 23 18:45:33 PKT 2022\r\n" ] } ], "source": [ "! date" ] }, { "cell_type": "code", "execution_count": 24, "id": "0c065ca5", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Wed Feb 23 18:45:33 PKT 2022\r\n" ] } ], "source": [ "! TZ=Asia/Karachi date" ] }, { "cell_type": "code", "execution_count": 25, "id": "60366a50", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Wed Feb 23 19:15:33 IST 2022\r\n" ] } ], "source": [ "! TZ=Asia/Calcutta date" ] }, { "cell_type": "code", "execution_count": 26, "id": "f1e5d015", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Wed Feb 23 18:45:33 +05 2022\r\n" ] } ], "source": [ "! TZ=Asia/Tashkent date" ] }, { "cell_type": "markdown", "id": "0190d588", "metadata": {}, "source": [ ">So you can observe if we run `date` command after setting the TZ variable to Karachi and Calcutta, their local date times are displayed. Being in different time zones Pakistan Standard Time is 30 minutes before India" ] }, { "cell_type": "code", "execution_count": null, "id": "bd322c36", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "972b03ad", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "1f1b1c72", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "989d9343", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "024a390f", "metadata": {}, "source": [ "## 2. Overview of Pandas Time Series Data Structures\n", "- **Timestamp & DatetimeIndex:**\n", " - A `Timestamp` refer to particular moment in time, e.g., 28 July, 1969 at 11:00 am\n", " - It is a replacement of Python's built-in datetime object\n", " - The `pd.to_datetime()` method is used to create a `Timestamp` object\n", " - The `pd.date_range()` method is used to generate a `DatetimeIndex` object\n", "- **Period & PeriodIndex:**\n", " - A `Period` refer to length of time between a start and end point, with each interval of uniform length\n", " - The `pd.to_period()` method is used to create a `Period` object\n", " - The `pd.period_range()` method is used to create a `PeriodIndex`\n", "- **Timedelta & TimedeltaIndex:**\n", " - A `Timedelta` or duration refer to an exact length of time, e.g., a duration of 235.54 seconds\n", " - A `Timedelta` is created when you subtract two dates, while a `TimedeltaIndex` is created when you subtract two Periods" ] }, { "cell_type": "code", "execution_count": null, "id": "19c35812", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "d4ca6ead", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "46b16d5a", "metadata": {}, "source": [ "## 3. Converting Strings to Pandas Timestamp Object\n", "- Pandas `pd.to_datetime()` method is used to convert its only required argument `arg` to a Timestamp object.\n", "\n", "```\n", "pd.to_datetime(arg, format=None, errors='raise', unit=None, origin='unix')\n", "```\n", "- Where,\n", " - `arg` can be a string, Series, int, datetime, list, tuple, 1-d array, DataFrame/dict-like object to convert\n", " - `errors` {‘ignore’, ‘raise’, ‘coerce’}, default ‘raise’\n", " - If `raise`, then invalid parsing will raise an exception.\n", " - If `coerce`, then invalid parsing will be set as NaT.\n", " - If `ignore`, then invalid parsing will return the input\n", " - `format`: Used if the `arg` is not in the format as expected by the method\n", " - `unit`: Used if the `arg` is integer and can be (D,s,ms,us,ns) passed since `origin` (default is `ns`)\n", " - `origin`: is the reference point from where you want to start counting your units from. The default value of `origin` is the UNIX epoch." ] }, { "cell_type": "code", "execution_count": null, "id": "c17e7df2", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "07747255", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "82b72df9", "metadata": {}, "source": [ "### a. Convert a Scalar String to Timestamp" ] }, { "cell_type": "code", "execution_count": 27, "id": "a0f45498", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2022-03-06 08:30:15\n", "\n" ] } ], "source": [ "#YYYY-MM-DD\n", "import pandas as pd\n", "str_date = '2022-03-06 08:30:15'\n", "print(str_date)\n", "print(type(str_date))" ] }, { "cell_type": "code", "execution_count": 28, "id": "177a51a0", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2022-03-06 08:30:15\n", "\n" ] } ], "source": [ "ts = pd.to_datetime(str_date)\n", "print(ts)\n", "print(type(ts))" ] }, { "cell_type": "markdown", "id": "817f6812", "metadata": {}, "source": [ "**`pd.Timestamp Attributes`**\n", "\n", "`Series.dt.[ts.]second`: Returns seconds\n", "\n", "`ts.minute`: Returns year\n", "\n", "`ts.hour`: Returns hour\n", "\n", "`ts.day`: Returns day\n", "\n", "`ts.month`: Returns month as January=1, December=12\n", "\n", "`ts.year`: Returns the year of datetime object\n", "\n", "`Series.dt.day_name()`: Returns name of the day as string\n", "\n", "`Series.dt.month_name()`: Returns month as string\n", "\n", "For details Read: https://pandas.pydata.org/docs/reference/api/pandas.Series.dt.year.html" ] }, { "cell_type": "code", "execution_count": 29, "id": "a863d8ce", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2022" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ts.year" ] }, { "cell_type": "code", "execution_count": 30, "id": "829ca9af", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "3" ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ts.month" ] }, { "cell_type": "code", "execution_count": 31, "id": "85564ddb", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "6" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ts.day" ] }, { "cell_type": "code", "execution_count": 32, "id": "eb6d073e", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'March'" ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ts.month_name()" ] }, { "cell_type": "code", "execution_count": 33, "id": "55482bf8", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "8" ] }, "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ts.hour" ] }, { "cell_type": "code", "execution_count": 34, "id": "6490fee1", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "30" ] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ts.minute" ] }, { "cell_type": "code", "execution_count": 35, "id": "95852744", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1" ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ts.quarter" ] }, { "cell_type": "markdown", "id": "57df2339", "metadata": {}, "source": [ ">You can pass a list of strings containing dates to `pd.to_datetime()`, which will return a `DatetimeIndex` object" ] }, { "cell_type": "code", "execution_count": 36, "id": "34603f8a", "metadata": {}, "outputs": [], "source": [ "# If there is a invalid string that cannot be converted to a valid date, you will get an error\n", "#pd.to_datetime(['2017-01-05', 'Jan 6, 2017', 'abc'])" ] }, { "cell_type": "code", "execution_count": 37, "id": "531f0b9b", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "DatetimeIndex(['2017-01-05', '2017-01-06', 'NaT'], dtype='datetime64[ns]', freq=None)" ] }, "execution_count": 37, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Use `errors=coerce` to translate the remaining data and keep `NaT` for invalid string\n", "pd.to_datetime(['2017-01-05', 'Jan 6, 2017', 'abc'], errors='coerce')" ] }, { "cell_type": "code", "execution_count": null, "id": "e0826324", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "d543b639", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "fedd9485", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "08878c89", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "6ca04171", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "ee9498dc", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "4b289460", "metadata": {}, "source": [ "### b. Convert Pandas Series of Strings to Series of Timestamps" ] }, { "cell_type": "code", "execution_count": 38, "id": "4efb47fb", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0 2022-03-06 08:30\n", "1 2022/03/06 08:30\n", "2 6 March, 2022 08:30\n", "3 Mar 06, 2022 08:30\n", "4 202203060830\n", "dtype: object" ] }, "execution_count": 38, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# A pandas series having same date but in different formats\n", "s1 = pd.Series(['2022-03-06 08:30', '2022/03/06 08:30', '6 March, 2022 08:30', 'Mar 06, 2022 08:30', '202203060830'])\n", "type(s1)\n", "s1" ] }, { "cell_type": "code", "execution_count": 39, "id": "a6e6b90d", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0 2022-03-06 08:30:00\n", "1 2022-03-06 08:30:00\n", "2 2022-03-06 08:30:00\n", "3 2022-03-06 08:30:00\n", "4 2022-03-06 08:30:00\n", "dtype: datetime64[ns]" ] }, "execution_count": 39, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# to_datetime() function will convert all these different formats into a common format\n", "s2 = pd.to_datetime(s1)\n", "s2" ] }, { "cell_type": "code", "execution_count": 40, "id": "56db6352", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "pandas.core.series.Series" ] }, "execution_count": 40, "metadata": {}, "output_type": "execute_result" } ], "source": [ "type(s2)" ] }, { "cell_type": "code", "execution_count": 41, "id": "5ec54b33", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "pandas._libs.tslibs.timestamps.Timestamp" ] }, "execution_count": 41, "metadata": {}, "output_type": "execute_result" } ], "source": [ "type(s2[0])" ] }, { "cell_type": "code", "execution_count": 42, "id": "e1f2c22e", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(6, 3)" ] }, "execution_count": 42, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s2[0].day, s2[0].month" ] }, { "cell_type": "code", "execution_count": null, "id": "e8fe752d", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "b9b02eec", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "b690b86a", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "3d30d249", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "54687d75", "metadata": {}, "source": [ "### c. Handling Issues of DateTime Formats\n", "From above examples, it appears that `pd.to_datetime()` works fine for all date formats. Let us try storing 6 March, 2022 as '06/03/2022' or '06-03-2022'" ] }, { "cell_type": "markdown", "id": "f9562539", "metadata": {}, "source": [ "**(i) Problem 1:**" ] }, { "cell_type": "code", "execution_count": 43, "id": "55610b05", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Timestamp('2022-06-03 00:00:00')" ] }, "execution_count": 43, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ts = pd.to_datetime('06-03-2022')\n", "ts" ] }, { "cell_type": "code", "execution_count": 44, "id": "4155d90e", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(3, 6)" ] }, "execution_count": 44, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ts.day, ts.month" ] }, { "cell_type": "markdown", "id": "ea4f7153", "metadata": {}, "source": [ "**Oops!**, Pandas `to_datetime()` method has converted the string to datetime, but interpreted it as 3 June 2022\n", ">The `pd.to_datetime()` by default, will parse string with month first (MM/DD, MM DD, or MM-DD) format" ] }, { "cell_type": "code", "execution_count": 45, "id": "5c252a91", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/var/folders/1t/g3ylw8h50cjdqmk5d6jh1qmm0000gn/T/ipykernel_11456/3152508908.py:2: UserWarning: Parsing '26-03-2022' in DD/MM/YYYY format. Provide format or specify infer_datetime_format=True for consistent parsing.\n", " ts = pd.to_datetime('26-03-2022')\n" ] }, { "data": { "text/plain": [ "(26, 3)" ] }, "execution_count": 45, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Intelligence\n", "ts = pd.to_datetime('26-03-2022')\n", "ts.day, ts.month" ] }, { "cell_type": "code", "execution_count": null, "id": "41faab35", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "2de68cd0", "metadata": {}, "source": [ "**(ii) Problem 2:**" ] }, { "cell_type": "code", "execution_count": 46, "id": "85a11bf7", "metadata": {}, "outputs": [], "source": [ "#ts = pd.to_datetime('2022-03-06 08-PM')" ] }, { "cell_type": "markdown", "id": "2b6213ee", "metadata": {}, "source": [ "**Oops again**!, Pandas `to_datetime()` method has raised an error saying `ParserError: Unknown string format: 2022-03-06 08-PM`\n", ">It seems that `pd.to_datetime()` expects the time to be in 24 hours clock and not if the time is mentioned using AM (Ante-Meridiem meaning before Midday) or PM (Post-Meridiem, meaning after midday)" ] }, { "cell_type": "code", "execution_count": null, "id": "8d49ed90", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "4295b54f", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "9110939b", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "768fc152", "metadata": {}, "source": [ "**(iii) Solution of above two Problems:**\n", ">Pass an appropriate `format string` to the `format` argument of the `pd.to_datetime()` method. The format string need to be prepared as per the string date format.\n", "Visit this link to see for Format codes: https://pandas.pydata.org/docs/reference/api/pandas.Period.strftime.html" ] }, { "cell_type": "code", "execution_count": 47, "id": "9edd954d", "metadata": {}, "outputs": [], "source": [ "# Passing appropriate format string will resolve above two problems\n", "ts = pd.to_datetime('06-03-2022 08-PM', format = '%d-%m-%Y %I-%p')" ] }, { "cell_type": "code", "execution_count": 48, "id": "f1a596e0", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Timestamp('2022-03-06 20:00:00')" ] }, "execution_count": 48, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ts" ] }, { "cell_type": "code", "execution_count": 49, "id": "2e121dd3", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(6, 3)" ] }, "execution_count": 49, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ts.day, ts.month" ] }, { "cell_type": "code", "execution_count": null, "id": "55ef2e7e", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "a00c1a82", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "0f5a2246", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "82c1a490", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "2102f083", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "d6aca85e", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "3a61f282", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "dc8b9a70", "metadata": {}, "source": [ "### d. Convert a Single Integer to Pandas Timestamp\n", "- Pandas `pd.to_datetime()` method can also be used to convert the first argument passed as integer to Pandas `Timestamp` object. \n", "- The `unit` argument tells about the unit of the `arg`, and it can be seconds, days or years\n", "- The `origin` argument can be any reference point from where you want to start counting your units from. The default value of `origin` is the UNIX epoch.\n", "```\n", "pd.to_datetime(arg, format=None, unit=None, origin='unix')\n", "```" ] }, { "cell_type": "code", "execution_count": 50, "id": "2868bcdd", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1645623934\r\n" ] } ], "source": [ "!date +%s" ] }, { "cell_type": "code", "execution_count": 51, "id": "a6c7d1ae", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Timestamp('1970-01-20 01:06:34.235000')" ] }, "execution_count": 51, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ts = pd.to_datetime(1645594235, unit='ms', origin='unix')\n", "ts" ] }, { "cell_type": "markdown", "id": "c2f45869", "metadata": {}, "source": [ ">You can mention the origin as some other reference point of your choice" ] }, { "cell_type": "code", "execution_count": 52, "id": "ed64ab8f", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Timestamp('2022-01-11 00:00:00')" ] }, "execution_count": 52, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ts = pd.to_datetime(10, unit='D', origin='2022-01-01')\n", "ts" ] }, { "cell_type": "code", "execution_count": null, "id": "a536c17e", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "4744af7f", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "c4118d99", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "e8021bec", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "072c792d", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "d16d2b3f", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "c9946871", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "b0a3269f", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "7cef1736", "metadata": {}, "source": [ "## 4. Practicing with a Simple Dataset" ] }, { "cell_type": "markdown", "id": "20aab3ac", "metadata": {}, "source": [ "### a. Option 1: Read the Dataset as such and then convert the Column Datatype to Timestamp64" ] }, { "cell_type": "markdown", "id": "ad199219", "metadata": {}, "source": [ "**Example 1:** A dataset with datetime in a format as expected by `pd.to_datetime()`" ] }, { "cell_type": "code", "execution_count": 53, "id": "87f58d21", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "name,dob,address,gender\r", "\r\n", "Khurram,2022-03-06 21:10,Lahore,Male\r", "\r\n", "Fatima,2022/03/06 08:30,Islamabad,Female\r", "\r\n", "Huzaifa,2022-03-06 20:15,Karachi,Male\r", "\r\n", "Shaista,2022.03.06 18:05,Peshawer,Female" ] } ], "source": [ "# yyyy-mm-dd hr:min\n", "! cat datasets/datetime1.csv" ] }, { "cell_type": "code", "execution_count": null, "id": "3e62ef56", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": 54, "id": "cf30ab52", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
namedobaddressgender
0Khurram2022-03-06 21:10LahoreMale
1Fatima2022/03/06 08:30IslamabadFemale
2Huzaifa2022-03-06 20:15KarachiMale
3Shaista2022.03.06 18:05PeshawerFemale
\n", "
" ], "text/plain": [ " name dob address gender\n", "0 Khurram 2022-03-06 21:10 Lahore Male\n", "1 Fatima 2022/03/06 08:30 Islamabad Female\n", "2 Huzaifa 2022-03-06 20:15 Karachi Male\n", "3 Shaista 2022.03.06 18:05 Peshawer Female" ] }, "execution_count": 54, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import pandas as pd\n", "df = pd.read_csv(\"datasets/datetime1.csv\")\n", "df" ] }, { "cell_type": "code", "execution_count": 55, "id": "1705cd65", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "name object\n", "dob object\n", "address object\n", "gender object\n", "dtype: object" ] }, "execution_count": 55, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.dtypes" ] }, { "cell_type": "code", "execution_count": 56, "id": "ac6fe6bc", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0 2022-03-06 21:10\n", "1 2022/03/06 08:30\n", "2 2022-03-06 20:15\n", "3 2022.03.06 18:05\n", "Name: dob, dtype: object" ] }, "execution_count": 56, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.loc[:,'dob']" ] }, { "cell_type": "code", "execution_count": 57, "id": "018e2eee", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0 2022-03-06 21:10:00\n", "1 2022-03-06 08:30:00\n", "2 2022-03-06 20:15:00\n", "3 2022-03-06 18:05:00\n", "Name: dob, dtype: datetime64[ns]" ] }, "execution_count": 57, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.to_datetime(df.loc[:,'dob'])" ] }, { "cell_type": "code", "execution_count": null, "id": "c6dadf1b", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": 58, "id": "9605e3d3", "metadata": {}, "outputs": [], "source": [ "df['dob'] = pd.to_datetime(df.loc[:,'dob'])" ] }, { "cell_type": "code", "execution_count": 59, "id": "c37da731", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "name object\n", "dob datetime64[ns]\n", "address object\n", "gender object\n", "dtype: object" ] }, "execution_count": 59, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.dtypes" ] }, { "cell_type": "code", "execution_count": 60, "id": "406f2536", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
namedobaddressgender
0Khurram2022-03-06 21:10:00LahoreMale
1Fatima2022-03-06 08:30:00IslamabadFemale
2Huzaifa2022-03-06 20:15:00KarachiMale
3Shaista2022-03-06 18:05:00PeshawerFemale
\n", "
" ], "text/plain": [ " name dob address gender\n", "0 Khurram 2022-03-06 21:10:00 Lahore Male\n", "1 Fatima 2022-03-06 08:30:00 Islamabad Female\n", "2 Huzaifa 2022-03-06 20:15:00 Karachi Male\n", "3 Shaista 2022-03-06 18:05:00 Peshawer Female" ] }, "execution_count": 60, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df" ] }, { "cell_type": "code", "execution_count": null, "id": "0d7f14a1", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "40b62137", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "f1c4cea9", "metadata": {}, "source": [ "**Example 2:** A dataset with datetime in a format NOT expected by `pd.to_datetime()`" ] }, { "cell_type": "code", "execution_count": 61, "id": "2aba0c34", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "name,dob,address,gender\r", "\r\n", "Khurram,02-07-1980 08-PM,Lahore,Male\r", "\r\n", "Fatima,15-06-2001 06-AM,Islamabad,Female\r", "\r\n", "Huzaifa,08-04-1999 05-PM,Karachi,Male\r", "\r\n", "Shaista,10-09-2005 02-AM,Peshawer,Female" ] } ], "source": [ "# dd-mm-yyyy hr-PM\n", "! cat datasets/datetime2.csv" ] }, { "cell_type": "code", "execution_count": null, "id": "b2548571", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": 62, "id": "0ced9b12", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
namedobaddressgender
0Khurram02-07-1980 08-PMLahoreMale
1Fatima15-06-2001 06-AMIslamabadFemale
2Huzaifa08-04-1999 05-PMKarachiMale
3Shaista10-09-2005 02-AMPeshawerFemale
\n", "
" ], "text/plain": [ " name dob address gender\n", "0 Khurram 02-07-1980 08-PM Lahore Male\n", "1 Fatima 15-06-2001 06-AM Islamabad Female\n", "2 Huzaifa 08-04-1999 05-PM Karachi Male\n", "3 Shaista 10-09-2005 02-AM Peshawer Female" ] }, "execution_count": 62, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df = pd.read_csv(\"datasets/datetime2.csv\")\n", "df" ] }, { "cell_type": "code", "execution_count": 63, "id": "fbd41e0a", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "name object\n", "dob object\n", "address object\n", "gender object\n", "dtype: object" ] }, "execution_count": 63, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.dtypes" ] }, { "cell_type": "code", "execution_count": null, "id": "9b4a525b", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "eed6a046", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": 64, "id": "b41321fb", "metadata": {}, "outputs": [], "source": [ "# Following LOC will now generate `ParserError: Unknown string format: 02-07-1980 08-PM`\n", "#pd.to_datetime(df.loc[:,'dob'])" ] }, { "cell_type": "code", "execution_count": 65, "id": "766eb80f", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0 1980-07-02 20:00:00\n", "1 2001-06-15 06:00:00\n", "2 1999-04-08 17:00:00\n", "3 2005-09-10 02:00:00\n", "Name: dob, dtype: datetime64[ns]" ] }, "execution_count": 65, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.to_datetime(df.loc[:,'dob'], format = '%d-%m-%Y %I-%p')" ] }, { "cell_type": "code", "execution_count": 66, "id": "97b740a0", "metadata": {}, "outputs": [], "source": [ "df['dob'] = pd.to_datetime(df.loc[:,'dob'], format = '%d-%m-%Y %I-%p')" ] }, { "cell_type": "code", "execution_count": 67, "id": "585bdabc", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "name object\n", "dob datetime64[ns]\n", "address object\n", "gender object\n", "dtype: object" ] }, "execution_count": 67, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.dtypes" ] }, { "cell_type": "code", "execution_count": null, "id": "dcc94768", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "5474f1da", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "5e1c4bc5", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "f04dee48", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "d53767e3", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "d62068ea", "metadata": {}, "source": [ "### b. Option 2: Do the Conversion while Reading the CSV File" ] }, { "cell_type": "markdown", "id": "b115624c", "metadata": {}, "source": [ ">**One can use the `parse_dates` and `date_parser` argument to the `pd.read_csv()` method to do this conversion while reading the csv file. However, the `pd.to_datetime()` method discussed above is recommended.**" ] }, { "cell_type": "code", "execution_count": null, "id": "e8e56359", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "a8c57490", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "b73bfd5c", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "f7d2e302", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "fea9323d", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "085f8cc3", "metadata": {}, "source": [ "## 5. Practicing with UFO Dataset\n", "\n", "" ] }, { "cell_type": "markdown", "id": "97b21c71", "metadata": {}, "source": [ "### a. Understanding the Dataset" ] }, { "cell_type": "code", "execution_count": 68, "id": "5f2c69fc", "metadata": { "scrolled": true }, "outputs": [], "source": [ "import pandas as pd\n", "df = pd.read_csv(\"datasets/ufo.csv\")" ] }, { "cell_type": "code", "execution_count": 69, "id": "ecbb8eb6", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
CityColors ReportedShape ReportedStateTime
0IthacaNaNTRIANGLENY6/1/1930 22:00
1WillingboroNaNOTHERNJ6/30/1930 20:00
2HolyokeNaNOVALCO2/15/1931 14:00
3AbileneNaNDISKKS6/1/1931 13:00
4New York Worlds FairNaNLIGHTNY4/18/1933 19:00
..................
18236Grant ParkNaNTRIANGLEIL12/31/2000 23:00
18237Spirit LakeNaNDISKIA12/31/2000 23:00
18238Eagle RiverNaNNaNWI12/31/2000 23:45
18239Eagle RiverREDLIGHTWI12/31/2000 23:45
18240YborNaNOVALFL12/31/2000 23:59
\n", "

18241 rows × 5 columns

\n", "
" ], "text/plain": [ " City Colors Reported Shape Reported State \\\n", "0 Ithaca NaN TRIANGLE NY \n", "1 Willingboro NaN OTHER NJ \n", "2 Holyoke NaN OVAL CO \n", "3 Abilene NaN DISK KS \n", "4 New York Worlds Fair NaN LIGHT NY \n", "... ... ... ... ... \n", "18236 Grant Park NaN TRIANGLE IL \n", "18237 Spirit Lake NaN DISK IA \n", "18238 Eagle River NaN NaN WI \n", "18239 Eagle River RED LIGHT WI \n", "18240 Ybor NaN OVAL FL \n", "\n", " Time \n", "0 6/1/1930 22:00 \n", "1 6/30/1930 20:00 \n", "2 2/15/1931 14:00 \n", "3 6/1/1931 13:00 \n", "4 4/18/1933 19:00 \n", "... ... \n", "18236 12/31/2000 23:00 \n", "18237 12/31/2000 23:00 \n", "18238 12/31/2000 23:45 \n", "18239 12/31/2000 23:45 \n", "18240 12/31/2000 23:59 \n", "\n", "[18241 rows x 5 columns]" ] }, "execution_count": 69, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df" ] }, { "cell_type": "code", "execution_count": 70, "id": "5a3cdb51", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "City object\n", "Colors Reported object\n", "Shape Reported object\n", "State object\n", "Time object\n", "dtype: object" ] }, "execution_count": 70, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.dtypes" ] }, { "cell_type": "code", "execution_count": 71, "id": "d3b02600", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "RangeIndex: 18241 entries, 0 to 18240\n", "Data columns (total 5 columns):\n", " # Column Non-Null Count Dtype \n", "--- ------ -------------- ----- \n", " 0 City 18216 non-null object\n", " 1 Colors Reported 2882 non-null object\n", " 2 Shape Reported 15597 non-null object\n", " 3 State 18241 non-null object\n", " 4 Time 18241 non-null object\n", "dtypes: object(5)\n", "memory usage: 712.7+ KB\n" ] } ], "source": [ "df.info()" ] }, { "cell_type": "code", "execution_count": 72, "id": "f6224595", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'6/1/1930 22:00'" ] }, "execution_count": 72, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# The Time column of the dataframe contains strings\n", "df.loc[0,'Time']" ] }, { "cell_type": "code", "execution_count": null, "id": "20bedc43", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "678a7106", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "ef32cb7d", "metadata": {}, "source": [ ">Let us pass this column/series to the `pd.to_datetime()` method to convert the datatype to `datetime64`" ] }, { "cell_type": "code", "execution_count": 73, "id": "4897d804", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0 1930-06-01 22:00:00\n", "1 1930-06-30 20:00:00\n", "2 1931-02-15 14:00:00\n", "3 1931-06-01 13:00:00\n", "4 1933-04-18 19:00:00\n", " ... \n", "18236 2000-12-31 23:00:00\n", "18237 2000-12-31 23:00:00\n", "18238 2000-12-31 23:45:00\n", "18239 2000-12-31 23:45:00\n", "18240 2000-12-31 23:59:00\n", "Name: Time, Length: 18241, dtype: datetime64[ns]" ] }, "execution_count": 73, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.to_datetime(df.loc[:,'Time'])" ] }, { "cell_type": "code", "execution_count": null, "id": "0f950d96", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "1b2e0e90", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": 74, "id": "33237b4a", "metadata": {}, "outputs": [], "source": [ "df['Time'] = pd.to_datetime(df.loc[:,'Time'])" ] }, { "cell_type": "code", "execution_count": 75, "id": "6182e264", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "City object\n", "Colors Reported object\n", "Shape Reported object\n", "State object\n", "Time datetime64[ns]\n", "dtype: object" ] }, "execution_count": 75, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.dtypes" ] }, { "cell_type": "code", "execution_count": null, "id": "2a739d61", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "15cadce7", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "a180c728", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "68a438e3", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "47a167ee", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "da4053cd", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "310f2108", "metadata": {}, "source": [ "**Suppose I want to display only those UFO sightings that has been seen after 28 October 2000**" ] }, { "cell_type": "code", "execution_count": 76, "id": "81fd0bdd", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
CityColors ReportedShape ReportedStateTime
17791Lake WorthYELLOWLIGHTFL2000-10-28 00:00:00
17792SpringfieldNaNCIGARMO2000-10-28 00:00:00
17793LaurelBLUESPHEREMD2000-10-28 01:00:00
17794PortlandNaNSPHEREME2000-10-28 10:30:00
17795KintnersvilleORANGEOTHERPA2000-10-28 15:00:00
..................
18236Grant ParkNaNTRIANGLEIL2000-12-31 23:00:00
18237Spirit LakeNaNDISKIA2000-12-31 23:00:00
18238Eagle RiverNaNNaNWI2000-12-31 23:45:00
18239Eagle RiverREDLIGHTWI2000-12-31 23:45:00
18240YborNaNOVALFL2000-12-31 23:59:00
\n", "

450 rows × 5 columns

\n", "
" ], "text/plain": [ " City Colors Reported Shape Reported State Time\n", "17791 Lake Worth YELLOW LIGHT FL 2000-10-28 00:00:00\n", "17792 Springfield NaN CIGAR MO 2000-10-28 00:00:00\n", "17793 Laurel BLUE SPHERE MD 2000-10-28 01:00:00\n", "17794 Portland NaN SPHERE ME 2000-10-28 10:30:00\n", "17795 Kintnersville ORANGE OTHER PA 2000-10-28 15:00:00\n", "... ... ... ... ... ...\n", "18236 Grant Park NaN TRIANGLE IL 2000-12-31 23:00:00\n", "18237 Spirit Lake NaN DISK IA 2000-12-31 23:00:00\n", "18238 Eagle River NaN NaN WI 2000-12-31 23:45:00\n", "18239 Eagle River RED LIGHT WI 2000-12-31 23:45:00\n", "18240 Ybor NaN OVAL FL 2000-12-31 23:59:00\n", "\n", "[450 rows x 5 columns]" ] }, "execution_count": 76, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Use Boolean Indexing (Can compare a string with datetime object)\n", "df.loc[df.Time >= '2000/10/28', :]" ] }, { "cell_type": "code", "execution_count": 77, "id": "65f6b28a", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
CityColors ReportedShape ReportedStateTime
17791Lake WorthYELLOWLIGHTFL2000-10-28 00:00:00
17792SpringfieldNaNCIGARMO2000-10-28 00:00:00
17793LaurelBLUESPHEREMD2000-10-28 01:00:00
17794PortlandNaNSPHEREME2000-10-28 10:30:00
17795KintnersvilleORANGEOTHERPA2000-10-28 15:00:00
..................
18236Grant ParkNaNTRIANGLEIL2000-12-31 23:00:00
18237Spirit LakeNaNDISKIA2000-12-31 23:00:00
18238Eagle RiverNaNNaNWI2000-12-31 23:45:00
18239Eagle RiverREDLIGHTWI2000-12-31 23:45:00
18240YborNaNOVALFL2000-12-31 23:59:00
\n", "

450 rows × 5 columns

\n", "
" ], "text/plain": [ " City Colors Reported Shape Reported State Time\n", "17791 Lake Worth YELLOW LIGHT FL 2000-10-28 00:00:00\n", "17792 Springfield NaN CIGAR MO 2000-10-28 00:00:00\n", "17793 Laurel BLUE SPHERE MD 2000-10-28 01:00:00\n", "17794 Portland NaN SPHERE ME 2000-10-28 10:30:00\n", "17795 Kintnersville ORANGE OTHER PA 2000-10-28 15:00:00\n", "... ... ... ... ... ...\n", "18236 Grant Park NaN TRIANGLE IL 2000-12-31 23:00:00\n", "18237 Spirit Lake NaN DISK IA 2000-12-31 23:00:00\n", "18238 Eagle River NaN NaN WI 2000-12-31 23:45:00\n", "18239 Eagle River RED LIGHT WI 2000-12-31 23:45:00\n", "18240 Ybor NaN OVAL FL 2000-12-31 23:59:00\n", "\n", "[450 rows x 5 columns]" ] }, "execution_count": 77, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Create a datetime object to be used for comparison\n", "ts = pd.to_datetime('2000/10/28')\n", "df.loc[df.Time >= ts, :]" ] }, { "cell_type": "code", "execution_count": null, "id": "0ccd9678", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "a42f88d4", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "b5be6ce3", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "ac59fab4", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "2148d072", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "b112ce4e", "metadata": {}, "source": [ "**Suppose I want to display only those UFO sightings that has been seen between 1st March 1995 and 06 March 1995**" ] }, { "cell_type": "code", "execution_count": 78, "id": "6033cd64", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
CityColors ReportedShape ReportedStateTime
7860GreenvilleNaNLIGHTIL1995-03-01 21:00:00
7861SedaliaNaNNaNMO1995-03-01 21:00:00
7862RedmondREDNaNWA1995-03-02 22:30:00
7863Prescott ValleyNaNOVALAZ1995-03-04 00:00:00
7864FolsomNaNNaNNJ1995-03-04 16:32:00
7865AnaheimNaNOTHERCA1995-03-05 12:00:00
7866ColumbusNaNNaNOH1995-03-06 00:55:00
7867HilltopNaNNaNNJ1995-03-06 19:00:00
7868FlorenceNaNNaNOR1995-03-06 19:10:00
7869Mountain CityNaNNaNTN1995-03-06 19:45:00
7870Ft. BraggNaNNaNCA1995-03-06 22:09:00
7871BurleyNaNNaNWA1995-03-06 23:30:00
\n", "
" ], "text/plain": [ " City Colors Reported Shape Reported State Time\n", "7860 Greenville NaN LIGHT IL 1995-03-01 21:00:00\n", "7861 Sedalia NaN NaN MO 1995-03-01 21:00:00\n", "7862 Redmond RED NaN WA 1995-03-02 22:30:00\n", "7863 Prescott Valley NaN OVAL AZ 1995-03-04 00:00:00\n", "7864 Folsom NaN NaN NJ 1995-03-04 16:32:00\n", "7865 Anaheim NaN OTHER CA 1995-03-05 12:00:00\n", "7866 Columbus NaN NaN OH 1995-03-06 00:55:00\n", "7867 Hilltop NaN NaN NJ 1995-03-06 19:00:00\n", "7868 Florence NaN NaN OR 1995-03-06 19:10:00\n", "7869 Mountain City NaN NaN TN 1995-03-06 19:45:00\n", "7870 Ft. Bragg NaN NaN CA 1995-03-06 22:09:00\n", "7871 Burley NaN NaN WA 1995-03-06 23:30:00" ] }, "execution_count": 78, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Create a datetime object to be used for comparison\n", "ts1 = pd.to_datetime('1995/03/1')\n", "ts2 = pd.to_datetime('1995/03/7')\n", "df.loc[(df.Time >= ts1) & (df.Time <= ts2), :]" ] }, { "cell_type": "code", "execution_count": null, "id": "dd24025f", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "4e86c876", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "42a058b2", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "2906dc80", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "d2f850cf", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "184cb99c", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "3f0aaef6", "metadata": {}, "source": [ "**Suppose I want to display the record of the maximum date under the `Time` column**" ] }, { "cell_type": "code", "execution_count": 79, "id": "2ce38867", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Timestamp('2000-12-31 23:59:00')" ] }, "execution_count": 79, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ts = df.Time.max()\n", "ts" ] }, { "cell_type": "code", "execution_count": 80, "id": "3d435c7e", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
CityColors ReportedShape ReportedStateTime
18240YborNaNOVALFL2000-12-31 23:59:00
\n", "
" ], "text/plain": [ " City Colors Reported Shape Reported State Time\n", "18240 Ybor NaN OVAL FL 2000-12-31 23:59:00" ] }, "execution_count": 80, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.loc[df.Time == ts]" ] }, { "cell_type": "code", "execution_count": null, "id": "93421bc1", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "27092f84", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "17bd18b3", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "a9b7efcb", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "5255c7a3", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "0c2d5aa5", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "0bb33fab", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "48ffb7cc", "metadata": {}, "source": [ "**Suppose I want to display the oldest record as per the `Time` column**" ] }, { "cell_type": "code", "execution_count": 81, "id": "73cbb2fa", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Timestamp('1930-06-01 22:00:00')" ] }, "execution_count": 81, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ts = df.Time.min()\n", "ts" ] }, { "cell_type": "code", "execution_count": 82, "id": "56600dc9", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
CityColors ReportedShape ReportedStateTime
0IthacaNaNTRIANGLENY1930-06-01 22:00:00
\n", "
" ], "text/plain": [ " City Colors Reported Shape Reported State Time\n", "0 Ithaca NaN TRIANGLE NY 1930-06-01 22:00:00" ] }, "execution_count": 82, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.loc[df.Time == ts]" ] }, { "cell_type": "code", "execution_count": null, "id": "6f7a80d6", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "8662123d", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "6120814c", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "edb69f0d", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "d249c3a2", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "7ee305e2", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "8d38852a", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "20179e67", "metadata": {}, "source": [ "**Suppose I want to check out the difference between the oldest and the newest record as per the `Time` column**" ] }, { "cell_type": "code", "execution_count": 83, "id": "091952b7", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "25781 days 01:59:00\n", "\n" ] } ], "source": [ "td = df.Time.max() - df.Time.min()\n", "print(td)\n", "print(type(td))" ] }, { "cell_type": "code", "execution_count": null, "id": "da0e5155", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "294ee562", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "2c1cf28e", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "847c20bb", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "7ad6930b", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "efe70970", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "29739387", "metadata": {}, "source": [ "## 6. Practicing with Crypto-Currency Dataset\n", "\n", "" ] }, { "cell_type": "code", "execution_count": 84, "id": "731aaae1", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
DateSymbolOpenHighLowCloseVolume
02020-03-13 08-PMETHUSD129.94131.82126.87128.711940673.93
12020-03-13 07-PMETHUSD119.51132.02117.10129.947579741.09
22020-03-13 06-PMETHUSD124.47124.85115.50119.514898735.81
32020-03-13 05-PMETHUSD124.08127.42121.63124.472753450.92
42020-03-13 04-PMETHUSD124.85129.51120.17124.084461424.71
........................
236692017-07-01 03-PMETHUSD265.74272.74265.00272.571500282.55
236702017-07-01 02-PMETHUSD268.79269.90265.00265.741702536.85
236712017-07-01 01-PMETHUSD274.83274.93265.00268.793010787.99
236722017-07-01 12-PMETHUSD275.01275.01271.00274.83824362.87
236732017-07-01 11-AMETHUSD279.98279.99272.10275.01679358.87
\n", "

23674 rows × 7 columns

\n", "
" ], "text/plain": [ " Date Symbol Open High Low Close Volume\n", "0 2020-03-13 08-PM ETHUSD 129.94 131.82 126.87 128.71 1940673.93\n", "1 2020-03-13 07-PM ETHUSD 119.51 132.02 117.10 129.94 7579741.09\n", "2 2020-03-13 06-PM ETHUSD 124.47 124.85 115.50 119.51 4898735.81\n", "3 2020-03-13 05-PM ETHUSD 124.08 127.42 121.63 124.47 2753450.92\n", "4 2020-03-13 04-PM ETHUSD 124.85 129.51 120.17 124.08 4461424.71\n", "... ... ... ... ... ... ... ...\n", "23669 2017-07-01 03-PM ETHUSD 265.74 272.74 265.00 272.57 1500282.55\n", "23670 2017-07-01 02-PM ETHUSD 268.79 269.90 265.00 265.74 1702536.85\n", "23671 2017-07-01 01-PM ETHUSD 274.83 274.93 265.00 268.79 3010787.99\n", "23672 2017-07-01 12-PM ETHUSD 275.01 275.01 271.00 274.83 824362.87\n", "23673 2017-07-01 11-AM ETHUSD 279.98 279.99 272.10 275.01 679358.87\n", "\n", "[23674 rows x 7 columns]" ] }, "execution_count": 84, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import pandas as pd\n", "df = pd.read_csv(\"datasets/cryptodata.csv\")\n", "df" ] }, { "cell_type": "code", "execution_count": 85, "id": "35887ae8", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'2020-03-13 08-PM'" ] }, "execution_count": 85, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# The Date column of the dataframe contains strings\n", "df.loc[0,'Date']" ] }, { "cell_type": "code", "execution_count": 86, "id": "dc902395", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Date object\n", "Symbol object\n", "Open float64\n", "High float64\n", "Low float64\n", "Close float64\n", "Volume float64\n", "dtype: object" ] }, "execution_count": 86, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.dtypes" ] }, { "cell_type": "code", "execution_count": null, "id": "c7d0d861", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "767ccf3b", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "f86366ee", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "6d6533d3", "metadata": {}, "source": [ "### a. Convert the Datatype of Date Column to Datetime" ] }, { "cell_type": "markdown", "id": "0cd4d030", "metadata": {}, "source": [ ">Let us pass this column/series to the `pd.to_datetime()` method to convert the datatype to `datetime64`" ] }, { "cell_type": "code", "execution_count": 87, "id": "dab7b0f0", "metadata": {}, "outputs": [], "source": [ "# ParserError: Unknown string format: 2020-03-13 08-PM\n", "#pd.to_datetime(df.loc[:,'Date'])" ] }, { "cell_type": "code", "execution_count": 88, "id": "fcbdaefe", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0 2020-03-13 20:00:00\n", "1 2020-03-13 19:00:00\n", "2 2020-03-13 18:00:00\n", "3 2020-03-13 17:00:00\n", "4 2020-03-13 16:00:00\n", " ... \n", "23669 2017-07-01 15:00:00\n", "23670 2017-07-01 14:00:00\n", "23671 2017-07-01 13:00:00\n", "23672 2017-07-01 12:00:00\n", "23673 2017-07-01 11:00:00\n", "Name: Date, Length: 23674, dtype: datetime64[ns]" ] }, "execution_count": 88, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.to_datetime(df.loc[:,'Date'], format = '%Y-%m-%d %I-%p')" ] }, { "cell_type": "code", "execution_count": 89, "id": "6ce74259", "metadata": {}, "outputs": [], "source": [ "df['Date'] = pd.to_datetime(df.loc[:,'Date'], format = '%Y-%m-%d %I-%p')" ] }, { "cell_type": "code", "execution_count": 90, "id": "8718dbfc", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Date datetime64[ns]\n", "Symbol object\n", "Open float64\n", "High float64\n", "Low float64\n", "Close float64\n", "Volume float64\n", "dtype: object" ] }, "execution_count": 90, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.dtypes" ] }, { "cell_type": "code", "execution_count": 91, "id": "b8dcc21f", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "pandas._libs.tslibs.timestamps.Timestamp" ] }, "execution_count": 91, "metadata": {}, "output_type": "execute_result" } ], "source": [ "type(df['Date'][0])" ] }, { "cell_type": "code", "execution_count": null, "id": "8237ba2a", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "1cda80a6", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "8af08294", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "32dbda15", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "8508aa8c", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "ad1482a1", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "26ab381d", "metadata": {}, "source": [ "**Let us create a new column in the dataframe that shows the day of week in each row**" ] }, { "cell_type": "code", "execution_count": 92, "id": "a12a943f", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0 Friday\n", "1 Friday\n", "2 Friday\n", "3 Friday\n", "4 Friday\n", " ... \n", "23669 Saturday\n", "23670 Saturday\n", "23671 Saturday\n", "23672 Saturday\n", "23673 Saturday\n", "Name: Date, Length: 23674, dtype: object" ] }, "execution_count": 92, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df['Date'].dt.day_name()" ] }, { "cell_type": "code", "execution_count": 93, "id": "fa6c6e4e", "metadata": {}, "outputs": [], "source": [ "df['dayofweek'] = df['Date'].dt.day_name()" ] }, { "cell_type": "code", "execution_count": 94, "id": "38b86025", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
DateSymbolOpenHighLowCloseVolumedayofweek
02020-03-13 20:00:00ETHUSD129.94131.82126.87128.711940673.93Friday
12020-03-13 19:00:00ETHUSD119.51132.02117.10129.947579741.09Friday
22020-03-13 18:00:00ETHUSD124.47124.85115.50119.514898735.81Friday
32020-03-13 17:00:00ETHUSD124.08127.42121.63124.472753450.92Friday
42020-03-13 16:00:00ETHUSD124.85129.51120.17124.084461424.71Friday
...........................
236692017-07-01 15:00:00ETHUSD265.74272.74265.00272.571500282.55Saturday
236702017-07-01 14:00:00ETHUSD268.79269.90265.00265.741702536.85Saturday
236712017-07-01 13:00:00ETHUSD274.83274.93265.00268.793010787.99Saturday
236722017-07-01 12:00:00ETHUSD275.01275.01271.00274.83824362.87Saturday
236732017-07-01 11:00:00ETHUSD279.98279.99272.10275.01679358.87Saturday
\n", "

23674 rows × 8 columns

\n", "
" ], "text/plain": [ " Date Symbol Open High Low Close Volume \\\n", "0 2020-03-13 20:00:00 ETHUSD 129.94 131.82 126.87 128.71 1940673.93 \n", "1 2020-03-13 19:00:00 ETHUSD 119.51 132.02 117.10 129.94 7579741.09 \n", "2 2020-03-13 18:00:00 ETHUSD 124.47 124.85 115.50 119.51 4898735.81 \n", "3 2020-03-13 17:00:00 ETHUSD 124.08 127.42 121.63 124.47 2753450.92 \n", "4 2020-03-13 16:00:00 ETHUSD 124.85 129.51 120.17 124.08 4461424.71 \n", "... ... ... ... ... ... ... ... \n", "23669 2017-07-01 15:00:00 ETHUSD 265.74 272.74 265.00 272.57 1500282.55 \n", "23670 2017-07-01 14:00:00 ETHUSD 268.79 269.90 265.00 265.74 1702536.85 \n", "23671 2017-07-01 13:00:00 ETHUSD 274.83 274.93 265.00 268.79 3010787.99 \n", "23672 2017-07-01 12:00:00 ETHUSD 275.01 275.01 271.00 274.83 824362.87 \n", "23673 2017-07-01 11:00:00 ETHUSD 279.98 279.99 272.10 275.01 679358.87 \n", "\n", " dayofweek \n", "0 Friday \n", "1 Friday \n", "2 Friday \n", "3 Friday \n", "4 Friday \n", "... ... \n", "23669 Saturday \n", "23670 Saturday \n", "23671 Saturday \n", "23672 Saturday \n", "23673 Saturday \n", "\n", "[23674 rows x 8 columns]" ] }, "execution_count": 94, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df" ] }, { "cell_type": "code", "execution_count": null, "id": "c0e23bd3", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "58ae33bf", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "7e141fd2", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "7acd5577", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "af07cbbb", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "e8d40883", "metadata": {}, "source": [ "**Let us find the oldest and newest record in the dataframe**" ] }, { "cell_type": "code", "execution_count": 95, "id": "5ccf5dd2", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Timestamp('2017-07-01 11:00:00')" ] }, "execution_count": 95, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df['Date'].min()" ] }, { "cell_type": "code", "execution_count": 96, "id": "6963dfc6", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Timestamp('2020-03-13 20:00:00')" ] }, "execution_count": 96, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df['Date'].max()" ] }, { "cell_type": "code", "execution_count": 97, "id": "c9d27847", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Timedelta('986 days 09:00:00')" ] }, "execution_count": 97, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df['Date'].max() - df['Date'].min()" ] }, { "cell_type": "code", "execution_count": null, "id": "f11357f8", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "714d4c15", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "a7c6ce91", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "dab9176e", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "d06f814c", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "5a77c0e6", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "e98605ba", "metadata": {}, "source": [ "**Let us find the records of the January 2020 only**" ] }, { "cell_type": "code", "execution_count": 98, "id": "b88f5c82", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0 False\n", "1 False\n", "2 False\n", "3 False\n", "4 False\n", " ... \n", "23669 False\n", "23670 False\n", "23671 False\n", "23672 False\n", "23673 False\n", "Name: Date, Length: 23674, dtype: bool" ] }, "execution_count": 98, "metadata": {}, "output_type": "execute_result" } ], "source": [ "mask = (df['Date'] >= '2020-01-01') & (df['Date'] <= '2020-01-31')\n", "mask" ] }, { "cell_type": "code", "execution_count": 99, "id": "f0259322", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
DateSymbolOpenHighLowCloseVolumedayofweek
10282020-01-31 00:00:00ETHUSD184.55185.68183.48183.821107068.24Friday
10292020-01-30 23:00:00ETHUSD186.62186.89182.99184.551262371.00Thursday
10302020-01-30 22:00:00ETHUSD185.03186.63183.90186.62992325.34Thursday
10312020-01-30 21:00:00ETHUSD184.40185.03183.19185.03701167.77Thursday
10322020-01-30 20:00:00ETHUSD181.26185.14181.26184.402180199.04Thursday
...........................
17442020-01-01 04:00:00ETHUSD129.57130.00129.50129.56702786.82Wednesday
17452020-01-01 03:00:00ETHUSD130.37130.44129.38129.57496704.23Wednesday
17462020-01-01 02:00:00ETHUSD130.14130.50129.91130.37396315.72Wednesday
17472020-01-01 01:00:00ETHUSD128.34130.14128.32130.14635419.40Wednesday
17482020-01-01 00:00:00ETHUSD128.54128.54128.12128.34245119.91Wednesday
\n", "

721 rows × 8 columns

\n", "
" ], "text/plain": [ " Date Symbol Open High Low Close Volume \\\n", "1028 2020-01-31 00:00:00 ETHUSD 184.55 185.68 183.48 183.82 1107068.24 \n", "1029 2020-01-30 23:00:00 ETHUSD 186.62 186.89 182.99 184.55 1262371.00 \n", "1030 2020-01-30 22:00:00 ETHUSD 185.03 186.63 183.90 186.62 992325.34 \n", "1031 2020-01-30 21:00:00 ETHUSD 184.40 185.03 183.19 185.03 701167.77 \n", "1032 2020-01-30 20:00:00 ETHUSD 181.26 185.14 181.26 184.40 2180199.04 \n", "... ... ... ... ... ... ... ... \n", "1744 2020-01-01 04:00:00 ETHUSD 129.57 130.00 129.50 129.56 702786.82 \n", "1745 2020-01-01 03:00:00 ETHUSD 130.37 130.44 129.38 129.57 496704.23 \n", "1746 2020-01-01 02:00:00 ETHUSD 130.14 130.50 129.91 130.37 396315.72 \n", "1747 2020-01-01 01:00:00 ETHUSD 128.34 130.14 128.32 130.14 635419.40 \n", "1748 2020-01-01 00:00:00 ETHUSD 128.54 128.54 128.12 128.34 245119.91 \n", "\n", " dayofweek \n", "1028 Friday \n", "1029 Thursday \n", "1030 Thursday \n", "1031 Thursday \n", "1032 Thursday \n", "... ... \n", "1744 Wednesday \n", "1745 Wednesday \n", "1746 Wednesday \n", "1747 Wednesday \n", "1748 Wednesday \n", "\n", "[721 rows x 8 columns]" ] }, "execution_count": 99, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.loc[mask]" ] }, { "cell_type": "code", "execution_count": null, "id": "f05a2861", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "2e03ca6c", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "86933cbd", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "f21cbaf3", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "e150ba05", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "c20d1037", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "ca47752a", "metadata": {}, "source": [ "### b. Set the Column `Date` as Row Index of Dataframe\n", "- This will allow you to treat the entire dataset in the dataframe as a Time Series Data\n", " - Selecting/Indexing using strings\n", " - Slicing using `df[date1:date2]`\n", " - Use of `df.loc[date1:date2, :]`" ] }, { "cell_type": "code", "execution_count": 100, "id": "5aaad6b6", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
SymbolOpenHighLowCloseVolumedayofweek
Date
2020-03-13 20:00:00ETHUSD129.94131.82126.87128.711940673.93Friday
2020-03-13 19:00:00ETHUSD119.51132.02117.10129.947579741.09Friday
2020-03-13 18:00:00ETHUSD124.47124.85115.50119.514898735.81Friday
2020-03-13 17:00:00ETHUSD124.08127.42121.63124.472753450.92Friday
2020-03-13 16:00:00ETHUSD124.85129.51120.17124.084461424.71Friday
........................
2017-07-01 15:00:00ETHUSD265.74272.74265.00272.571500282.55Saturday
2017-07-01 14:00:00ETHUSD268.79269.90265.00265.741702536.85Saturday
2017-07-01 13:00:00ETHUSD274.83274.93265.00268.793010787.99Saturday
2017-07-01 12:00:00ETHUSD275.01275.01271.00274.83824362.87Saturday
2017-07-01 11:00:00ETHUSD279.98279.99272.10275.01679358.87Saturday
\n", "

23674 rows × 7 columns

\n", "
" ], "text/plain": [ " Symbol Open High Low Close Volume \\\n", "Date \n", "2020-03-13 20:00:00 ETHUSD 129.94 131.82 126.87 128.71 1940673.93 \n", "2020-03-13 19:00:00 ETHUSD 119.51 132.02 117.10 129.94 7579741.09 \n", "2020-03-13 18:00:00 ETHUSD 124.47 124.85 115.50 119.51 4898735.81 \n", "2020-03-13 17:00:00 ETHUSD 124.08 127.42 121.63 124.47 2753450.92 \n", "2020-03-13 16:00:00 ETHUSD 124.85 129.51 120.17 124.08 4461424.71 \n", "... ... ... ... ... ... ... \n", "2017-07-01 15:00:00 ETHUSD 265.74 272.74 265.00 272.57 1500282.55 \n", "2017-07-01 14:00:00 ETHUSD 268.79 269.90 265.00 265.74 1702536.85 \n", "2017-07-01 13:00:00 ETHUSD 274.83 274.93 265.00 268.79 3010787.99 \n", "2017-07-01 12:00:00 ETHUSD 275.01 275.01 271.00 274.83 824362.87 \n", "2017-07-01 11:00:00 ETHUSD 279.98 279.99 272.10 275.01 679358.87 \n", "\n", " dayofweek \n", "Date \n", "2020-03-13 20:00:00 Friday \n", "2020-03-13 19:00:00 Friday \n", "2020-03-13 18:00:00 Friday \n", "2020-03-13 17:00:00 Friday \n", "2020-03-13 16:00:00 Friday \n", "... ... \n", "2017-07-01 15:00:00 Saturday \n", "2017-07-01 14:00:00 Saturday \n", "2017-07-01 13:00:00 Saturday \n", "2017-07-01 12:00:00 Saturday \n", "2017-07-01 11:00:00 Saturday \n", "\n", "[23674 rows x 7 columns]" ] }, "execution_count": 100, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.set_index('Date', inplace=True)\n", "df" ] }, { "cell_type": "markdown", "id": "35509834", "metadata": {}, "source": [ ">Now, since the data of the `Date` column has become the row indices of this dataframe, therefore, we can use `.loc[]` on the dates :)\n", "- Since index is still unique so the searching will be done in O(1) time\n", "- If non-unique but sorted the searching will take O(logn) time\n", "- If non-unique and non-sorted the searching will take O(n) time" ] }, { "cell_type": "markdown", "id": "92658fc6", "metadata": {}, "source": [ "**(i) Selection:**" ] }, { "cell_type": "code", "execution_count": 101, "id": "3bb995ed", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
SymbolOpenHighLowCloseVolumedayofweek
Date
2019-07-01 23:00:00ETHUSD289.24295.93289.24293.702083299.02Monday
2019-07-01 22:00:00ETHUSD291.17291.31288.10289.241865830.49Monday
2019-07-01 21:00:00ETHUSD288.82292.61288.82291.171731914.78Monday
2019-07-01 20:00:00ETHUSD281.38290.94281.38288.823483143.68Monday
2019-07-01 19:00:00ETHUSD284.73284.97278.75281.383420031.90Monday
2019-07-01 18:00:00ETHUSD282.89285.76281.50284.731841330.22Monday
2019-07-01 17:00:00ETHUSD283.39285.39280.51282.892346140.58Monday
2019-07-01 16:00:00ETHUSD284.49287.48282.01283.393244834.65Monday
2019-07-01 15:00:00ETHUSD280.76286.74278.65284.496552331.53Monday
2019-07-01 14:00:00ETHUSD285.50289.37280.15280.763386287.24Monday
2019-07-01 13:00:00ETHUSD288.79289.98285.50285.502447312.95Monday
2019-07-01 12:00:00ETHUSD294.27295.62284.16288.792967508.75Monday
2019-07-01 11:00:00ETHUSD294.18294.83292.23294.27697966.32Monday
2019-07-01 10:00:00ETHUSD296.52297.50292.07294.181267176.41Monday
2019-07-01 09:00:00ETHUSD298.10298.24296.01296.52499072.13Monday
2019-07-01 08:00:00ETHUSD293.05298.10292.92298.101192722.45Monday
2019-07-01 07:00:00ETHUSD292.90296.01290.48293.051483583.90Monday
2019-07-01 06:00:00ETHUSD294.56295.92291.73292.901068694.39Monday
2019-07-01 05:00:00ETHUSD297.97298.24293.95294.561277630.93Monday
2019-07-01 04:00:00ETHUSD298.15299.80295.57297.971036527.82Monday
2019-07-01 03:00:00ETHUSD296.99301.32295.81298.151465814.16Monday
2019-07-01 02:00:00ETHUSD293.93298.58292.15296.991367256.41Monday
2019-07-01 01:00:00ETHUSD295.11298.70293.53293.932293925.50Monday
2019-07-01 00:00:00ETHUSD290.07295.25286.69295.114209855.92Monday
\n", "
" ], "text/plain": [ " Symbol Open High Low Close Volume \\\n", "Date \n", "2019-07-01 23:00:00 ETHUSD 289.24 295.93 289.24 293.70 2083299.02 \n", "2019-07-01 22:00:00 ETHUSD 291.17 291.31 288.10 289.24 1865830.49 \n", "2019-07-01 21:00:00 ETHUSD 288.82 292.61 288.82 291.17 1731914.78 \n", "2019-07-01 20:00:00 ETHUSD 281.38 290.94 281.38 288.82 3483143.68 \n", "2019-07-01 19:00:00 ETHUSD 284.73 284.97 278.75 281.38 3420031.90 \n", "2019-07-01 18:00:00 ETHUSD 282.89 285.76 281.50 284.73 1841330.22 \n", "2019-07-01 17:00:00 ETHUSD 283.39 285.39 280.51 282.89 2346140.58 \n", "2019-07-01 16:00:00 ETHUSD 284.49 287.48 282.01 283.39 3244834.65 \n", "2019-07-01 15:00:00 ETHUSD 280.76 286.74 278.65 284.49 6552331.53 \n", "2019-07-01 14:00:00 ETHUSD 285.50 289.37 280.15 280.76 3386287.24 \n", "2019-07-01 13:00:00 ETHUSD 288.79 289.98 285.50 285.50 2447312.95 \n", "2019-07-01 12:00:00 ETHUSD 294.27 295.62 284.16 288.79 2967508.75 \n", "2019-07-01 11:00:00 ETHUSD 294.18 294.83 292.23 294.27 697966.32 \n", "2019-07-01 10:00:00 ETHUSD 296.52 297.50 292.07 294.18 1267176.41 \n", "2019-07-01 09:00:00 ETHUSD 298.10 298.24 296.01 296.52 499072.13 \n", "2019-07-01 08:00:00 ETHUSD 293.05 298.10 292.92 298.10 1192722.45 \n", "2019-07-01 07:00:00 ETHUSD 292.90 296.01 290.48 293.05 1483583.90 \n", "2019-07-01 06:00:00 ETHUSD 294.56 295.92 291.73 292.90 1068694.39 \n", "2019-07-01 05:00:00 ETHUSD 297.97 298.24 293.95 294.56 1277630.93 \n", "2019-07-01 04:00:00 ETHUSD 298.15 299.80 295.57 297.97 1036527.82 \n", "2019-07-01 03:00:00 ETHUSD 296.99 301.32 295.81 298.15 1465814.16 \n", "2019-07-01 02:00:00 ETHUSD 293.93 298.58 292.15 296.99 1367256.41 \n", "2019-07-01 01:00:00 ETHUSD 295.11 298.70 293.53 293.93 2293925.50 \n", "2019-07-01 00:00:00 ETHUSD 290.07 295.25 286.69 295.11 4209855.92 \n", "\n", " dayofweek \n", "Date \n", "2019-07-01 23:00:00 Monday \n", "2019-07-01 22:00:00 Monday \n", "2019-07-01 21:00:00 Monday \n", "2019-07-01 20:00:00 Monday \n", "2019-07-01 19:00:00 Monday \n", "2019-07-01 18:00:00 Monday \n", "2019-07-01 17:00:00 Monday \n", "2019-07-01 16:00:00 Monday \n", "2019-07-01 15:00:00 Monday \n", "2019-07-01 14:00:00 Monday \n", "2019-07-01 13:00:00 Monday \n", "2019-07-01 12:00:00 Monday \n", "2019-07-01 11:00:00 Monday \n", "2019-07-01 10:00:00 Monday \n", "2019-07-01 09:00:00 Monday \n", "2019-07-01 08:00:00 Monday \n", "2019-07-01 07:00:00 Monday \n", "2019-07-01 06:00:00 Monday \n", "2019-07-01 05:00:00 Monday \n", "2019-07-01 04:00:00 Monday \n", "2019-07-01 03:00:00 Monday \n", "2019-07-01 02:00:00 Monday \n", "2019-07-01 01:00:00 Monday \n", "2019-07-01 00:00:00 Monday " ] }, "execution_count": 101, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# retrieve data of july 2019\n", "df.loc[\"2019-07-01\"]" ] }, { "cell_type": "code", "execution_count": 102, "id": "2c9be5ff", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Date\n", "2019-07-31 23:00:00 1066895.02\n", "2019-07-31 22:00:00 328984.44\n", "2019-07-31 21:00:00 492811.09\n", "2019-07-31 20:00:00 391730.91\n", "2019-07-31 19:00:00 417465.58\n", " ... \n", "2019-07-01 04:00:00 1036527.82\n", "2019-07-01 03:00:00 1465814.16\n", "2019-07-01 02:00:00 1367256.41\n", "2019-07-01 01:00:00 2293925.50\n", "2019-07-01 00:00:00 4209855.92\n", "Name: Volume, Length: 744, dtype: float64" ] }, "execution_count": 102, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# getting Volume of July 2019\n", "df.loc[\"2019-07\"].Volume" ] }, { "cell_type": "code", "execution_count": 103, "id": "eb1c8412", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1482188.5834811835" ] }, "execution_count": 103, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Volumn average in July 2021\n", "df.loc[\"2019-07\"].Volume.mean()" ] }, { "cell_type": "code", "execution_count": null, "id": "a234fc32", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "a642e1c4", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "b6087bfa", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "6108648f", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "54ce57f1", "metadata": {}, "source": [ "**(ii) Slicing:**" ] }, { "cell_type": "code", "execution_count": 104, "id": "804a93a9", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
SymbolOpenHighLowCloseVolumedayofweek
Date
2020-02-29 23:00:00ETHUSD223.35223.58216.83217.311927939.88Saturday
2020-02-29 22:00:00ETHUSD223.48223.59222.14223.35535998.57Saturday
2020-02-29 21:00:00ETHUSD224.63225.14222.74223.48561158.03Saturday
2020-02-29 20:00:00ETHUSD225.31225.33223.50224.63511648.65Saturday
2020-02-29 19:00:00ETHUSD225.09225.85223.87225.311250856.20Saturday
........................
2020-01-01 04:00:00ETHUSD129.57130.00129.50129.56702786.82Wednesday
2020-01-01 03:00:00ETHUSD130.37130.44129.38129.57496704.23Wednesday
2020-01-01 02:00:00ETHUSD130.14130.50129.91130.37396315.72Wednesday
2020-01-01 01:00:00ETHUSD128.34130.14128.32130.14635419.40Wednesday
2020-01-01 00:00:00ETHUSD128.54128.54128.12128.34245119.91Wednesday
\n", "

1440 rows × 7 columns

\n", "
" ], "text/plain": [ " Symbol Open High Low Close Volume \\\n", "Date \n", "2020-02-29 23:00:00 ETHUSD 223.35 223.58 216.83 217.31 1927939.88 \n", "2020-02-29 22:00:00 ETHUSD 223.48 223.59 222.14 223.35 535998.57 \n", "2020-02-29 21:00:00 ETHUSD 224.63 225.14 222.74 223.48 561158.03 \n", "2020-02-29 20:00:00 ETHUSD 225.31 225.33 223.50 224.63 511648.65 \n", "2020-02-29 19:00:00 ETHUSD 225.09 225.85 223.87 225.31 1250856.20 \n", "... ... ... ... ... ... ... \n", "2020-01-01 04:00:00 ETHUSD 129.57 130.00 129.50 129.56 702786.82 \n", "2020-01-01 03:00:00 ETHUSD 130.37 130.44 129.38 129.57 496704.23 \n", "2020-01-01 02:00:00 ETHUSD 130.14 130.50 129.91 130.37 396315.72 \n", "2020-01-01 01:00:00 ETHUSD 128.34 130.14 128.32 130.14 635419.40 \n", "2020-01-01 00:00:00 ETHUSD 128.54 128.54 128.12 128.34 245119.91 \n", "\n", " dayofweek \n", "Date \n", "2020-02-29 23:00:00 Saturday \n", "2020-02-29 22:00:00 Saturday \n", "2020-02-29 21:00:00 Saturday \n", "2020-02-29 20:00:00 Saturday \n", "2020-02-29 19:00:00 Saturday \n", "... ... \n", "2020-01-01 04:00:00 Wednesday \n", "2020-01-01 03:00:00 Wednesday \n", "2020-01-01 02:00:00 Wednesday \n", "2020-01-01 01:00:00 Wednesday \n", "2020-01-01 00:00:00 Wednesday \n", "\n", "[1440 rows x 7 columns]" ] }, "execution_count": 104, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Slice data of January and February 2020\n", "df.loc['2020-01':'2020-02', :]" ] }, { "cell_type": "code", "execution_count": 105, "id": "676294e6", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Date\n", "2020-02-29 23:00:00 217.31\n", "2020-02-29 22:00:00 223.35\n", "2020-02-29 21:00:00 223.48\n", "2020-02-29 20:00:00 224.63\n", "2020-02-29 19:00:00 225.31\n", " ... \n", "2020-01-01 04:00:00 129.56\n", "2020-01-01 03:00:00 129.57\n", "2020-01-01 02:00:00 130.37\n", "2020-01-01 01:00:00 130.14\n", "2020-01-01 00:00:00 128.34\n", "Name: Close, Length: 1440, dtype: float64" ] }, "execution_count": 105, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Get only the Close column showing closing of January and February 2020\n", "df.loc['2020-01':'2020-02', 'Close']" ] }, { "cell_type": "code", "execution_count": 106, "id": "b4024017", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "195.16559027777814" ] }, "execution_count": 106, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Compute the mean\n", "df.loc['2020-01':'2020-02', 'Close'].mean()" ] }, { "cell_type": "code", "execution_count": null, "id": "85b8e352", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "13befab5", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "36f29e36", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "ba24d532", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "4382d2b8", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "fb4a77e9", "metadata": {}, "source": [ "### c. Resampling using `df.resample()` Method\n", "- The `df.resample()` is a convenience method for frequency conversion and resampling of time series data. \n", "- The dataframe on which you call the `resample()` method must have a datetime-like index" ] }, { "cell_type": "code", "execution_count": 107, "id": "1062d11d", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
SymbolOpenHighLowCloseVolumedayofweek
Date
2020-03-13 20:00:00ETHUSD129.94131.82126.87128.711940673.93Friday
2020-03-13 19:00:00ETHUSD119.51132.02117.10129.947579741.09Friday
2020-03-13 18:00:00ETHUSD124.47124.85115.50119.514898735.81Friday
2020-03-13 17:00:00ETHUSD124.08127.42121.63124.472753450.92Friday
2020-03-13 16:00:00ETHUSD124.85129.51120.17124.084461424.71Friday
........................
2017-07-01 15:00:00ETHUSD265.74272.74265.00272.571500282.55Saturday
2017-07-01 14:00:00ETHUSD268.79269.90265.00265.741702536.85Saturday
2017-07-01 13:00:00ETHUSD274.83274.93265.00268.793010787.99Saturday
2017-07-01 12:00:00ETHUSD275.01275.01271.00274.83824362.87Saturday
2017-07-01 11:00:00ETHUSD279.98279.99272.10275.01679358.87Saturday
\n", "

23674 rows × 7 columns

\n", "
" ], "text/plain": [ " Symbol Open High Low Close Volume \\\n", "Date \n", "2020-03-13 20:00:00 ETHUSD 129.94 131.82 126.87 128.71 1940673.93 \n", "2020-03-13 19:00:00 ETHUSD 119.51 132.02 117.10 129.94 7579741.09 \n", "2020-03-13 18:00:00 ETHUSD 124.47 124.85 115.50 119.51 4898735.81 \n", "2020-03-13 17:00:00 ETHUSD 124.08 127.42 121.63 124.47 2753450.92 \n", "2020-03-13 16:00:00 ETHUSD 124.85 129.51 120.17 124.08 4461424.71 \n", "... ... ... ... ... ... ... \n", "2017-07-01 15:00:00 ETHUSD 265.74 272.74 265.00 272.57 1500282.55 \n", "2017-07-01 14:00:00 ETHUSD 268.79 269.90 265.00 265.74 1702536.85 \n", "2017-07-01 13:00:00 ETHUSD 274.83 274.93 265.00 268.79 3010787.99 \n", "2017-07-01 12:00:00 ETHUSD 275.01 275.01 271.00 274.83 824362.87 \n", "2017-07-01 11:00:00 ETHUSD 279.98 279.99 272.10 275.01 679358.87 \n", "\n", " dayofweek \n", "Date \n", "2020-03-13 20:00:00 Friday \n", "2020-03-13 19:00:00 Friday \n", "2020-03-13 18:00:00 Friday \n", "2020-03-13 17:00:00 Friday \n", "2020-03-13 16:00:00 Friday \n", "... ... \n", "2017-07-01 15:00:00 Saturday \n", "2017-07-01 14:00:00 Saturday \n", "2017-07-01 13:00:00 Saturday \n", "2017-07-01 12:00:00 Saturday \n", "2017-07-01 11:00:00 Saturday \n", "\n", "[23674 rows x 7 columns]" ] }, "execution_count": 107, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df" ] }, { "cell_type": "markdown", "id": "b2dcd45f", "metadata": {}, "source": [ ">The given dataframe is showing data on hourly basis. Suppose for analysis purpose I need daily, or weekly, monthly, or yearly data as I am no longer interested in hourly stock prices. So we need to resample our data\n", ">- Down Sampling\n", ">- Up Sampling" ] }, { "cell_type": "code", "execution_count": 108, "id": "aeee3141", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Date\n", "2020-03-13 20:00:00 128.71\n", "2020-03-13 19:00:00 129.94\n", "2020-03-13 18:00:00 119.51\n", "2020-03-13 17:00:00 124.47\n", "2020-03-13 16:00:00 124.08\n", " ... \n", "2017-07-01 15:00:00 272.57\n", "2017-07-01 14:00:00 265.74\n", "2017-07-01 13:00:00 268.79\n", "2017-07-01 12:00:00 274.83\n", "2017-07-01 11:00:00 275.01\n", "Name: Close, Length: 23674, dtype: float64" ] }, "execution_count": 108, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# get the time series of Close column\n", "df.loc[:, 'Close']" ] }, { "cell_type": "code", "execution_count": 109, "id": "0fe5bc83", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Date\n", "2017-07-01 265.284615\n", "2017-07-02 269.782500\n", "2017-07-03 278.882083\n", "2017-07-04 276.743333\n", "2017-07-05 265.025833\n", " ... \n", "2020-03-09 200.818333\n", "2020-03-10 201.577500\n", "2020-03-11 195.910417\n", "2020-03-12 152.763333\n", "2020-03-13 124.060476\n", "Freq: D, Name: Close, Length: 987, dtype: float64" ] }, "execution_count": 109, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# To get the maximum closing value on daily basis, we resample on Daily basis\n", "df.loc[:, 'Close'].resample('D').mean()" ] }, { "cell_type": "code", "execution_count": 110, "id": "9e9002e0", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Date\n", "2017-07-31 292.54\n", "2017-08-31 389.78\n", "2017-09-30 395.54\n", "2017-10-31 348.45\n", "2017-11-30 508.82\n", "2017-12-31 858.90\n", "2018-01-31 1418.61\n", "2018-02-28 1138.68\n", "2018-03-31 875.99\n", "2018-04-30 709.00\n", "2018-05-31 828.00\n", "2018-06-30 623.89\n", "2018-07-31 508.23\n", "2018-08-31 431.84\n", "2018-09-30 301.51\n", "2018-10-31 233.20\n", "2018-11-30 220.36\n", "2018-12-31 156.07\n", "2019-01-31 159.43\n", "2019-02-28 164.08\n", "2019-03-31 144.99\n", "2019-04-30 185.32\n", "2019-05-31 287.08\n", "2019-06-30 355.31\n", "2019-07-31 317.14\n", "2019-08-31 235.50\n", "2019-09-30 221.90\n", "2019-10-31 196.07\n", "2019-11-30 193.66\n", "2019-12-31 151.55\n", "2020-01-31 186.62\n", "2020-02-29 286.39\n", "2020-03-31 247.62\n", "Freq: M, Name: Close, dtype: float64" ] }, "execution_count": 110, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# To get the maximum closing value on monthly basis, we resample on monthly basis\n", "df.loc[:, 'Close'].resample('M').max()" ] }, { "cell_type": "code", "execution_count": 111, "id": "a3c9f05e", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Date\n", "2017-12-31 858.90\n", "2018-12-31 1418.61\n", "2019-12-31 355.31\n", "2020-12-31 286.39\n", "Freq: A-DEC, Name: Close, dtype: float64" ] }, "execution_count": 111, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# To get the maximum closing value on yearly basis, we resample on yearly basis\n", "df.loc[:, 'Close'].resample('Y').max()" ] }, { "cell_type": "markdown", "id": "fb826f3e", "metadata": {}, "source": [ ">In a similary fashion, we can apply any aggregate function on any of the columns of our time series data" ] }, { "cell_type": "code", "execution_count": 112, "id": "52e66d0a", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 112, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "%matplotlib inline\n", "df.loc[:, 'Close'].resample('M').max().plot()" ] }, { "cell_type": "code", "execution_count": 113, "id": "15f47d53", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 113, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "%matplotlib inline\n", "df.loc[:, 'Close'].resample('M').max().plot(kind='bar')" ] }, { "cell_type": "code", "execution_count": 114, "id": "d371bff9", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 114, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "%matplotlib inline\n", "df.loc[:, 'Close'].plot()" ] }, { "cell_type": "code", "execution_count": null, "id": "96931b7b", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "4f885c0c", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "397189a4", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "9382b4ed", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "48028673", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "4b5d3892", "metadata": {}, "source": [ "# Bonus:" ] }, { "cell_type": "markdown", "id": "ae8d0827", "metadata": {}, "source": [ "## A. Creating a DatetimeIndex\n", "- The `pd.date_range()` method returns a range of equally spaced time points as a DatetimeIndex, which is an immutable container for datetimes.\n", "\n", "```\n", "pd.date_range(start=None, end=None, periods=None, freq=None)\n", "```\n", "\n", "- Where,\n", " - `start` is the left bound (str or datetime)\n", " - `end` is the right bound (str or datetime)\n", " - `periods` is the number of periods to generate\n", " - `freq` can be `s`, `min`, `h`, `d`, `m`, `q`, `y` for seconds, minutes, ....\n", "\n", "\n", "- Out of the four parameters: start, end, periods, and freq, exactly three must be specified" ] }, { "cell_type": "code", "execution_count": 116, "id": "58429ef0", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "DatetimeIndex(['2022-01-01 00:00:00', '2022-01-01 01:00:00',\n", " '2022-01-01 02:00:00', '2022-01-01 03:00:00',\n", " '2022-01-01 04:00:00', '2022-01-01 05:00:00',\n", " '2022-01-01 06:00:00', '2022-01-01 07:00:00',\n", " '2022-01-01 08:00:00', '2022-01-01 09:00:00'],\n", " dtype='datetime64[ns]', freq='H')" ] }, "execution_count": 116, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dti = pd.date_range(start='2022/1/1', periods=10, freq='h')\n", "dti" ] }, { "cell_type": "code", "execution_count": null, "id": "487b7239", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": 117, "id": "fca10f33", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "DatetimeIndex(['2022-01-01', '2022-01-02', '2022-01-03', '2022-01-04',\n", " '2022-01-05', '2022-01-06', '2022-01-07', '2022-01-08',\n", " '2022-01-09', '2022-01-10', '2022-01-11', '2022-01-12',\n", " '2022-01-13', '2022-01-14', '2022-01-15', '2022-01-16',\n", " '2022-01-17', '2022-01-18', '2022-01-19', '2022-01-20',\n", " '2022-01-21', '2022-01-22', '2022-01-23', '2022-01-24',\n", " '2022-01-25', '2022-01-26', '2022-01-27', '2022-01-28',\n", " '2022-01-29', '2022-01-30', '2022-01-31'],\n", " dtype='datetime64[ns]', freq='D')" ] }, "execution_count": 117, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dti = pd.date_range(start='2022/1/1', end='2022/1/31', freq='d')\n", "dti" ] }, { "cell_type": "code", "execution_count": null, "id": "acbe75f3", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": 118, "id": "bd54b906", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "DatetimeIndex(['2022-01-03', '2022-01-04', '2022-01-05', '2022-01-06',\n", " '2022-01-07', '2022-01-10', '2022-01-11', '2022-01-12',\n", " '2022-01-13', '2022-01-14', '2022-01-17', '2022-01-18',\n", " '2022-01-19', '2022-01-20', '2022-01-21', '2022-01-24',\n", " '2022-01-25', '2022-01-26', '2022-01-27', '2022-01-28',\n", " '2022-01-31'],\n", " dtype='datetime64[ns]', freq='B')" ] }, "execution_count": 118, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# here freq=B mean include the business days and exclude the weekends\n", "dti = pd.date_range(start='2022/1/1', end='2022/1/31', freq='B')\n", "dti" ] }, { "cell_type": "code", "execution_count": null, "id": "db20feef", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": 119, "id": "f59ac394", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "pandas.core.indexes.datetimes.DatetimeIndex" ] }, "execution_count": 119, "metadata": {}, "output_type": "execute_result" } ], "source": [ "type(dti)" ] }, { "cell_type": "code", "execution_count": null, "id": "8f876fbd", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "be0f1619", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": 120, "id": "f8d489eb", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0 2022-01-01\n", "1 2022-01-02\n", "2 2022-01-03\n", "3 2022-01-04\n", "4 2022-01-05\n", "5 2022-01-06\n", "6 2022-01-07\n", "7 2022-01-08\n", "8 2022-01-09\n", "9 2022-01-10\n", "dtype: datetime64[ns]" ] }, "execution_count": 120, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s = pd.Series(pd.date_range(\"2022-01-01\", periods=10, freq=\"d\"))\n", "s" ] }, { "cell_type": "code", "execution_count": null, "id": "6639556d", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": 121, "id": "61c272b0", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0 Saturday\n", "1 Sunday\n", "2 Monday\n", "3 Tuesday\n", "4 Wednesday\n", "5 Thursday\n", "6 Friday\n", "7 Saturday\n", "8 Sunday\n", "9 Monday\n", "dtype: object" ] }, "execution_count": 121, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s.dt.day_name()" ] }, { "cell_type": "code", "execution_count": 122, "id": "1d424b85", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "pandas._libs.tslibs.timestamps.Timestamp" ] }, "execution_count": 122, "metadata": {}, "output_type": "execute_result" } ], "source": [ "type(s[0])" ] }, { "cell_type": "code", "execution_count": null, "id": "80fc43bd", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "098fef2c", "metadata": {}, "source": [ "### b. A sample dataset w/o Datetime" ] }, { "cell_type": "code", "execution_count": 123, "id": "868675e9", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
daytemperaturehumidity
0Monday3070
1Tuesday3465
2Wednesday2868
3Thursday3572
4Friday3269
5Monday3771
6Tuesday2670
7Monday3366
8Tuesday2876
9Wednesday2954
10Monday4577
11Tuesday4054
12Wednesday3467
13Thursday3279
14Friday3180
15Thursday2678
16Friday2854
17Monday2152
18Tuesday2264
19Wednesday2161
\n", "
" ], "text/plain": [ " day temperature humidity\n", "0 Monday 30 70\n", "1 Tuesday 34 65\n", "2 Wednesday 28 68\n", "3 Thursday 35 72\n", "4 Friday 32 69\n", "5 Monday 37 71\n", "6 Tuesday 26 70\n", "7 Monday 33 66\n", "8 Tuesday 28 76\n", "9 Wednesday 29 54\n", "10 Monday 45 77\n", "11 Tuesday 40 54\n", "12 Wednesday 34 67\n", "13 Thursday 32 79\n", "14 Friday 31 80\n", "15 Thursday 26 78\n", "16 Friday 28 54\n", "17 Monday 21 52\n", "18 Tuesday 22 64\n", "19 Wednesday 21 61" ] }, "execution_count": 123, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import pandas as pd\n", "\n", "# this dataframe has no datecolumn\n", "df = pd.read_csv(\"datasets/no_date.csv\")\n", "df" ] }, { "cell_type": "code", "execution_count": 124, "id": "09213e6d", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(20, 3)" ] }, "execution_count": 124, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.shape" ] }, { "cell_type": "code", "execution_count": null, "id": "790b8b58", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "c79f1ae9", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "49af4d9f", "metadata": {}, "source": [ "### c. Create a DateTime Object and Set it as Index to make the above dataset a TimeSeries Data" ] }, { "cell_type": "code", "execution_count": 125, "id": "6c3c28c0", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "DatetimeIndex(['2022-01-01', '2022-01-02', '2022-01-03', '2022-01-04',\n", " '2022-01-05', '2022-01-06', '2022-01-07', '2022-01-08',\n", " '2022-01-09', '2022-01-10', '2022-01-11', '2022-01-12',\n", " '2022-01-13', '2022-01-14', '2022-01-15', '2022-01-16',\n", " '2022-01-17', '2022-01-18', '2022-01-19', '2022-01-20'],\n", " dtype='datetime64[ns]', freq='D')" ] }, "execution_count": 125, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dti = pd.date_range(start='2022/1/1', end='2022/1/20', freq='d')\n", "dti" ] }, { "cell_type": "code", "execution_count": 126, "id": "3d8877ce", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
daytemperaturehumidity
2022-01-01Monday3070
2022-01-02Tuesday3465
2022-01-03Wednesday2868
2022-01-04Thursday3572
2022-01-05Friday3269
2022-01-06Monday3771
2022-01-07Tuesday2670
2022-01-08Monday3366
2022-01-09Tuesday2876
2022-01-10Wednesday2954
2022-01-11Monday4577
2022-01-12Tuesday4054
2022-01-13Wednesday3467
2022-01-14Thursday3279
2022-01-15Friday3180
2022-01-16Thursday2678
2022-01-17Friday2854
2022-01-18Monday2152
2022-01-19Tuesday2264
2022-01-20Wednesday2161
\n", "
" ], "text/plain": [ " day temperature humidity\n", "2022-01-01 Monday 30 70\n", "2022-01-02 Tuesday 34 65\n", "2022-01-03 Wednesday 28 68\n", "2022-01-04 Thursday 35 72\n", "2022-01-05 Friday 32 69\n", "2022-01-06 Monday 37 71\n", "2022-01-07 Tuesday 26 70\n", "2022-01-08 Monday 33 66\n", "2022-01-09 Tuesday 28 76\n", "2022-01-10 Wednesday 29 54\n", "2022-01-11 Monday 45 77\n", "2022-01-12 Tuesday 40 54\n", "2022-01-13 Wednesday 34 67\n", "2022-01-14 Thursday 32 79\n", "2022-01-15 Friday 31 80\n", "2022-01-16 Thursday 26 78\n", "2022-01-17 Friday 28 54\n", "2022-01-18 Monday 21 52\n", "2022-01-19 Tuesday 22 64\n", "2022-01-20 Wednesday 21 61" ] }, "execution_count": 126, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# use the set_index function, and make the above created date ranges, index of your dataframe\n", "df.set_index(dti, inplace=True)\n", "df" ] }, { "cell_type": "markdown", "id": "122180a7", "metadata": {}, "source": [ "Does the day column match with the dates? Can you think of a way to reset the day column as per the dates?" ] }, { "cell_type": "code", "execution_count": 127, "id": "f19e5dd6", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
daytemperaturehumiditycorrect day
2022-01-01Monday3070Saturday
2022-01-02Tuesday3465Sunday
2022-01-03Wednesday2868Monday
2022-01-04Thursday3572Tuesday
2022-01-05Friday3269Wednesday
2022-01-06Monday3771Thursday
2022-01-07Tuesday2670Friday
2022-01-08Monday3366Saturday
2022-01-09Tuesday2876Sunday
2022-01-10Wednesday2954Monday
2022-01-11Monday4577Tuesday
2022-01-12Tuesday4054Wednesday
2022-01-13Wednesday3467Thursday
2022-01-14Thursday3279Friday
2022-01-15Friday3180Saturday
2022-01-16Thursday2678Sunday
2022-01-17Friday2854Monday
2022-01-18Monday2152Tuesday
2022-01-19Tuesday2264Wednesday
2022-01-20Wednesday2161Thursday
\n", "
" ], "text/plain": [ " day temperature humidity correct day\n", "2022-01-01 Monday 30 70 Saturday\n", "2022-01-02 Tuesday 34 65 Sunday\n", "2022-01-03 Wednesday 28 68 Monday\n", "2022-01-04 Thursday 35 72 Tuesday\n", "2022-01-05 Friday 32 69 Wednesday\n", "2022-01-06 Monday 37 71 Thursday\n", "2022-01-07 Tuesday 26 70 Friday\n", "2022-01-08 Monday 33 66 Saturday\n", "2022-01-09 Tuesday 28 76 Sunday\n", "2022-01-10 Wednesday 29 54 Monday\n", "2022-01-11 Monday 45 77 Tuesday\n", "2022-01-12 Tuesday 40 54 Wednesday\n", "2022-01-13 Wednesday 34 67 Thursday\n", "2022-01-14 Thursday 32 79 Friday\n", "2022-01-15 Friday 31 80 Saturday\n", "2022-01-16 Thursday 26 78 Sunday\n", "2022-01-17 Friday 28 54 Monday\n", "2022-01-18 Monday 21 52 Tuesday\n", "2022-01-19 Tuesday 22 64 Wednesday\n", "2022-01-20 Wednesday 21 61 Thursday" ] }, "execution_count": 127, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df['correct day'] = list(pd.Series(dti.day_name()))\n", "df" ] }, { "cell_type": "markdown", "id": "3d7aaead", "metadata": {}, "source": [ ">**Students are advised to explore the Pandas `Period` and `PeriodIndex` data structures at their own**" ] }, { "cell_type": "code", "execution_count": null, "id": "25d43d56", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "28297217", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "875fae35", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "53a87336", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "e0ea7da9", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "394e0030", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "3b9e5334", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "a3868ad7", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "5f734b79", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "83b6a27b", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "c937d4b7", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "4861c314", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "c034d323", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "d6c44a4a", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "670674ba", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "609d3be1", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "2dbc0c04", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "538507c9", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "4e9d1027", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "23f65db7", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "a2eae784", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "4eea3971", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "e033ce65", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "d1d5dfce", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "948f2367", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "6c3de44f", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "52adb6ab", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "2272d230", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "0e5ec6a3", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "8cc136c4", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "c3733bd4", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "0ed5ddf7", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "f9b11122", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "2694814e", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "39060aab", "metadata": {}, "source": [ "## B. Creating a Period and Periodindex" ] }, { "cell_type": "markdown", "id": "9452a840", "metadata": {}, "source": [ "### a. Have an Insight about Period" ] }, { "cell_type": "code", "execution_count": null, "id": "cc6be8b3", "metadata": {}, "outputs": [], "source": [ "import pandas as pd\n", "\n", "# let us passed as argument to the Pandas Period function and notice the output\n", "# A-DEC shows that 2021 is an annual period and end at December\n", "y = pd.Period('2021')\n", "y" ] }, { "cell_type": "code", "execution_count": null, "id": "552fb833", "metadata": {}, "outputs": [], "source": [ "# you can check different attributes related to this period\n", "# for instance check the start time, which is 1st january\n", "y.start_time" ] }, { "cell_type": "code", "execution_count": null, "id": "d578ce09", "metadata": {}, "outputs": [], "source": [ "# check the end time which is obviously 31st december\n", "y.end_time" ] }, { "cell_type": "code", "execution_count": null, "id": "e031d495", "metadata": {}, "outputs": [], "source": [ "# check whether it is leap year\n", "y.is_leap_year" ] }, { "cell_type": "code", "execution_count": null, "id": "66060548", "metadata": {}, "outputs": [], "source": [ "# you can also create a monthly period and check its start and end time\n", "m = pd.Period('2021-8')\n", "print(\"period: \", m)\n", "\n", "print(\"start time: \",m.start_time)\n", "print(\"end time: \",m.end_time)\n", "\n", "# performing arithmatic operation\n", "print(\"Next monthly period will be: \",m+1)\n" ] }, { "cell_type": "code", "execution_count": null, "id": "83ee8c66", "metadata": {}, "outputs": [], "source": [ "# you can compute the daily and hourly period as well\n", "import pandas as pd\n", "d= pd.Period('2016-02-28', freq='D')\n", "print(d)\n", "\n", "print(d.start_time)\n", "\n", "print(d.end_time)\n", "print(d+1)" ] }, { "cell_type": "code", "execution_count": null, "id": "1c5c454f", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "20b28aa7", "metadata": {}, "source": [ "### b. Have an Insight about Period Index\n", "The above discuused periods can also be used as index in a DataFrame" ] }, { "cell_type": "code", "execution_count": null, "id": "f340bab5", "metadata": {}, "outputs": [], "source": [ "# create a quarterly period b/w 2011 to 2017\n", "idx = pd.period_range('2011', '2017', freq='q')\n", "idx" ] }, { "cell_type": "code", "execution_count": null, "id": "02866b61", "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "\n", "# set this period as index of random series\n", "ps = pd.Series(np.random.randint(10,100,len(idx)), idx)\n", "ps" ] }, { "cell_type": "code", "execution_count": null, "id": "c544298b", "metadata": {}, "outputs": [], "source": [ "# you can partially retrieve data or retrieve data in chunks using these periods\n", "ps['2016']" ] }, { "cell_type": "code", "execution_count": null, "id": "f98fda1f", "metadata": {}, "outputs": [], "source": [ "ps['2016':'2017']" ] }, { "cell_type": "code", "execution_count": null, "id": "d4e2ffcc", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "86f80fad", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "9a2450f6", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "aa99b61c", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "b2e55b7a", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.9.7" } }, "nbformat": 4, "nbformat_minor": 5 }