{
"cells": [
{
"cell_type": "markdown",
"id": "9e0b4e60",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"# DS2500 Day 21\n",
"\n",
"Mar 31, 2023\n",
"\n",
"### Content\n",
"- Weather API\n",
" - timestamps\n",
" - representing a tree via nested dictionaries (json format)\n",
" - making API calls\n",
"- 🐂💩 visualizations\n",
" - the colorful language, [it isn't mine](https://www.callingbullshit.org/), though it does add a certain excitement to our ordinarily dry technical lingo\n",
"\n",
"### Admin\n",
"- focus on the project!\n",
" - presentatoin preferences due next monday @ 9AM\n",
" - https://piazza.com/class/lbxsbawi9yq2f9/post/403\n",
" - lab sessions next week will support hw7\n",
" - its optional, no need to go if you don't feel the need\n",
" - hw7 is due next monday (April 3) to allow you to ask questions in lab\n",
"\n",
" - no classes next week, sign up for a project team meeting with Prof Higger\n",
" - link on course website"
]
},
{
"cell_type": "markdown",
"id": "870b0ff1",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"# Timestamps\n",
"## Unix Time\n",
"\n",
"- [UTC 00:00](https://en.wikipedia.org/wiki/UTC%2B00:00) Coordinated Universal Time's \"zero\" timezome\n",
" - time zone at 0 deg longitude\n",
" - how is 0 deg longitude defined? \n",
" - A succesfully warring empire (United Kingdom) chose it \n",
" - (personally, I'd find it convenient if a metric system loving empire had been more successful at war ...)\n",
"- [Unix Time](https://en.wikipedia.org/wiki/Unix_time) is The number of seconds which have passed since 00:00:00 UTC on 1 Jan 1970 (ignoring leap seconds)\n",
"- UTC is time zone agnostic \n",
" - (more on this next lesson...)\n",
"\n",
"## Python's `datetime` & `timedelta`\n",
"- helpful for all those pesky unit conversions"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "5adc58fc",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"datetime.datetime(2021, 2, 14, 2, 0)"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from datetime import datetime, timedelta\n",
"\n",
"utc_example = 1613286000\n",
"\n",
"# WARNING! assumes the time zone of the machine its running on!\n",
"# (we'll see this issue again later ...)\n",
"dt0 = datetime.fromtimestamp(utc_example)\n",
"dt0"
]
},
{
"cell_type": "markdown",
"id": "55cbacb4",
"metadata": {},
"source": [
"[further reading](https://docs.python.org/3/library/datetime.html#aware-and-naive-objects) on the datetime above being timezone agnostic."
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "94556cf9",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(2, 14)"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# we can access meaningful date attributes of a datetime object\n",
"# year, month, day, hour, minute, second\n",
"dt0.month, dt0.day"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "7f63cfc3",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dt0.second"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "2ca5cfac",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"2021"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dt0.year"
]
},
{
"cell_type": "code",
"execution_count": 26,
"id": "faf7f937",
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"text/plain": [
"datetime.datetime(2023, 3, 31, 10, 8, 31, 404973)"
]
},
"execution_count": 26,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dt1 = datetime.now()\n",
"dt1"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "3ee738bf",
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"text/plain": [
"datetime.datetime(2222, 2, 2, 2, 0)"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dt2 = datetime(year=2222, month=2, day=2, hour=2)\n",
"dt2"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "87f7c545",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"datetime.timedelta(days=72625, seconds=57279, microseconds=96793)"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# time delta measure differences between two datetimes:\n",
"dt2 - dt1"
]
},
{
"cell_type": "code",
"execution_count": 16,
"id": "d924614d",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"datetime.timedelta(days=3, seconds=37056)"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# you can build them explicitly:\n",
"offset = timedelta(days=2, seconds=123456)\n",
"offset"
]
},
{
"cell_type": "code",
"execution_count": 17,
"id": "e2e6b617",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"datetime.datetime(2222, 2, 5, 12, 17, 36)"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# and operate with them (datetime + timedelta = datetime)\n",
"dt2 + offset"
]
},
{
"cell_type": "code",
"execution_count": 27,
"id": "12d15e2f",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"733572534.414235"
]
},
"execution_count": 27,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# how many seconds old are you?\n",
"(datetime.now() - datetime(year=2000, month=1, day=1)).total_seconds()"
]
},
{
"cell_type": "code",
"execution_count": 29,
"id": "0de30b1c",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"31.70958904109589"
]
},
"execution_count": 29,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# you've got a billionth second birthday coming up around age 31 or so:\n",
"billion_sec = timedelta(seconds=1e9)\n",
"billion_sec.days/365"
]
},
{
"cell_type": "code",
"execution_count": 30,
"id": "91dea7a1",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"datetime.datetime(2031, 9, 9, 1, 46, 40)"
]
},
"execution_count": 30,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# be sure to compute below so you can plan that party 10 years from now\n",
"datetime(year=2000, month=1, day=1) + billion_sec"
]
},
{
"cell_type": "markdown",
"id": "3f25eeaf",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"# `pd.to_datetime()`\n",
"\n",
"Use pandas's [pd.to_datetime()](https://pandas.pydata.org/docs/reference/api/pandas.to_datetime.html) function to convert a column of your dataframe to datetime objects. \n",
"\n",
"`to_datetime()` does a pretty good job guessing your format, but if it runs into trouble you've always got [strftime & strptime](https://docs.python.org/3/library/datetime.html#strftime-and-strptime-behavior)"
]
},
{
"cell_type": "code",
"execution_count": 33,
"id": "df2bca22",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0 dec 23, 2000\n",
"1 jan 1, 2039 3AM\n",
"2 jan 14, 2039 14:00\n",
"3 not really a toHFDSOAIUSHFIAUime\n",
"dtype: object"
]
},
"execution_count": 33,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import pandas as pd\n",
"\n",
"s = pd.Series(['dec 23, 2000', 'jan 1, 2039 3AM', 'jan 14, 2039 14:00', 'not really a toHFDSOAIUSHFIAUime'])\n",
"\n",
"s"
]
},
{
"cell_type": "code",
"execution_count": 35,
"id": "7ec7f28f",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0 2000-12-23 00:00:00\n",
"1 2039-01-01 03:00:00\n",
"2 2039-01-14 14:00:00\n",
"3 NaT\n",
"dtype: datetime64[ns]"
]
},
"execution_count": 35,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# the errors = 'coerce' argument yield \"NaT\", not-a-time, objects for inputs which\n",
"# can't be converted. without this generates an error\n",
"pd.to_datetime(s, errors='coerce')"
]
},
{
"cell_type": "markdown",
"id": "8e969b4b",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"# Do you know what time it is?\n",
"[after reading this, I'm not sure that I do ...](https://www.creativedeletion.com/2015/01/28/falsehoods-programmers-date-time-zones.html)\n",
"\n",
"takeaways:\n",
"- don't underestimate the difficulty of describing time unabmiguously, its hard!\n",
"- use a library where you might run into time issues:\n",
" - timezones\n",
" - leap year / second\n",
" - varying days of month / year\n",
" - time formatting 'Feb' vs 'February' etc\n",
"- Unix Time isn't human readable ... but it is unambiguous. \n",
"\n",
"### Punchline: measuring time is hard, don't underestimate it (I certainly have!)"
]
},
{
"cell_type": "markdown",
"id": "dbf0b3e4",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"## Representing Trees as Lists & Dictionaries\n",
"- useful for representing a tree of data\n",
"- (our API calls will return nested dictionaries)\n",
"\n",
""
]
},
{
"cell_type": "code",
"execution_count": 39,
"id": "a917657b",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"{'f': {'a': 0, 'b': 1, 'c': 2}, 'g': {'x': 24, 'y': 25, 'z': 26}}"
]
},
"execution_count": 39,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"red_branch_dict = {'a': 0, 'b': 1, 'c': 2}\n",
"blu_branch_dict = {'x': 24, 'y': 25, 'z': 26}\n",
"tree_dict = {'f': red_branch_dict,\n",
" 'g': blu_branch_dict}\n",
"tree_dict"
]
},
{
"cell_type": "code",
"execution_count": 40,
"id": "f131240a",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"1"
]
},
"execution_count": 40,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"tree_dict['f']['b']"
]
},
{
"cell_type": "markdown",
"id": "4f999d34",
"metadata": {},
"source": [
"
"
]
},
{
"cell_type": "code",
"execution_count": 44,
"id": "4493f8d9",
"metadata": {},
"outputs": [],
"source": [
"dict0 = {'num': [3, 1, 4, 1, 5, 9, 2, 6],\n",
" 'letter': 'C'}\n",
"dict1 = {'num': 17,\n",
" 'letter': 'R'}\n",
"dict2 = {'num': 21,\n",
" 'letter': 'S'}\n",
"dict_of_dict = {0: dict0,\n",
" 1: dict1,\n",
" 2: dict2}\n",
"list_of_dict = [dict0, dict1, dict2]"
]
},
{
"cell_type": "code",
"execution_count": 46,
"id": "5ed12c9c",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'R'"
]
},
"execution_count": 46,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dict_of_dict[1]['letter']"
]
},
{
"cell_type": "code",
"execution_count": 45,
"id": "140088ac",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'R'"
]
},
"execution_count": 45,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"list_of_dict[1]['letter']"
]
},
{
"cell_type": "markdown",
"id": "93046c6d",
"metadata": {},
"source": [
"## In class activity 1:\n",
"1. Express all of the following penguin group's height and weight as a list of dictionaries:\n",
"
"
]
},
{
"cell_type": "code",
"execution_count": 51,
"id": "ce5680cb",
"metadata": {},
"outputs": [],
"source": [
"grn_dict = {'height': [2, 3, 2],\n",
" 'weight': [4, 6, 5]}\n",
"blu_dict = {'height': [4, 6, 5],\n",
" 'weight': [2, 3, 2]}\n",
"red_dict = {'height': [10, 7, 8],\n",
" 'weight': [11, 6, 5]}\n",
"peng_data = [grn_dict,\n",
" blu_dict,\n",
" red_dict]\n",
"peng_data2 = {'penguin0': grn_dict,\n",
" 'penguin1': blu_dict,\n",
" 'penguin2': red_dict}"
]
},
{
"cell_type": "code",
"execution_count": 49,
"id": "9adc4397",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[2, 3, 2]"
]
},
"execution_count": 49,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"peng_data[0]['height']"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "0ee36cf0",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"id": "5839a432",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"# API\n",
"### Definitions\n",
"**API** Application Program Interface\n",
" - within DS: a server which gives out data (often over the internet)\n",
" - note: 'API', in general, refers to the barrier between two pieces of software, has a specific meaning in DS\n",
" \n",
" \n",
" **JSON** JavaScript Object Notation\n",
" - a method of storing objects as text\n",
" - much like the nested dictionaries ... JSON and similar formats are often trees"
]
},
{
"cell_type": "markdown",
"id": "29264c73",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"## OpenWeather API\n",
"What information does this offer?\n",
"\n",
"- [https://openweathermap.org/api](https://openweathermap.org/api)\n",
"- (note, you won't have access to all that, see the \"free\" column [here](https://openweathermap.org/price))\n",
"\n",
"How do I get ready to use it?\n",
"- sign up for an account\n",
" - [https://home.openweathermap.org/users/sign_up](https://home.openweathermap.org/users/sign_up)\n",
"- get an api key\n",
" - [https://home.openweathermap.org/api_keys](https://home.openweathermap.org/api_keys)\n",
" \n",
"Think of APIs as a hybrid of a website and a function. Its a website where your query is stored in the address:"
]
},
{
"cell_type": "code",
"execution_count": 53,
"id": "ddf57001",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"https://api.openweathermap.org/data/2.5/forecast?lat=42.3601&lon=-71.0589&units=imperial&appid=eea5fcef9a7ea19505dc1c165bacac4a\n"
]
}
],
"source": [
"api_key = 'eea5fcef9a7ea19505dc1c165bacac4a'\n",
"\n",
"# north = positive, south = negative\n",
"lat = 42.3601\n",
"# west = positive, east = negative\n",
"lon = -71.0589\n",
"\n",
"units = 'imperial'\n",
"\n",
"url = f'https://api.openweathermap.org/data/2.5/forecast?lat={lat}&lon={lon}&units={units}&appid={api_key}'\n",
"print(url)"
]
},
{
"cell_type": "code",
"execution_count": 55,
"id": "1d51a6ed",
"metadata": {
"collapsed": true
},
"outputs": [
{
"data": {
"text/plain": [
"'{\"cod\":\"200\",\"message\":0,\"cnt\":40,\"list\":[{\"dt\":1680274800,\"main\":{\"temp\":40.91,\"feels_like\":37.31,\"temp_min\":40.91,\"temp_max\":43.12,\"pressure\":1027,\"sea_level\":1027,\"grnd_level\":1026,\"humidity\":36,\"temp_kf\":-1.23},\"weather\":[{\"id\":803,\"main\":\"Clouds\",\"description\":\"broken clouds\",\"icon\":\"04d\"}],\"clouds\":{\"all\":75},\"wind\":{\"speed\":5.32,\"deg\":252,\"gust\":10.31},\"visibility\":10000,\"pop\":0,\"sys\":{\"pod\":\"d\"},\"dt_txt\":\"2023-03-31 15:00:00\"},{\"dt\":1680285600,\"main\":{\"temp\":44.42,\"feels_like\":41.05,\"temp_min\":44.42,\"temp_max\":51.44,\"pressure\":1026,\"sea_level\":1026,\"grnd_level\":1023,\"humidity\":32,\"temp_kf\":-3.9},\"weather\":[{\"id\":803,\"main\":\"Clouds\",\"description\":\"broken clouds\",\"icon\":\"04d\"}],\"clouds\":{\"all\":81},\"wind\":{\"speed\":5.95,\"deg\":213,\"gust\":12.77},\"visibility\":10000,\"pop\":0,\"sys\":{\"pod\":\"d\"},\"dt_txt\":\"2023-03-31 18:00:00\"},{\"dt\":1680296400,\"main\":{\"temp\":43.93,\"feels_like\":37.71,\"temp_min\":43.93,\"temp_max\":45.45,\"pressure\":1023,\"sea_level\":1023,\"grnd_level\":1020,\"humidity\":48,\"temp_kf\":-0.84},\"weather\":[{\"id\":500,\"main\":\"Rain\",\"description\":\"light rain\",\"icon\":\"10d\"}],\"clouds\":{\"all\":92},\"wind\":{\"speed\":12.28,\"deg\":194,\"gust\":18.52},\"visibility\":10000,\"pop\":0.4,\"rain\":{\"3h\":0.11},\"sys\":{\"pod\":\"d\"},\"dt_txt\":\"2023-03-31 21:00:00\"},{\"dt\":1680307200,\"main\":{\"temp\":39.45,\"feels_like\":33.03,\"temp_min\":39.45,\"temp_max\":39.45,\"pressure\":1019,\"sea_level\":1019,\"grnd_level\":1018,\"humidity\":87,\"temp_kf\":0},\"weather\":[{\"id\":501,\"main\":\"Rain\",\"description\":\"moderate rain\",\"icon\":\"10n\"}],\"clouds\":{\"all\":100},\"wind\":{\"speed\":9.84,\"deg\":168,\"gust\":29.39},\"visibility\":5974,\"pop\":0.96,\"rain\":{\"3h\":4.27},\"sys\":{\"pod\":\"n\"},\"dt_txt\":\"2023-04-01 00:00:00\"},{\"dt\":1680318000,\"main\":{\"temp\":43.29,\"feels_like\":38.86,\"temp_min\":43.29,\"temp_max\":43.29,\"pressure\":1014,\"sea_level\":1014,\"grnd_level\":1014,\"humidity\":94,\"temp_kf\":0},\"weather\":[{\"id\":501,\"main\":\"Rain\",\"description\":\"moderate rain\",\"icon\":\"10n\"}],\"clouds\":{\"all\":100},\"wind\":{\"speed\":7.47,\"deg\":180,\"gust\":26.02},\"visibility\":10000,\"pop\":1,\"rain\":{\"3h\":4.63},\"sys\":{\"pod\":\"n\"},\"dt_txt\":\"2023-04-01 03:00:00\"},{\"dt\":1680328800,\"main\":{\"temp\":43.86,\"feels_like\":43.86,\"temp_min\":43.86,\"temp_max\":43.86,\"pressure\":1011,\"sea_level\":1011,\"grnd_level\":1010,\"humidity\":98,\"temp_kf\":0},\"weather\":[{\"id\":500,\"main\":\"Rain\",\"description\":\"light rain\",\"icon\":\"10n\"}],\"clouds\":{\"all\":100},\"wind\":{\"speed\":2.62,\"deg\":271,\"gust\":7.7},\"visibility\":10000,\"pop\":1,\"rain\":{\"3h\":0.58},\"sys\":{\"pod\":\"n\"},\"dt_txt\":\"2023-04-01 06:00:00\"},{\"dt\":1680339600,\"main\":{\"temp\":43,\"feels_like\":43,\"temp_min\":43,\"temp_max\":43,\"pressure\":1009,\"sea_level\":1009,\"grnd_level\":1008,\"humidity\":98,\"temp_kf\":0},\"weather\":[{\"id\":804,\"main\":\"Clouds\",\"description\":\"overcast clouds\",\"icon\":\"04n\"}],\"clouds\":{\"all\":100},\"wind\":{\"speed\":2.01,\"deg\":275,\"gust\":4.5},\"visibility\":10000,\"pop\":0,\"sys\":{\"pod\":\"n\"},\"dt_txt\":\"2023-04-01 09:00:00\"},{\"dt\":1680350400,\"main\":{\"temp\":44.6,\"feels_like\":42.93,\"temp_min\":44.6,\"temp_max\":44.6,\"pressure\":1005,\"sea_level\":1005,\"grnd_level\":1005,\"humidity\":98,\"temp_kf\":0},\"weather\":[{\"id\":500,\"main\":\"Rain\",\"description\":\"light rain\",\"icon\":\"10d\"}],\"clouds\":{\"all\":100},\"wind\":{\"speed\":3.67,\"deg\":146,\"gust\":13.35},\"visibility\":4623,\"pop\":0.21,\"rain\":{\"3h\":0.2},\"sys\":{\"pod\":\"d\"},\"dt_txt\":\"2023-04-01 12:00:00\"},{\"dt\":1680361200,\"main\":{\"temp\":51.3,\"feels_like\":50.63,\"temp_min\":51.3,\"temp_max\":51.3,\"pressure\":1000,\"sea_level\":1000,\"grnd_level\":999,\"humidity\":96,\"temp_kf\":0},\"weather\":[{\"id\":501,\"main\":\"Rain\",\"description\":\"moderate rain\",\"icon\":\"10d\"}],\"clouds\":{\"all\":100},\"wind\":{\"speed\":12.21,\"deg\":206,\"gust\":38.54},\"visibility\":10000,\"pop\":1,\"rain\":{\"3h\":5.57},\"sys\":{\"pod\":\"d\"},\"dt_txt\":\"2023-04-01 15:00:00\"},{\"dt\":1680372000,\"main\":{\"temp\":55.49,\"feels_like\":55.11,\"temp_min\":55.49,\"temp_max\":55.49,\"pressure\":995,\"sea_level\":995,\"grnd_level\":995,\"humidity\":93,\"temp_kf\":0},\"weather\":[{\"id\":500,\"main\":\"Rain\",\"description\":\"light rain\",\"icon\":\"10d\"}],\"clouds\":{\"all\":100},\"wind\":{\"speed\":15.39,\"deg\":217,\"gust\":38.95},\"visibility\":10000,\"pop\":1,\"rain\":{\"3h\":1.93},\"sys\":{\"pod\":\"d\"},\"dt_txt\":\"2023-04-01 18:00:00\"},{\"dt\":1680382800,\"main\":{\"temp\":58.33,\"feels_like\":57.96,\"temp_min\":58.33,\"temp_max\":58.33,\"pressure\":993,\"sea_level\":993,\"grnd_level\":993,\"humidity\":87,\"temp_kf\":0},\"weather\":[{\"id\":500,\"main\":\"Rain\",\"description\":\"light rain\",\"icon\":\"10d\"}],\"clouds\":{\"all\":91},\"wind\":{\"speed\":12.57,\"deg\":217,\"gust\":29.01},\"visibility\":10000,\"pop\":0.8,\"rain\":{\"3h\":0.94},\"sys\":{\"pod\":\"d\"},\"dt_txt\":\"2023-04-01 21:00:00\"},{\"dt\":1680393600,\"main\":{\"temp\":53.87,\"feels_like\":53.33,\"temp_min\":53.87,\"temp_max\":53.87,\"pressure\":991,\"sea_level\":991,\"grnd_level\":990,\"humidity\":93,\"temp_kf\":0},\"weather\":[{\"id\":803,\"main\":\"Clouds\",\"description\":\"broken clouds\",\"icon\":\"04n\"}],\"clouds\":{\"all\":67},\"wind\":{\"speed\":11.05,\"deg\":196,\"gust\":34.83},\"visibility\":10000,\"pop\":0.66,\"sys\":{\"pod\":\"n\"},\"dt_txt\":\"2023-04-02 00:00:00\"},{\"dt\":1680404400,\"main\":{\"temp\":50.86,\"feels_like\":49.69,\"temp_min\":50.86,\"temp_max\":50.86,\"pressure\":990,\"sea_level\":990,\"grnd_level\":989,\"humidity\":86,\"temp_kf\":0},\"weather\":[{\"id\":501,\"main\":\"Rain\",\"description\":\"moderate rain\",\"icon\":\"10n\"}],\"clouds\":{\"all\":100},\"wind\":{\"speed\":8.75,\"deg\":261,\"gust\":24.56},\"visibility\":10000,\"pop\":1,\"rain\":{\"3h\":5.89},\"sys\":{\"pod\":\"n\"},\"dt_txt\":\"2023-04-02 03:00:00\"},{\"dt\":1680415200,\"main\":{\"temp\":47.52,\"feels_like\":41.14,\"temp_min\":47.52,\"temp_max\":47.52,\"pressure\":991,\"sea_level\":991,\"grnd_level\":991,\"humidity\":81,\"temp_kf\":0},\"weather\":[{\"id\":500,\"main\":\"Rain\",\"description\":\"light rain\",\"icon\":\"10n\"}],\"clouds\":{\"all\":100},\"wind\":{\"speed\":16.28,\"deg\":274,\"gust\":30.42},\"visibility\":10000,\"pop\":1,\"rain\":{\"3h\":0.55},\"sys\":{\"pod\":\"n\"},\"dt_txt\":\"2023-04-02 06:00:00\"},{\"dt\":1680426000,\"main\":{\"temp\":43.83,\"feels_like\":36.18,\"temp_min\":43.83,\"temp_max\":43.83,\"pressure\":996,\"sea_level\":996,\"grnd_level\":996,\"humidity\":75,\"temp_kf\":0},\"weather\":[{\"id\":500,\"main\":\"Rain\",\"description\":\"light rain\",\"icon\":\"10n\"}],\"clouds\":{\"all\":100},\"wind\":{\"speed\":17.09,\"deg\":299,\"gust\":31.79},\"visibility\":10000,\"pop\":0.35,\"rain\":{\"3h\":0.3},\"sys\":{\"pod\":\"n\"},\"dt_txt\":\"2023-04-02 09:00:00\"},{\"dt\":1680436800,\"main\":{\"temp\":35.67,\"feels_like\":25.57,\"temp_min\":35.67,\"temp_max\":35.67,\"pressure\":1004,\"sea_level\":1004,\"grnd_level\":1004,\"humidity\":61,\"temp_kf\":0},\"weather\":[{\"id\":803,\"main\":\"Clouds\",\"description\":\"broken clouds\",\"icon\":\"04d\"}],\"clouds\":{\"all\":62},\"wind\":{\"speed\":17.27,\"deg\":316,\"gust\":36.78},\"visibility\":10000,\"pop\":0.12,\"sys\":{\"pod\":\"d\"},\"dt_txt\":\"2023-04-02 12:00:00\"},{\"dt\":1680447600,\"main\":{\"temp\":38.95,\"feels_like\":29.48,\"temp_min\":38.95,\"temp_max\":38.95,\"pressure\":1009,\"sea_level\":1009,\"grnd_level\":1008,\"humidity\":31,\"temp_kf\":0},\"weather\":[{\"id\":800,\"main\":\"Clear\",\"description\":\"clear sky\",\"icon\":\"01d\"}],\"clouds\":{\"all\":3},\"wind\":{\"speed\":18.52,\"deg\":326,\"gust\":29.68},\"visibility\":10000,\"pop\":0,\"sys\":{\"pod\":\"d\"},\"dt_txt\":\"2023-04-02 15:00:00\"},{\"dt\":1680458400,\"main\":{\"temp\":42.84,\"feels_like\":35.44,\"temp_min\":42.84,\"temp_max\":42.84,\"pressure\":1012,\"sea_level\":1012,\"grnd_level\":1011,\"humidity\":27,\"temp_kf\":0},\"weather\":[{\"id\":800,\"main\":\"Clear\",\"description\":\"clear sky\",\"icon\":\"01d\"}],\"clouds\":{\"all\":2},\"wind\":{\"speed\":15.12,\"deg\":328,\"gust\":22.01},\"visibility\":10000,\"pop\":0,\"sys\":{\"pod\":\"d\"},\"dt_txt\":\"2023-04-02 18:00:00\"},{\"dt\":1680469200,\"main\":{\"temp\":42.89,\"feels_like\":36.16,\"temp_min\":42.89,\"temp_max\":42.89,\"pressure\":1014,\"sea_level\":1014,\"grnd_level\":1013,\"humidity\":28,\"temp_kf\":0},\"weather\":[{\"id\":800,\"main\":\"Clear\",\"description\":\"clear sky\",\"icon\":\"01d\"}],\"clouds\":{\"all\":0},\"wind\":{\"speed\":12.97,\"deg\":326,\"gust\":18.54},\"visibility\":10000,\"pop\":0,\"sys\":{\"pod\":\"d\"},\"dt_txt\":\"2023-04-02 21:00:00\"},{\"dt\":1680480000,\"main\":{\"temp\":37.83,\"feels_like\":30.81,\"temp_min\":37.83,\"temp_max\":37.83,\"pressure\":1018,\"sea_level\":1018,\"grnd_level\":1017,\"humidity\":36,\"temp_kf\":0},\"weather\":[{\"id\":800,\"main\":\"Clear\",\"description\":\"clear sky\",\"icon\":\"01n\"}],\"clouds\":{\"all\":1},\"wind\":{\"speed\":10.31,\"deg\":330,\"gust\":20},\"visibility\":10000,\"pop\":0,\"sys\":{\"pod\":\"n\"},\"dt_txt\":\"2023-04-03 00:00:00\"},{\"dt\":1680490800,\"main\":{\"temp\":34,\"feels_like\":27.43,\"temp_min\":34,\"temp_max\":34,\"pressure\":1019,\"sea_level\":1019,\"grnd_level\":1019,\"humidity\":40,\"temp_kf\":0},\"weather\":[{\"id\":800,\"main\":\"Clear\",\"description\":\"clear sky\",\"icon\":\"01n\"}],\"clouds\":{\"all\":9},\"wind\":{\"speed\":7.74,\"deg\":328,\"gust\":16.71},\"visibility\":10000,\"pop\":0,\"sys\":{\"pod\":\"n\"},\"dt_txt\":\"2023-04-03 03:00:00\"},{\"dt\":1680501600,\"main\":{\"temp\":32.67,\"feels_like\":32.67,\"temp_min\":32.67,\"temp_max\":32.67,\"pressure\":1020,\"sea_level\":1020,\"grnd_level\":1019,\"humidity\":41,\"temp_kf\":0},\"weather\":[{\"id\":800,\"main\":\"Clear\",\"description\":\"clear sky\",\"icon\":\"01n\"}],\"clouds\":{\"all\":9},\"wind\":{\"speed\":2.39,\"deg\":301,\"gust\":4.63},\"visibility\":10000,\"pop\":0,\"sys\":{\"pod\":\"n\"},\"dt_txt\":\"2023-04-03 06:00:00\"},{\"dt\":1680512400,\"main\":{\"temp\":32.38,\"feels_like\":29.25,\"temp_min\":32.38,\"temp_max\":32.38,\"pressure\":1020,\"sea_level\":1020,\"grnd_level\":1020,\"humidity\":45,\"temp_kf\":0},\"weather\":[{\"id\":800,\"main\":\"Clear\",\"description\":\"clear sky\",\"icon\":\"01n\"}],\"clouds\":{\"all\":10},\"wind\":{\"speed\":3.38,\"deg\":195,\"gust\":6.62},\"visibility\":10000,\"pop\":0,\"sys\":{\"pod\":\"n\"},\"dt_txt\":\"2023-04-03 09:00:00\"},{\"dt\":1680523200,\"main\":{\"temp\":35.87,\"feels_like\":30.72,\"temp_min\":35.87,\"temp_max\":35.87,\"pressure\":1021,\"sea_level\":1021,\"grnd_level\":1021,\"humidity\":44,\"temp_kf\":0},\"weather\":[{\"id\":801,\"main\":\"Clouds\",\"description\":\"few clouds\",\"icon\":\"02d\"}],\"clouds\":{\"all\":13},\"wind\":{\"speed\":6.17,\"deg\":208,\"gust\":12.24},\"visibility\":10000,\"pop\":0,\"sys\":{\"pod\":\"d\"},\"dt_txt\":\"2023-04-03 12:00:00\"},{\"dt\":1680534000,\"main\":{\"temp\":45.79,\"feels_like\":40.24,\"temp_min\":45.79,\"temp_max\":45.79,\"pressure\":1019,\"sea_level\":1019,\"grnd_level\":1019,\"humidity\":30,\"temp_kf\":0},\"weather\":[{\"id\":804,\"main\":\"Clouds\",\"description\":\"overcast clouds\",\"icon\":\"04d\"}],\"clouds\":{\"all\":100},\"wind\":{\"speed\":11.65,\"deg\":210,\"gust\":19.33},\"visibility\":10000,\"pop\":0,\"sys\":{\"pod\":\"d\"},\"dt_txt\":\"2023-04-03 15:00:00\"},{\"dt\":1680544800,\"main\":{\"temp\":54.7,\"feels_like\":51.37,\"temp_min\":54.7,\"temp_max\":54.7,\"pressure\":1015,\"sea_level\":1015,\"grnd_level\":1015,\"humidity\":32,\"temp_kf\":0},\"weather\":[{\"id\":804,\"main\":\"Clouds\",\"description\":\"overcast clouds\",\"icon\":\"04d\"}],\"clouds\":{\"all\":99},\"wind\":{\"speed\":14.29,\"deg\":213,\"gust\":24.54},\"visibility\":10000,\"pop\":0,\"sys\":{\"pod\":\"d\"},\"dt_txt\":\"2023-04-03 18:00:00\"},{\"dt\":1680555600,\"main\":{\"temp\":53.56,\"feels_like\":50.59,\"temp_min\":53.56,\"temp_max\":53.56,\"pressure\":1012,\"sea_level\":1012,\"grnd_level\":1012,\"humidity\":42,\"temp_kf\":0},\"weather\":[{\"id\":804,\"main\":\"Clouds\",\"description\":\"overcast clouds\",\"icon\":\"04d\"}],\"clouds\":{\"all\":100},\"wind\":{\"speed\":14.85,\"deg\":208,\"gust\":30.44},\"visibility\":10000,\"pop\":0,\"sys\":{\"pod\":\"d\"},\"dt_txt\":\"2023-04-03 21:00:00\"},{\"dt\":1680566400,\"main\":{\"temp\":49.3,\"feels_like\":43.99,\"temp_min\":49.3,\"temp_max\":49.3,\"pressure\":1013,\"sea_level\":1013,\"grnd_level\":1012,\"humidity\":61,\"temp_kf\":0},\"weather\":[{\"id\":804,\"main\":\"Clouds\",\"description\":\"overcast clouds\",\"icon\":\"04n\"}],\"clouds\":{\"all\":100},\"wind\":{\"speed\":14.05,\"deg\":216,\"gust\":39.19},\"visibility\":10000,\"pop\":0,\"sys\":{\"pod\":\"n\"},\"dt_txt\":\"2023-04-04 00:00:00\"},{\"dt\":1680577200,\"main\":{\"temp\":49.23,\"feels_like\":44.37,\"temp_min\":49.23,\"temp_max\":49.23,\"pressure\":1012,\"sea_level\":1012,\"grnd_level\":1012,\"humidity\":72,\"temp_kf\":0},\"weather\":[{\"id\":804,\"main\":\"Clouds\",\"description\":\"overcast clouds\",\"icon\":\"04n\"}],\"clouds\":{\"all\":100},\"wind\":{\"speed\":12.26,\"deg\":224,\"gust\":36.57},\"visibility\":10000,\"pop\":0.04,\"sys\":{\"pod\":\"n\"},\"dt_txt\":\"2023-04-04 03:00:00\"},{\"dt\":1680588000,\"main\":{\"temp\":47.82,\"feels_like\":45.63,\"temp_min\":47.82,\"temp_max\":47.82,\"pressure\":1014,\"sea_level\":1014,\"grnd_level\":1013,\"humidity\":85,\"temp_kf\":0},\"weather\":[{\"id\":500,\"main\":\"Rain\",\"description\":\"light rain\",\"icon\":\"10n\"}],\"clouds\":{\"all\":100},\"wind\":{\"speed\":5.06,\"deg\":286,\"gust\":16.06},\"visibility\":10000,\"pop\":0.49,\"rain\":{\"3h\":0.54},\"sys\":{\"pod\":\"n\"},\"dt_txt\":\"2023-04-04 06:00:00\"},{\"dt\":1680598800,\"main\":{\"temp\":46.51,\"feels_like\":44.82,\"temp_min\":46.51,\"temp_max\":46.51,\"pressure\":1014,\"sea_level\":1014,\"grnd_level\":1013,\"humidity\":93,\"temp_kf\":0},\"weather\":[{\"id\":500,\"main\":\"Rain\",\"description\":\"light rain\",\"icon\":\"10n\"}],\"clouds\":{\"all\":100},\"wind\":{\"speed\":4.03,\"deg\":162,\"gust\":7.07},\"visibility\":10000,\"pop\":0.79,\"rain\":{\"3h\":0.87},\"sys\":{\"pod\":\"n\"},\"dt_txt\":\"2023-04-04 09:00:00\"},{\"dt\":1680609600,\"main\":{\"temp\":48.15,\"feels_like\":46.36,\"temp_min\":48.15,\"temp_max\":48.15,\"pressure\":1015,\"sea_level\":1015,\"grnd_level\":1015,\"humidity\":90,\"temp_kf\":0},\"weather\":[{\"id\":804,\"main\":\"Clouds\",\"description\":\"overcast clouds\",\"icon\":\"04d\"}],\"clouds\":{\"all\":100},\"wind\":{\"speed\":4.5,\"deg\":192,\"gust\":9.35},\"visibility\":10000,\"pop\":0.66,\"sys\":{\"pod\":\"d\"},\"dt_txt\":\"2023-04-04 12:00:00\"},{\"dt\":1680620400,\"main\":{\"temp\":57.43,\"feels_like\":55.94,\"temp_min\":57.43,\"temp_max\":57.43,\"pressure\":1016,\"sea_level\":1016,\"grnd_level\":1015,\"humidity\":65,\"temp_kf\":0},\"weather\":[{\"id\":803,\"main\":\"Clouds\",\"description\":\"broken clouds\",\"icon\":\"04d\"}],\"clouds\":{\"all\":79},\"wind\":{\"speed\":1.83,\"deg\":266,\"gust\":4.21},\"visibility\":10000,\"pop\":0,\"sys\":{\"pod\":\"d\"},\"dt_txt\":\"2023-04-04 15:00:00\"},{\"dt\":1680631200,\"main\":{\"temp\":62.13,\"feels_like\":60.26,\"temp_min\":62.13,\"temp_max\":62.13,\"pressure\":1016,\"sea_level\":1016,\"grnd_level\":1015,\"humidity\":47,\"temp_kf\":0},\"weather\":[{\"id\":804,\"main\":\"Clouds\",\"description\":\"overcast clouds\",\"icon\":\"04d\"}],\"clouds\":{\"all\":88},\"wind\":{\"speed\":2.77,\"deg\":308,\"gust\":8.99},\"visibility\":10000,\"pop\":0,\"sys\":{\"pod\":\"d\"},\"dt_txt\":\"2023-04-04 18:00:00\"},{\"dt\":1680642000,\"main\":{\"temp\":63.36,\"feels_like\":61.56,\"temp_min\":63.36,\"temp_max\":63.36,\"pressure\":1017,\"sea_level\":1017,\"grnd_level\":1017,\"humidity\":46,\"temp_kf\":0},\"weather\":[{\"id\":804,\"main\":\"Clouds\",\"description\":\"overcast clouds\",\"icon\":\"04d\"}],\"clouds\":{\"all\":100},\"wind\":{\"speed\":3.36,\"deg\":328,\"gust\":9.86},\"visibility\":10000,\"pop\":0,\"sys\":{\"pod\":\"d\"},\"dt_txt\":\"2023-04-04 21:00:00\"},{\"dt\":1680652800,\"main\":{\"temp\":54.3,\"feels_like\":52.63,\"temp_min\":54.3,\"temp_max\":54.3,\"pressure\":1020,\"sea_level\":1020,\"grnd_level\":1020,\"humidity\":68,\"temp_kf\":0},\"weather\":[{\"id\":804,\"main\":\"Clouds\",\"description\":\"overcast clouds\",\"icon\":\"04n\"}],\"clouds\":{\"all\":99},\"wind\":{\"speed\":2.53,\"deg\":122,\"gust\":5.53},\"visibility\":10000,\"pop\":0,\"sys\":{\"pod\":\"n\"},\"dt_txt\":\"2023-04-05 00:00:00\"},{\"dt\":1680663600,\"main\":{\"temp\":52,\"feels_like\":50.52,\"temp_min\":52,\"temp_max\":52,\"pressure\":1022,\"sea_level\":1022,\"grnd_level\":1021,\"humidity\":77,\"temp_kf\":0},\"weather\":[{\"id\":803,\"main\":\"Clouds\",\"description\":\"broken clouds\",\"icon\":\"04n\"}],\"clouds\":{\"all\":73},\"wind\":{\"speed\":1.92,\"deg\":63,\"gust\":3.24},\"visibility\":10000,\"pop\":0,\"sys\":{\"pod\":\"n\"},\"dt_txt\":\"2023-04-05 03:00:00\"},{\"dt\":1680674400,\"main\":{\"temp\":49.55,\"feels_like\":49.55,\"temp_min\":49.55,\"temp_max\":49.55,\"pressure\":1022,\"sea_level\":1022,\"grnd_level\":1022,\"humidity\":86,\"temp_kf\":0},\"weather\":[{\"id\":803,\"main\":\"Clouds\",\"description\":\"broken clouds\",\"icon\":\"04n\"}],\"clouds\":{\"all\":76},\"wind\":{\"speed\":1.88,\"deg\":69,\"gust\":3.8},\"visibility\":10000,\"pop\":0,\"sys\":{\"pod\":\"n\"},\"dt_txt\":\"2023-04-05 06:00:00\"},{\"dt\":1680685200,\"main\":{\"temp\":48.72,\"feels_like\":46.9,\"temp_min\":48.72,\"temp_max\":48.72,\"pressure\":1024,\"sea_level\":1024,\"grnd_level\":1023,\"humidity\":89,\"temp_kf\":0},\"weather\":[{\"id\":804,\"main\":\"Clouds\",\"description\":\"overcast clouds\",\"icon\":\"04n\"}],\"clouds\":{\"all\":92},\"wind\":{\"speed\":4.7,\"deg\":34,\"gust\":6.96},\"visibility\":10000,\"pop\":0,\"sys\":{\"pod\":\"n\"},\"dt_txt\":\"2023-04-05 09:00:00\"},{\"dt\":1680696000,\"main\":{\"temp\":47.46,\"feels_like\":45.36,\"temp_min\":47.46,\"temp_max\":47.46,\"pressure\":1025,\"sea_level\":1025,\"grnd_level\":1024,\"humidity\":90,\"temp_kf\":0},\"weather\":[{\"id\":804,\"main\":\"Clouds\",\"description\":\"overcast clouds\",\"icon\":\"04d\"}],\"clouds\":{\"all\":94},\"wind\":{\"speed\":4.81,\"deg\":76,\"gust\":8.99},\"visibility\":10000,\"pop\":0,\"sys\":{\"pod\":\"d\"},\"dt_txt\":\"2023-04-05 12:00:00\"}],\"city\":{\"id\":4930956,\"name\":\"Boston\",\"coord\":{\"lat\":42.3601,\"lon\":-71.0589},\"country\":\"US\",\"population\":617594,\"timezone\":-14400,\"sunrise\":1680258525,\"sunset\":1680304072}}'"
]
},
"execution_count": 55,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import requests\n",
"\n",
"# get url as a string\n",
"url_text = requests.get(url).text \n",
"url_text"
]
},
{
"cell_type": "markdown",
"id": "5e6ef615",
"metadata": {},
"source": [
"The resulting JSON object is a dictionary of dictionaries (or a list of dictionaries) tree as seen in the previous section.\n",
"\n",
"You can convert it from string to dicts and lists via:"
]
},
{
"cell_type": "code",
"execution_count": 67,
"id": "7fe29f4b",
"metadata": {},
"outputs": [],
"source": [
"import json\n",
"\n",
"# convert json to a nested dict\n",
"weather_dict = json.loads(url_text)\n",
"\n",
"weather_dict;"
]
},
{
"cell_type": "code",
"execution_count": 70,
"id": "aa60c358",
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"text/plain": [
"{'dt': 1680296400,\n",
" 'main': {'temp': 43.93,\n",
" 'feels_like': 37.71,\n",
" 'temp_min': 43.93,\n",
" 'temp_max': 45.45,\n",
" 'pressure': 1023,\n",
" 'sea_level': 1023,\n",
" 'grnd_level': 1020,\n",
" 'humidity': 48,\n",
" 'temp_kf': -0.84},\n",
" 'weather': [{'id': 500,\n",
" 'main': 'Rain',\n",
" 'description': 'light rain',\n",
" 'icon': '10d'}],\n",
" 'clouds': {'all': 92},\n",
" 'wind': {'speed': 12.28, 'deg': 194, 'gust': 18.52},\n",
" 'visibility': 10000,\n",
" 'pop': 0.4,\n",
" 'rain': {'3h': 0.11},\n",
" 'sys': {'pod': 'd'},\n",
" 'dt_txt': '2023-03-31 21:00:00'}"
]
},
"execution_count": 70,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"weather_dict['list'][2]"
]
},
{
"cell_type": "markdown",
"id": "f3c16f79",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"## Cleaning up data from one instant"
]
},
{
"cell_type": "code",
"execution_count": 71,
"id": "ff400cff",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"{'dt': 1680274800,\n",
" 'main': {'temp': 40.91,\n",
" 'feels_like': 37.31,\n",
" 'temp_min': 40.91,\n",
" 'temp_max': 43.12,\n",
" 'pressure': 1027,\n",
" 'sea_level': 1027,\n",
" 'grnd_level': 1026,\n",
" 'humidity': 36,\n",
" 'temp_kf': -1.23},\n",
" 'weather': [{'id': 803,\n",
" 'main': 'Clouds',\n",
" 'description': 'broken clouds',\n",
" 'icon': '04d'}],\n",
" 'clouds': {'all': 75},\n",
" 'wind': {'speed': 5.32, 'deg': 252, 'gust': 10.31},\n",
" 'visibility': 10000,\n",
" 'pop': 0,\n",
" 'sys': {'pod': 'd'},\n",
" 'dt_txt': '2023-03-31 15:00:00'}"
]
},
"execution_count": 71,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"d = weather_dict['list'][0]\n",
"d"
]
},
{
"cell_type": "code",
"execution_count": 72,
"id": "82ec7713",
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"text/plain": [
"{'dt': 1680274800,\n",
" 'main': {'temp': 40.91,\n",
" 'feels_like': 37.31,\n",
" 'temp_min': 40.91,\n",
" 'temp_max': 43.12,\n",
" 'pressure': 1027,\n",
" 'sea_level': 1027,\n",
" 'grnd_level': 1026,\n",
" 'humidity': 36,\n",
" 'temp_kf': -1.23},\n",
" 'weather': [{'id': 803,\n",
" 'main': 'Clouds',\n",
" 'description': 'broken clouds',\n",
" 'icon': '04d'}],\n",
" 'clouds': {'all': 75},\n",
" 'wind': {'speed': 5.32, 'deg': 252, 'gust': 10.31},\n",
" 'visibility': 10000,\n",
" 'pop': 0,\n",
" 'sys': {'pod': 'd'},\n",
" 'dt_txt': '2023-03-31 15:00:00',\n",
" 'datetime': datetime.datetime(2023, 3, 31, 11, 0)}"
]
},
"execution_count": 72,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# lets convert from unix time to a datetime (easier to use)\n",
"d['datetime'] = datetime.fromtimestamp(d['dt'])\n",
"\n",
"d"
]
},
{
"cell_type": "code",
"execution_count": 82,
"id": "e6bb1264",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"{'a': 1, 'b': 2}"
]
},
"execution_count": 82,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"some_dict = {'a': 1, 'b': 2}\n",
"some_dict"
]
},
{
"cell_type": "code",
"execution_count": 84,
"id": "47b8f878",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"{'a': 1, 'b': 2, 'c': 3, 'd': 1000}"
]
},
"execution_count": 84,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"some_other_dict = {'c': 3, 'd': 1000}\n",
"\n",
"# some_dict.update(some_other_dict)\n",
"\n",
"for key, val in some_other_dict:\n",
" some_dict[key] = val\n",
"\n",
"some_dict"
]
},
{
"cell_type": "code",
"execution_count": 75,
"id": "59086e4f",
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"text/plain": [
"{'dt': 1680274800,\n",
" 'weather': [{'id': 803,\n",
" 'main': 'Clouds',\n",
" 'description': 'broken clouds',\n",
" 'icon': '04d'}],\n",
" 'clouds': {'all': 75},\n",
" 'wind': {'speed': 5.32, 'deg': 252, 'gust': 10.31},\n",
" 'visibility': 10000,\n",
" 'pop': 0,\n",
" 'sys': {'pod': 'd'},\n",
" 'dt_txt': '2023-03-31 15:00:00',\n",
" 'datetime': datetime.datetime(2023, 3, 31, 11, 0),\n",
" 'temp': 40.91,\n",
" 'feels_like': 37.31,\n",
" 'temp_min': 40.91,\n",
" 'temp_max': 43.12,\n",
" 'pressure': 1027,\n",
" 'sea_level': 1027,\n",
" 'grnd_level': 1026,\n",
" 'humidity': 36,\n",
" 'temp_kf': -1.23}"
]
},
"execution_count": 75,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# lets \"flatten\" the main dictionary\n",
"d.update(d['main'])\n",
"del d['main']\n",
"\n",
"d"
]
},
{
"cell_type": "markdown",
"id": "d252d486",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"# Why doesn't our datetime match the \"dt_txt\"?\n",
"\n",
"[lets examine the API's documentation](https://openweathermap.org/forecast5)\n",
"\n",
"(spoiler: the forecasted day is in UTC 00:00, our function converts it to our computer's timezone ... see how sneaky measuring time can be?)"
]
},
{
"cell_type": "markdown",
"id": "346d2cf0",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"# Storing an API key in another file\n",
"\n",
"- security of your account\n",
"- easily swappable with another user"
]
},
{
"cell_type": "code",
"execution_count": 77,
"id": "e5b86ee5",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'eea5fcef9a7ea19505dc1c165bacac4a'"
]
},
"execution_count": 77,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from weather_api import api_key\n",
"\n",
"# nice to keep it a bit more hidden in your code\n",
"# (though you'd do better not to parrot it on a jupyter output cell,\n",
"# I just want to show you all how this works)\n",
"api_key"
]
},
{
"cell_type": "markdown",
"id": "dbad9bd6",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"## In Class Activity 2\n",
" \n",
"1. Make a function `get_forecast` which accepts:\n",
" - `lat`\n",
" - `lon`\n",
" - `api_key`\n",
" - `units` (default = 'imperial')\n",
" \n",
" and returns a dataframe of the forecasted weather\n",
" \n",
"```python\n",
"# clean it up\n",
"row_list = list()\n",
"for d in weather_dict['list']:\n",
" # process dictionary into a row\n",
"\n",
" # store\n",
" row_list.append(d)\n",
"\n",
"# convert list of dictionaries to dataframe\n",
"df = pd.DataFrame(row_list)\n",
"```\n",
"\n",
"2. \"flatten\" the parts of the dictionary which make sense (see \"main\" example a few cells above).\n",
"\n",
"\n",
"## Test Case\n",
"\n",
"Osaka, Japan is located at:\n",
"\n",
" 34.6937° N, 135.5023° E\n",
" \n",
"The first few rows of my call \n",
"\n",
"```python\n",
"df_osaka = get_forecast(lat=34.6937, lon=135.5023, api_key=api_key)\n",
"```\n",
"\n",
"yielded the following dataframe:\n",
"\n",
"| | dt | visibility | pop | dt_txt | all | speed | deg | gust | pod | temp | feels_like | temp_min | temp_max | pressure | sea_level | grnd_level | humidity | temp_kf | id | main | description | icon |\n",
"|---|------------|------------|-----|---------------------|-----|-------|-----|------|-----|-------|------------|----------|----------|----------|-----------|------------|----------|---------|-----|--------|-------------|------|\n",
"| 0 | 1680264000 | 10000 | 0 | 2023-03-31 12:00:00 | 0 | 4.79 | 222 | 7.87 | n | 60.35 | 58.24 | 60.04 | 60.35 | 1016 | 1016 | 1016 | 46 | 0.17 | 800 | Clear | clear sky | 01n |\n",
"| 1 | 1680274800 | 10000 | 0 | 2023-03-31 15:00:00 | 11 | 3.18 | 211 | 6.51 | n | 59.38 | 57.56 | 57.43 | 59.38 | 1017 | 1017 | 1016 | 54 | 1.08 | 801 | Clouds | few clouds | 02n |\n",
"| 2 | 1680285600 | 10000 | 0 | 2023-03-31 18:00:00 | 21 | 1.72 | 78 | 2.37 | n | 57.18 | 55.42 | 55.6 | 57.18 | 1017 | 1017 | 1015 | 60 | 0.88 | 801 | Clouds | few clouds | 02n |\n",
"| 3 | 1680296400 | 10000 | 0 | 2023-03-31 21:00:00 | 4 | 3 | 58 | 4.52 | d | 53.69 | 51.82 | 53.69 | 53.69 | 1017 | 1017 | 1015 | 65 | 0 | 800 | Clear | clear sky | 01d |\n",
"| 4 | 1680307200 | 10000 | 0 | 2023-04-01 00:00:00 | 2 | 3.69 | 50 | 4.34 | d | 61.18 | 59.25 | 61.18 | 61.18 | 1018 | 1018 | 1016 | 48 | 0 | 800 | Clear | clear sky | 01d |"
]
},
{
"cell_type": "code",
"execution_count": 79,
"id": "a65a3b4b",
"metadata": {},
"outputs": [],
"source": [
"from weather_api import api_key\n",
"\n",
"\n",
"def get_forecast(lat, lon, api_key, units='imperial'):\n",
" \"\"\" returns forecast\n",
" \n",
" https://openweathermap.org/forecast5\n",
" \n",
" Args:\n",
" lat (float): lattitude (positive is north)\n",
" lon (float): longitude (positive is east)\n",
" api_key (str): api key for openweather\n",
" units (str): standard, metric or imperial. see link for\n",
" details\n",
" \n",
" Returns:\n",
" df (pd.DataFrame): forecasted weather, one row per \n",
" instant and one column per feature\n",
" \"\"\"\n",
" \n",
" # get data from api\n",
" url = f'https://api.openweathermap.org/data/2.5/forecast?lat={lat}&lon={lon}&units={units}&appid={api_key}'\n",
" url_text = requests.get(url).text \n",
" weather_dict = json.loads(url_text)\n",
" \n",
" # clean it up\n",
" row_list = list()\n",
" for d in weather_dict['list']:\n",
" # process dictionary into a row\n",
" \n",
" # lets \"flatten\" the main dictionary\n",
" for feat in ['clouds', 'wind', 'sys', 'main']:\n",
" d.update(d[feat])\n",
" del d[feat]\n",
" \n",
" # flattening \"weather\" is funny, its a list (of length 1) of dicts\n",
" d.update(d['weather'][0])\n",
" del d['weather']\n",
"\n",
" row_list.append(d)\n",
" \n",
" return pd.DataFrame(row_list)"
]
},
{
"cell_type": "code",
"execution_count": 80,
"id": "e2d2458c",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n", " | dt | \n", "visibility | \n", "pop | \n", "dt_txt | \n", "all | \n", "speed | \n", "deg | \n", "gust | \n", "pod | \n", "temp | \n", "... | \n", "pressure | \n", "sea_level | \n", "grnd_level | \n", "humidity | \n", "temp_kf | \n", "id | \n", "main | \n", "description | \n", "icon | \n", "rain | \n", "
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | \n", "1680274800 | \n", "10000 | \n", "0.00 | \n", "2023-03-31 15:00:00 | \n", "0 | \n", "5.64 | \n", "255 | \n", "10.49 | \n", "d | \n", "42.44 | \n", "... | \n", "1028 | \n", "1028 | \n", "1024 | \n", "36 | \n", "-0.39 | \n", "800 | \n", "Clear | \n", "clear sky | \n", "01d | \n", "NaN | \n", "
1 | \n", "1680285600 | \n", "10000 | \n", "0.00 | \n", "2023-03-31 18:00:00 | \n", "31 | \n", "6.42 | \n", "222 | \n", "12.33 | \n", "d | \n", "45.30 | \n", "... | \n", "1026 | \n", "1026 | \n", "1021 | \n", "33 | \n", "-3.19 | \n", "802 | \n", "Clouds | \n", "scattered clouds | \n", "03d | \n", "NaN | \n", "
2 | \n", "1680296400 | \n", "10000 | \n", "0.35 | \n", "2023-03-31 21:00:00 | \n", "67 | \n", "13.44 | \n", "196 | \n", "21.12 | \n", "d | \n", "43.30 | \n", "... | \n", "1023 | \n", "1023 | \n", "1019 | \n", "51 | \n", "-0.24 | \n", "500 | \n", "Rain | \n", "light rain | \n", "10d | \n", "{'3h': 0.1} | \n", "
3 | \n", "1680307200 | \n", "10000 | \n", "0.91 | \n", "2023-04-01 00:00:00 | \n", "100 | \n", "10.33 | \n", "168 | \n", "31.03 | \n", "n | \n", "40.30 | \n", "... | \n", "1019 | \n", "1019 | \n", "1017 | \n", "81 | \n", "0.00 | \n", "500 | \n", "Rain | \n", "light rain | \n", "10n | \n", "{'3h': 2.83} | \n", "
4 | \n", "1680318000 | \n", "10000 | \n", "1.00 | \n", "2023-04-01 03:00:00 | \n", "100 | \n", "11.41 | \n", "182 | \n", "34.87 | \n", "n | \n", "44.56 | \n", "... | \n", "1014 | \n", "1014 | \n", "1012 | \n", "93 | \n", "0.00 | \n", "501 | \n", "Rain | \n", "moderate rain | \n", "10n | \n", "{'3h': 4.21} | \n", "
5 | \n", "1680328800 | \n", "10000 | \n", "1.00 | \n", "2023-04-01 06:00:00 | \n", "100 | \n", "4.94 | \n", "235 | \n", "16.51 | \n", "n | \n", "46.24 | \n", "... | \n", "1011 | \n", "1011 | \n", "1009 | \n", "97 | \n", "0.00 | \n", "500 | \n", "Rain | \n", "light rain | \n", "10n | \n", "{'3h': 0.41} | \n", "
6 | \n", "1680339600 | \n", "10000 | \n", "0.00 | \n", "2023-04-01 09:00:00 | \n", "100 | \n", "2.57 | \n", "234 | \n", "8.03 | \n", "n | \n", "45.07 | \n", "... | \n", "1008 | \n", "1008 | \n", "1006 | \n", "98 | \n", "0.00 | \n", "804 | \n", "Clouds | \n", "overcast clouds | \n", "04n | \n", "NaN | \n", "
7 | \n", "1680350400 | \n", "787 | \n", "0.16 | \n", "2023-04-01 12:00:00 | \n", "100 | \n", "4.27 | \n", "171 | \n", "17.85 | \n", "d | \n", "46.47 | \n", "... | \n", "1005 | \n", "1005 | \n", "1003 | \n", "99 | \n", "0.00 | \n", "804 | \n", "Clouds | \n", "overcast clouds | \n", "04d | \n", "NaN | \n", "
8 | \n", "1680361200 | \n", "10000 | \n", "1.00 | \n", "2023-04-01 15:00:00 | \n", "100 | \n", "13.89 | \n", "208 | \n", "40.06 | \n", "d | \n", "51.55 | \n", "... | \n", "1000 | \n", "1000 | \n", "998 | \n", "96 | \n", "0.00 | \n", "501 | \n", "Rain | \n", "moderate rain | \n", "10d | \n", "{'3h': 5.22} | \n", "
9 | \n", "1680372000 | \n", "8290 | \n", "1.00 | \n", "2023-04-01 18:00:00 | \n", "100 | \n", "16.98 | \n", "215 | \n", "42.14 | \n", "d | \n", "55.00 | \n", "... | \n", "996 | \n", "996 | \n", "994 | \n", "93 | \n", "0.00 | \n", "500 | \n", "Rain | \n", "light rain | \n", "10d | \n", "{'3h': 1.98} | \n", "
10 | \n", "1680382800 | \n", "10000 | \n", "0.83 | \n", "2023-04-01 21:00:00 | \n", "98 | \n", "13.44 | \n", "217 | \n", "31.27 | \n", "d | \n", "57.15 | \n", "... | \n", "994 | \n", "994 | \n", "991 | \n", "88 | \n", "0.00 | \n", "500 | \n", "Rain | \n", "light rain | \n", "10d | \n", "{'3h': 0.42} | \n", "
11 | \n", "1680393600 | \n", "10000 | \n", "0.61 | \n", "2023-04-02 00:00:00 | \n", "77 | \n", "11.83 | \n", "199 | \n", "34.25 | \n", "n | \n", "52.90 | \n", "... | \n", "991 | \n", "991 | \n", "989 | \n", "94 | \n", "0.00 | \n", "803 | \n", "Clouds | \n", "broken clouds | \n", "04n | \n", "NaN | \n", "
12 | \n", "1680404400 | \n", "10000 | \n", "1.00 | \n", "2023-04-02 03:00:00 | \n", "100 | \n", "9.01 | \n", "248 | \n", "23.98 | \n", "n | \n", "50.83 | \n", "... | \n", "990 | \n", "990 | \n", "988 | \n", "85 | \n", "0.00 | \n", "501 | \n", "Rain | \n", "moderate rain | \n", "10n | \n", "{'3h': 5.28} | \n", "
13 | \n", "1680415200 | \n", "10000 | \n", "1.00 | \n", "2023-04-02 06:00:00 | \n", "100 | \n", "16.71 | \n", "275 | \n", "31.56 | \n", "n | \n", "47.62 | \n", "... | \n", "991 | \n", "991 | \n", "989 | \n", "80 | \n", "0.00 | \n", "500 | \n", "Rain | \n", "light rain | \n", "10n | \n", "{'3h': 0.88} | \n", "
14 | \n", "1680426000 | \n", "10000 | \n", "0.47 | \n", "2023-04-02 09:00:00 | \n", "95 | \n", "17.83 | \n", "292 | \n", "32.86 | \n", "n | \n", "43.54 | \n", "... | \n", "996 | \n", "996 | \n", "994 | \n", "76 | \n", "0.00 | \n", "500 | \n", "Rain | \n", "light rain | \n", "10n | \n", "{'3h': 0.29} | \n", "
15 | \n", "1680436800 | \n", "10000 | \n", "0.22 | \n", "2023-04-02 12:00:00 | \n", "67 | \n", "17.81 | \n", "316 | \n", "36.46 | \n", "d | \n", "36.52 | \n", "... | \n", "1004 | \n", "1004 | \n", "1002 | \n", "61 | \n", "0.00 | \n", "803 | \n", "Clouds | \n", "broken clouds | \n", "04d | \n", "NaN | \n", "
16 | \n", "1680447600 | \n", "10000 | \n", "0.00 | \n", "2023-04-02 15:00:00 | \n", "5 | \n", "19.30 | \n", "327 | \n", "29.57 | \n", "d | \n", "39.74 | \n", "... | \n", "1008 | \n", "1008 | \n", "1006 | \n", "31 | \n", "0.00 | \n", "800 | \n", "Clear | \n", "clear sky | \n", "01d | \n", "NaN | \n", "
17 | \n", "1680458400 | \n", "10000 | \n", "0.00 | \n", "2023-04-02 18:00:00 | \n", "3 | \n", "15.35 | \n", "333 | \n", "21.59 | \n", "d | \n", "43.23 | \n", "... | \n", "1012 | \n", "1012 | \n", "1010 | \n", "26 | \n", "0.00 | \n", "800 | \n", "Clear | \n", "clear sky | \n", "01d | \n", "NaN | \n", "
18 | \n", "1680469200 | \n", "10000 | \n", "0.00 | \n", "2023-04-02 21:00:00 | \n", "0 | \n", "12.68 | \n", "329 | \n", "17.29 | \n", "d | \n", "43.65 | \n", "... | \n", "1014 | \n", "1014 | \n", "1012 | \n", "28 | \n", "0.00 | \n", "800 | \n", "Clear | \n", "clear sky | \n", "01d | \n", "NaN | \n", "
19 | \n", "1680480000 | \n", "10000 | \n", "0.00 | \n", "2023-04-03 00:00:00 | \n", "0 | \n", "10.42 | \n", "332 | \n", "18.68 | \n", "n | \n", "38.93 | \n", "... | \n", "1018 | \n", "1018 | \n", "1015 | \n", "35 | \n", "0.00 | \n", "800 | \n", "Clear | \n", "clear sky | \n", "01n | \n", "NaN | \n", "
20 | \n", "1680490800 | \n", "10000 | \n", "0.00 | \n", "2023-04-03 03:00:00 | \n", "8 | \n", "7.63 | \n", "330 | \n", "13.27 | \n", "n | \n", "34.79 | \n", "... | \n", "1019 | \n", "1019 | \n", "1017 | \n", "40 | \n", "0.00 | \n", "800 | \n", "Clear | \n", "clear sky | \n", "01n | \n", "NaN | \n", "
21 | \n", "1680501600 | \n", "10000 | \n", "0.00 | \n", "2023-04-03 06:00:00 | \n", "8 | \n", "2.13 | \n", "305 | \n", "3.51 | \n", "n | \n", "33.30 | \n", "... | \n", "1020 | \n", "1020 | \n", "1018 | \n", "41 | \n", "0.00 | \n", "800 | \n", "Clear | \n", "clear sky | \n", "01n | \n", "NaN | \n", "
22 | \n", "1680512400 | \n", "10000 | \n", "0.00 | \n", "2023-04-03 09:00:00 | \n", "7 | \n", "4.03 | \n", "194 | \n", "7.29 | \n", "n | \n", "32.65 | \n", "... | \n", "1021 | \n", "1021 | \n", "1018 | \n", "46 | \n", "0.00 | \n", "800 | \n", "Clear | \n", "clear sky | \n", "01n | \n", "NaN | \n", "
23 | \n", "1680523200 | \n", "10000 | \n", "0.00 | \n", "2023-04-03 12:00:00 | \n", "11 | \n", "6.58 | \n", "207 | \n", "12.95 | \n", "d | \n", "36.05 | \n", "... | \n", "1022 | \n", "1022 | \n", "1019 | \n", "46 | \n", "0.00 | \n", "801 | \n", "Clouds | \n", "few clouds | \n", "02d | \n", "NaN | \n", "
24 | \n", "1680534000 | \n", "10000 | \n", "0.00 | \n", "2023-04-03 15:00:00 | \n", "100 | \n", "12.37 | \n", "212 | \n", "19.75 | \n", "d | \n", "45.81 | \n", "... | \n", "1019 | \n", "1019 | \n", "1017 | \n", "32 | \n", "0.00 | \n", "804 | \n", "Clouds | \n", "overcast clouds | \n", "04d | \n", "NaN | \n", "
25 | \n", "1680544800 | \n", "10000 | \n", "0.00 | \n", "2023-04-03 18:00:00 | \n", "99 | \n", "15.10 | \n", "211 | \n", "24.38 | \n", "d | \n", "53.42 | \n", "... | \n", "1016 | \n", "1016 | \n", "1013 | \n", "35 | \n", "0.00 | \n", "804 | \n", "Clouds | \n", "overcast clouds | \n", "04d | \n", "NaN | \n", "
26 | \n", "1680555600 | \n", "10000 | \n", "0.00 | \n", "2023-04-03 21:00:00 | \n", "100 | \n", "15.32 | \n", "206 | \n", "31.54 | \n", "d | \n", "52.43 | \n", "... | \n", "1013 | \n", "1013 | \n", "1011 | \n", "45 | \n", "0.00 | \n", "804 | \n", "Clouds | \n", "overcast clouds | \n", "04d | \n", "NaN | \n", "
27 | \n", "1680566400 | \n", "10000 | \n", "0.00 | \n", "2023-04-04 00:00:00 | \n", "99 | \n", "15.19 | \n", "215 | \n", "41.41 | \n", "n | \n", "48.43 | \n", "... | \n", "1013 | \n", "1013 | \n", "1011 | \n", "63 | \n", "0.00 | \n", "804 | \n", "Clouds | \n", "overcast clouds | \n", "04n | \n", "NaN | \n", "
28 | \n", "1680577200 | \n", "10000 | \n", "0.00 | \n", "2023-04-04 03:00:00 | \n", "100 | \n", "13.62 | \n", "220 | \n", "39.35 | \n", "n | \n", "48.81 | \n", "... | \n", "1013 | \n", "1013 | \n", "1010 | \n", "73 | \n", "0.00 | \n", "804 | \n", "Clouds | \n", "overcast clouds | \n", "04n | \n", "NaN | \n", "
29 | \n", "1680588000 | \n", "10000 | \n", "0.37 | \n", "2023-04-04 06:00:00 | \n", "100 | \n", "6.35 | \n", "267 | \n", "20.13 | \n", "n | \n", "48.18 | \n", "... | \n", "1014 | \n", "1014 | \n", "1011 | \n", "82 | \n", "0.00 | \n", "500 | \n", "Rain | \n", "light rain | \n", "10n | \n", "{'3h': 0.19} | \n", "
30 | \n", "1680598800 | \n", "10000 | \n", "0.89 | \n", "2023-04-04 09:00:00 | \n", "100 | \n", "4.09 | \n", "156 | \n", "6.04 | \n", "n | \n", "46.40 | \n", "... | \n", "1014 | \n", "1014 | \n", "1012 | \n", "94 | \n", "0.00 | \n", "500 | \n", "Rain | \n", "light rain | \n", "10n | \n", "{'3h': 1.38} | \n", "
31 | \n", "1680609600 | \n", "10000 | \n", "0.79 | \n", "2023-04-04 12:00:00 | \n", "100 | \n", "5.06 | \n", "188 | \n", "8.61 | \n", "d | \n", "47.64 | \n", "... | \n", "1015 | \n", "1015 | \n", "1013 | \n", "91 | \n", "0.00 | \n", "804 | \n", "Clouds | \n", "overcast clouds | \n", "04d | \n", "NaN | \n", "
32 | \n", "1680620400 | \n", "10000 | \n", "0.00 | \n", "2023-04-04 15:00:00 | \n", "75 | \n", "1.97 | \n", "291 | \n", "3.60 | \n", "d | \n", "56.52 | \n", "... | \n", "1016 | \n", "1016 | \n", "1014 | \n", "67 | \n", "0.00 | \n", "803 | \n", "Clouds | \n", "broken clouds | \n", "04d | \n", "NaN | \n", "
33 | \n", "1680631200 | \n", "10000 | \n", "0.00 | \n", "2023-04-04 18:00:00 | \n", "88 | \n", "2.44 | \n", "344 | \n", "7.87 | \n", "d | \n", "60.53 | \n", "... | \n", "1016 | \n", "1016 | \n", "1014 | \n", "53 | \n", "0.00 | \n", "804 | \n", "Clouds | \n", "overcast clouds | \n", "04d | \n", "NaN | \n", "
34 | \n", "1680642000 | \n", "10000 | \n", "0.00 | \n", "2023-04-04 21:00:00 | \n", "100 | \n", "3.29 | \n", "11 | \n", "8.34 | \n", "d | \n", "61.48 | \n", "... | \n", "1017 | \n", "1017 | \n", "1015 | \n", "52 | \n", "0.00 | \n", "804 | \n", "Clouds | \n", "overcast clouds | \n", "04d | \n", "NaN | \n", "
35 | \n", "1680652800 | \n", "10000 | \n", "0.00 | \n", "2023-04-05 00:00:00 | \n", "97 | \n", "3.80 | \n", "137 | \n", "5.21 | \n", "n | \n", "53.87 | \n", "... | \n", "1020 | \n", "1020 | \n", "1018 | \n", "73 | \n", "0.00 | \n", "804 | \n", "Clouds | \n", "overcast clouds | \n", "04n | \n", "NaN | \n", "
36 | \n", "1680663600 | \n", "10000 | \n", "0.00 | \n", "2023-04-05 03:00:00 | \n", "76 | \n", "1.52 | \n", "114 | \n", "1.99 | \n", "n | \n", "52.36 | \n", "... | \n", "1022 | \n", "1022 | \n", "1019 | \n", "79 | \n", "0.00 | \n", "803 | \n", "Clouds | \n", "broken clouds | \n", "04n | \n", "NaN | \n", "
37 | \n", "1680674400 | \n", "10000 | \n", "0.00 | \n", "2023-04-05 06:00:00 | \n", "83 | \n", "2.21 | \n", "133 | \n", "4.12 | \n", "n | \n", "50.27 | \n", "... | \n", "1022 | \n", "1022 | \n", "1020 | \n", "88 | \n", "0.00 | \n", "803 | \n", "Clouds | \n", "broken clouds | \n", "04n | \n", "NaN | \n", "
38 | \n", "1680685200 | \n", "10000 | \n", "0.00 | \n", "2023-04-05 09:00:00 | \n", "99 | \n", "3.49 | \n", "40 | \n", "4.27 | \n", "n | \n", "48.99 | \n", "... | \n", "1024 | \n", "1024 | \n", "1021 | \n", "91 | \n", "0.00 | \n", "804 | \n", "Clouds | \n", "overcast clouds | \n", "04n | \n", "NaN | \n", "
39 | \n", "1680696000 | \n", "10000 | \n", "0.00 | \n", "2023-04-05 12:00:00 | \n", "97 | \n", "4.47 | \n", "80 | \n", "7.72 | \n", "d | \n", "47.93 | \n", "... | \n", "1025 | \n", "1025 | \n", "1022 | \n", "91 | \n", "0.00 | \n", "804 | \n", "Clouds | \n", "overcast clouds | \n", "04d | \n", "NaN | \n", "
40 rows × 23 columns
\n", "\n", " | dt | \n", "visibility | \n", "pop | \n", "dt_txt | \n", "all | \n", "speed | \n", "deg | \n", "gust | \n", "pod | \n", "temp | \n", "... | \n", "temp_max | \n", "pressure | \n", "sea_level | \n", "grnd_level | \n", "humidity | \n", "temp_kf | \n", "id | \n", "main | \n", "description | \n", "icon | \n", "
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | \n", "1680264000 | \n", "10000 | \n", "0.00 | \n", "2023-03-31 12:00:00 | \n", "0 | \n", "4.79 | \n", "222 | \n", "7.87 | \n", "n | \n", "58.62 | \n", "... | \n", "60.04 | \n", "1017 | \n", "1017 | \n", "1016 | \n", "44 | \n", "-0.79 | \n", "800 | \n", "Clear | \n", "clear sky | \n", "01n | \n", "
1 | \n", "1680274800 | \n", "10000 | \n", "0.00 | \n", "2023-03-31 15:00:00 | \n", "11 | \n", "3.18 | \n", "211 | \n", "6.51 | \n", "n | \n", "58.23 | \n", "... | \n", "58.23 | \n", "1017 | \n", "1017 | \n", "1016 | \n", "52 | \n", "0.44 | \n", "801 | \n", "Clouds | \n", "few clouds | \n", "02n | \n", "
2 | \n", "1680285600 | \n", "10000 | \n", "0.00 | \n", "2023-03-31 18:00:00 | \n", "21 | \n", "1.72 | \n", "78 | \n", "2.37 | \n", "n | \n", "56.61 | \n", "... | \n", "56.61 | \n", "1017 | \n", "1017 | \n", "1015 | \n", "60 | \n", "0.56 | \n", "801 | \n", "Clouds | \n", "few clouds | \n", "02n | \n", "
3 | \n", "1680296400 | \n", "10000 | \n", "0.00 | \n", "2023-03-31 21:00:00 | \n", "4 | \n", "3.00 | \n", "58 | \n", "4.52 | \n", "d | \n", "53.69 | \n", "... | \n", "53.69 | \n", "1017 | \n", "1017 | \n", "1015 | \n", "65 | \n", "0.00 | \n", "800 | \n", "Clear | \n", "clear sky | \n", "01d | \n", "
4 | \n", "1680307200 | \n", "10000 | \n", "0.00 | \n", "2023-04-01 00:00:00 | \n", "2 | \n", "3.69 | \n", "50 | \n", "4.34 | \n", "d | \n", "61.18 | \n", "... | \n", "61.18 | \n", "1018 | \n", "1018 | \n", "1016 | \n", "48 | \n", "0.00 | \n", "800 | \n", "Clear | \n", "clear sky | \n", "01d | \n", "
5 | \n", "1680318000 | \n", "10000 | \n", "0.00 | \n", "2023-04-01 03:00:00 | \n", "4 | \n", "4.27 | \n", "21 | \n", "6.55 | \n", "d | \n", "70.41 | \n", "... | \n", "70.41 | \n", "1016 | \n", "1016 | \n", "1014 | \n", "24 | \n", "0.00 | \n", "800 | \n", "Clear | \n", "clear sky | \n", "01d | \n", "
6 | \n", "1680328800 | \n", "10000 | \n", "0.00 | \n", "2023-04-01 06:00:00 | \n", "15 | \n", "2.80 | \n", "346 | \n", "5.66 | \n", "d | \n", "73.67 | \n", "... | \n", "73.67 | \n", "1013 | \n", "1013 | \n", "1011 | \n", "18 | \n", "0.00 | \n", "801 | \n", "Clouds | \n", "few clouds | \n", "02d | \n", "
7 | \n", "1680339600 | \n", "10000 | \n", "0.00 | \n", "2023-04-01 09:00:00 | \n", "66 | \n", "10.29 | \n", "356 | \n", "13.22 | \n", "d | \n", "67.93 | \n", "... | \n", "67.93 | \n", "1014 | \n", "1014 | \n", "1012 | \n", "28 | \n", "0.00 | \n", "803 | \n", "Clouds | \n", "broken clouds | \n", "04d | \n", "
8 | \n", "1680350400 | \n", "10000 | \n", "0.00 | \n", "2023-04-01 12:00:00 | \n", "81 | \n", "8.90 | \n", "14 | \n", "13.04 | \n", "n | \n", "61.41 | \n", "... | \n", "61.41 | \n", "1016 | \n", "1016 | \n", "1014 | \n", "41 | \n", "0.00 | \n", "803 | \n", "Clouds | \n", "broken clouds | \n", "04n | \n", "
9 | \n", "1680361200 | \n", "10000 | \n", "0.00 | \n", "2023-04-01 15:00:00 | \n", "45 | \n", "7.72 | \n", "23 | \n", "12.24 | \n", "n | \n", "57.07 | \n", "... | \n", "57.07 | \n", "1016 | \n", "1016 | \n", "1014 | \n", "50 | \n", "0.00 | \n", "802 | \n", "Clouds | \n", "scattered clouds | \n", "03n | \n", "
10 | \n", "1680372000 | \n", "10000 | \n", "0.00 | \n", "2023-04-01 18:00:00 | \n", "27 | \n", "6.60 | \n", "26 | \n", "11.68 | \n", "n | \n", "54.52 | \n", "... | \n", "54.52 | \n", "1016 | \n", "1016 | \n", "1014 | \n", "51 | \n", "0.00 | \n", "802 | \n", "Clouds | \n", "scattered clouds | \n", "03n | \n", "
11 | \n", "1680382800 | \n", "10000 | \n", "0.00 | \n", "2023-04-01 21:00:00 | \n", "17 | \n", "5.30 | \n", "29 | \n", "10.80 | \n", "d | \n", "53.11 | \n", "... | \n", "53.11 | \n", "1017 | \n", "1017 | \n", "1015 | \n", "54 | \n", "0.00 | \n", "801 | \n", "Clouds | \n", "few clouds | \n", "02d | \n", "
12 | \n", "1680393600 | \n", "10000 | \n", "0.00 | \n", "2023-04-02 00:00:00 | \n", "9 | \n", "9.10 | \n", "45 | \n", "13.24 | \n", "d | \n", "61.88 | \n", "... | \n", "61.88 | \n", "1017 | \n", "1017 | \n", "1015 | \n", "54 | \n", "0.00 | \n", "800 | \n", "Clear | \n", "clear sky | \n", "01d | \n", "
13 | \n", "1680404400 | \n", "10000 | \n", "0.00 | \n", "2023-04-02 03:00:00 | \n", "7 | \n", "9.80 | \n", "38 | \n", "10.74 | \n", "d | \n", "70.75 | \n", "... | \n", "70.75 | \n", "1015 | \n", "1015 | \n", "1013 | \n", "36 | \n", "0.00 | \n", "800 | \n", "Clear | \n", "clear sky | \n", "01d | \n", "
14 | \n", "1680415200 | \n", "10000 | \n", "0.07 | \n", "2023-04-02 06:00:00 | \n", "16 | \n", "10.60 | \n", "18 | \n", "10.47 | \n", "d | \n", "73.06 | \n", "... | \n", "73.06 | \n", "1013 | \n", "1013 | \n", "1012 | \n", "27 | \n", "0.00 | \n", "801 | \n", "Clouds | \n", "few clouds | \n", "02d | \n", "
15 | \n", "1680426000 | \n", "10000 | \n", "0.15 | \n", "2023-04-02 09:00:00 | \n", "48 | \n", "13.47 | \n", "354 | \n", "16.75 | \n", "d | \n", "64.11 | \n", "... | \n", "64.11 | \n", "1016 | \n", "1016 | \n", "1014 | \n", "38 | \n", "0.00 | \n", "802 | \n", "Clouds | \n", "scattered clouds | \n", "03d | \n", "
16 | \n", "1680436800 | \n", "10000 | \n", "0.15 | \n", "2023-04-02 12:00:00 | \n", "26 | \n", "11.95 | \n", "3 | \n", "16.62 | \n", "n | \n", "57.18 | \n", "... | \n", "57.18 | \n", "1019 | \n", "1019 | \n", "1017 | \n", "45 | \n", "0.00 | \n", "802 | \n", "Clouds | \n", "scattered clouds | \n", "03n | \n", "
17 | \n", "1680447600 | \n", "10000 | \n", "0.00 | \n", "2023-04-02 15:00:00 | \n", "0 | \n", "9.57 | \n", "5 | \n", "14.14 | \n", "n | \n", "54.16 | \n", "... | \n", "54.16 | \n", "1019 | \n", "1019 | \n", "1017 | \n", "56 | \n", "0.00 | \n", "800 | \n", "Clear | \n", "clear sky | \n", "01n | \n", "
18 | \n", "1680458400 | \n", "10000 | \n", "0.01 | \n", "2023-04-02 18:00:00 | \n", "2 | \n", "8.05 | \n", "4 | \n", "12.71 | \n", "n | \n", "52.68 | \n", "... | \n", "52.68 | \n", "1019 | \n", "1019 | \n", "1017 | \n", "62 | \n", "0.00 | \n", "800 | \n", "Clear | \n", "clear sky | \n", "01n | \n", "
19 | \n", "1680469200 | \n", "10000 | \n", "0.01 | \n", "2023-04-02 21:00:00 | \n", "4 | \n", "6.49 | \n", "353 | \n", "9.82 | \n", "d | \n", "51.24 | \n", "... | \n", "51.24 | \n", "1021 | \n", "1021 | \n", "1019 | \n", "66 | \n", "0.00 | \n", "800 | \n", "Clear | \n", "clear sky | \n", "01d | \n", "
20 | \n", "1680480000 | \n", "10000 | \n", "0.01 | \n", "2023-04-03 00:00:00 | \n", "4 | \n", "6.40 | \n", "3 | \n", "7.90 | \n", "d | \n", "57.79 | \n", "... | \n", "57.79 | \n", "1023 | \n", "1023 | \n", "1021 | \n", "49 | \n", "0.00 | \n", "800 | \n", "Clear | \n", "clear sky | \n", "01d | \n", "
21 | \n", "1680490800 | \n", "10000 | \n", "0.11 | \n", "2023-04-03 03:00:00 | \n", "0 | \n", "4.25 | \n", "32 | \n", "7.45 | \n", "d | \n", "66.00 | \n", "... | \n", "66.00 | \n", "1022 | \n", "1022 | \n", "1020 | \n", "30 | \n", "0.00 | \n", "800 | \n", "Clear | \n", "clear sky | \n", "01d | \n", "
22 | \n", "1680501600 | \n", "10000 | \n", "0.07 | \n", "2023-04-03 06:00:00 | \n", "0 | \n", "5.08 | \n", "337 | \n", "6.35 | \n", "d | \n", "69.35 | \n", "... | \n", "69.35 | \n", "1021 | \n", "1021 | \n", "1019 | \n", "25 | \n", "0.00 | \n", "800 | \n", "Clear | \n", "clear sky | \n", "01d | \n", "
23 | \n", "1680512400 | \n", "10000 | \n", "0.00 | \n", "2023-04-03 09:00:00 | \n", "1 | \n", "6.20 | \n", "347 | \n", "7.90 | \n", "d | \n", "65.91 | \n", "... | \n", "65.91 | \n", "1022 | \n", "1022 | \n", "1020 | \n", "33 | \n", "0.00 | \n", "800 | \n", "Clear | \n", "clear sky | \n", "01d | \n", "
24 | \n", "1680523200 | \n", "10000 | \n", "0.00 | \n", "2023-04-03 12:00:00 | \n", "1 | \n", "5.19 | \n", "352 | \n", "9.15 | \n", "n | \n", "58.71 | \n", "... | \n", "58.71 | \n", "1025 | \n", "1025 | \n", "1023 | \n", "53 | \n", "0.00 | \n", "800 | \n", "Clear | \n", "clear sky | \n", "01n | \n", "
25 | \n", "1680534000 | \n", "10000 | \n", "0.00 | \n", "2023-04-03 15:00:00 | \n", "0 | \n", "1.92 | \n", "351 | \n", "3.13 | \n", "n | \n", "56.37 | \n", "... | \n", "56.37 | \n", "1026 | \n", "1026 | \n", "1024 | \n", "61 | \n", "0.00 | \n", "800 | \n", "Clear | \n", "clear sky | \n", "01n | \n", "
26 | \n", "1680544800 | \n", "10000 | \n", "0.00 | \n", "2023-04-03 18:00:00 | \n", "10 | \n", "2.80 | \n", "64 | \n", "3.89 | \n", "n | \n", "54.70 | \n", "... | \n", "54.70 | \n", "1026 | \n", "1026 | \n", "1024 | \n", "64 | \n", "0.00 | \n", "800 | \n", "Clear | \n", "clear sky | \n", "01n | \n", "
27 | \n", "1680555600 | \n", "10000 | \n", "0.00 | \n", "2023-04-03 21:00:00 | \n", "13 | \n", "3.09 | \n", "49 | \n", "4.56 | \n", "d | \n", "53.62 | \n", "... | \n", "53.62 | \n", "1026 | \n", "1026 | \n", "1024 | \n", "69 | \n", "0.00 | \n", "801 | \n", "Clouds | \n", "few clouds | \n", "02d | \n", "
28 | \n", "1680566400 | \n", "10000 | \n", "0.00 | \n", "2023-04-04 00:00:00 | \n", "8 | \n", "1.45 | \n", "165 | \n", "2.30 | \n", "d | \n", "60.08 | \n", "... | \n", "60.08 | \n", "1027 | \n", "1027 | \n", "1025 | \n", "58 | \n", "0.00 | \n", "800 | \n", "Clear | \n", "clear sky | \n", "01d | \n", "
29 | \n", "1680577200 | \n", "10000 | \n", "0.00 | \n", "2023-04-04 03:00:00 | \n", "71 | \n", "5.37 | \n", "237 | \n", "6.11 | \n", "d | \n", "65.08 | \n", "... | \n", "65.08 | \n", "1025 | \n", "1025 | \n", "1024 | \n", "44 | \n", "0.00 | \n", "803 | \n", "Clouds | \n", "broken clouds | \n", "04d | \n", "
30 | \n", "1680588000 | \n", "10000 | \n", "0.00 | \n", "2023-04-04 06:00:00 | \n", "85 | \n", "11.43 | \n", "249 | \n", "9.33 | \n", "d | \n", "65.32 | \n", "... | \n", "65.32 | \n", "1024 | \n", "1024 | \n", "1022 | \n", "46 | \n", "0.00 | \n", "804 | \n", "Clouds | \n", "overcast clouds | \n", "04d | \n", "
31 | \n", "1680598800 | \n", "10000 | \n", "0.00 | \n", "2023-04-04 09:00:00 | \n", "72 | \n", "11.56 | \n", "235 | \n", "15.57 | \n", "d | \n", "61.61 | \n", "... | \n", "61.61 | \n", "1024 | \n", "1024 | \n", "1022 | \n", "58 | \n", "0.00 | \n", "803 | \n", "Clouds | \n", "broken clouds | \n", "04d | \n", "
32 | \n", "1680609600 | \n", "10000 | \n", "0.00 | \n", "2023-04-04 12:00:00 | \n", "59 | \n", "8.68 | \n", "227 | \n", "13.60 | \n", "n | \n", "59.16 | \n", "... | \n", "59.16 | \n", "1026 | \n", "1026 | \n", "1024 | \n", "62 | \n", "0.00 | \n", "803 | \n", "Clouds | \n", "broken clouds | \n", "04n | \n", "
33 | \n", "1680620400 | \n", "10000 | \n", "0.00 | \n", "2023-04-04 15:00:00 | \n", "4 | \n", "3.22 | \n", "214 | \n", "5.59 | \n", "n | \n", "57.25 | \n", "... | \n", "57.25 | \n", "1025 | \n", "1025 | \n", "1023 | \n", "67 | \n", "0.00 | \n", "800 | \n", "Clear | \n", "clear sky | \n", "01n | \n", "
34 | \n", "1680631200 | \n", "10000 | \n", "0.00 | \n", "2023-04-04 18:00:00 | \n", "9 | \n", "2.73 | \n", "131 | \n", "3.51 | \n", "n | \n", "55.42 | \n", "... | \n", "55.42 | \n", "1024 | \n", "1024 | \n", "1022 | \n", "69 | \n", "0.00 | \n", "800 | \n", "Clear | \n", "clear sky | \n", "01n | \n", "
35 | \n", "1680642000 | \n", "10000 | \n", "0.00 | \n", "2023-04-04 21:00:00 | \n", "26 | \n", "4.03 | \n", "112 | \n", "5.10 | \n", "d | \n", "52.93 | \n", "... | \n", "52.93 | \n", "1024 | \n", "1024 | \n", "1022 | \n", "65 | \n", "0.00 | \n", "802 | \n", "Clouds | \n", "scattered clouds | \n", "03d | \n", "
36 | \n", "1680652800 | \n", "10000 | \n", "0.00 | \n", "2023-04-05 00:00:00 | \n", "53 | \n", "4.05 | \n", "99 | \n", "3.78 | \n", "d | \n", "59.20 | \n", "... | \n", "59.20 | \n", "1024 | \n", "1024 | \n", "1022 | \n", "48 | \n", "0.00 | \n", "803 | \n", "Clouds | \n", "broken clouds | \n", "04d | \n", "
37 | \n", "1680663600 | \n", "10000 | \n", "0.00 | \n", "2023-04-05 03:00:00 | \n", "100 | \n", "1.21 | \n", "201 | \n", "6.96 | \n", "d | \n", "66.20 | \n", "... | \n", "66.20 | \n", "1021 | \n", "1021 | \n", "1019 | \n", "35 | \n", "0.00 | \n", "804 | \n", "Clouds | \n", "overcast clouds | \n", "04d | \n", "
38 | \n", "1680674400 | \n", "10000 | \n", "0.00 | \n", "2023-04-05 06:00:00 | \n", "100 | \n", "11.48 | \n", "243 | \n", "13.69 | \n", "d | \n", "68.07 | \n", "... | \n", "68.07 | \n", "1019 | \n", "1019 | \n", "1017 | \n", "44 | \n", "0.00 | \n", "804 | \n", "Clouds | \n", "overcast clouds | \n", "04d | \n", "
39 | \n", "1680685200 | \n", "10000 | \n", "0.00 | \n", "2023-04-05 09:00:00 | \n", "98 | \n", "12.97 | \n", "225 | \n", "19.28 | \n", "d | \n", "64.53 | \n", "... | \n", "64.53 | \n", "1019 | \n", "1019 | \n", "1017 | \n", "50 | \n", "0.00 | \n", "804 | \n", "Clouds | \n", "overcast clouds | \n", "04d | \n", "
40 rows × 22 columns
\n", "