{
"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": 7,
"id": "5adc58fc",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"datetime.datetime(2021, 2, 14, 2, 0)"
]
},
"execution_count": 7,
"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": 8,
"id": "94556cf9",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(2, 14)"
]
},
"execution_count": 8,
"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": 16,
"id": "faf7f937",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"datetime.datetime(2023, 3, 31, 13, 53, 17, 396351)"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dt1 = datetime.now()\n",
"dt1"
]
},
{
"cell_type": "code",
"execution_count": 18,
"id": "3ee738bf",
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"text/plain": [
"datetime.datetime(2222, 2, 2, 2, 0)"
]
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dt2 = datetime(year=2222, month=2, day=2, hour=2)\n",
"dt2"
]
},
{
"cell_type": "code",
"execution_count": 19,
"id": "87f7c545",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"datetime.timedelta(days=72625, seconds=43602, microseconds=603649)"
]
},
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# time delta measure differences between two datetimes:\n",
"dt2 - dt1"
]
},
{
"cell_type": "code",
"execution_count": 20,
"id": "d924614d",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"datetime.timedelta(days=3, seconds=37056)"
]
},
"execution_count": 20,
"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": 21,
"id": "e2e6b617",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"datetime.datetime(2222, 2, 5, 12, 17, 36)"
]
},
"execution_count": 21,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# and operate with them (datetime + timedelta = datetime)\n",
"dt2 + offset"
]
},
{
"cell_type": "code",
"execution_count": 22,
"id": "12d15e2f",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"733586113.423551"
]
},
"execution_count": 22,
"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": 23,
"id": "0de30b1c",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"31.70958904109589"
]
},
"execution_count": 23,
"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": 24,
"id": "91dea7a1",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"datetime.datetime(2031, 9, 9, 1, 46, 40)"
]
},
"execution_count": 24,
"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": 28,
"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 reallaodsapisudhfaoidsufaoidsy a time\n",
"dtype: object"
]
},
"execution_count": 28,
"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 reallaodsapisudhfaoidsufaoidsy a time'])\n",
"\n",
"s"
]
},
{
"cell_type": "code",
"execution_count": 30,
"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": 30,
"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": 33,
"id": "c2377013",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"2"
]
},
"execution_count": 33,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"red_branch_dict = {'a': 0, 'b': 1, 'c': 2}\n",
"red_branch_dict['c']"
]
},
{
"cell_type": "code",
"execution_count": 34,
"id": "a917657b",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"{'f': {'a': 0, 'b': 1, 'c': 2}, 'g': {'x': 24, 'y': 25, 'z': 26}}"
]
},
"execution_count": 34,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"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": 36,
"id": "f131240a",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"1"
]
},
"execution_count": 36,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"tree_dict['f']['b']"
]
},
{
"cell_type": "markdown",
"id": "4f999d34",
"metadata": {},
"source": [
"
"
]
},
{
"cell_type": "code",
"execution_count": 39,
"id": "30bc8a31",
"metadata": {},
"outputs": [],
"source": [
"dict0 = {'num': 14,\n",
" 'letter': 'C'}\n",
"dict1 = {'num': 17,\n",
" 'letter': 'R'}\n",
"dict2 = {'num': 21,\n",
" 'letter': {'a': 10, 'b': 3}}\n",
"\n",
"dict_of_dict = {0: dict0,\n",
" 1: dict1,\n",
" 2: dict2}"
]
},
{
"cell_type": "code",
"execution_count": 42,
"id": "4493f8d9",
"metadata": {},
"outputs": [],
"source": [
"list_of_dict = [dict0, dict1, dict2]"
]
},
{
"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": 47,
"id": "0f832da2",
"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]"
]
},
{
"cell_type": "code",
"execution_count": 49,
"id": "9adc4397",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[{'height': [2, 3, 2], 'weight': [4, 6, 5]},\n",
" {'height': [4, 6, 5], 'weight': [2, 3, 2]},\n",
" {'height': [10, 7, 8], 'weight': [11, 6, 5]}]"
]
},
"execution_count": 49,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"peng_data"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "280921d4",
"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": 50,
"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": 51,
"id": "1d51a6ed",
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"text/plain": [
"'{\"cod\":\"200\",\"message\":0,\"cnt\":40,\"list\":[{\"dt\":1680296400,\"main\":{\"temp\":49.35,\"feels_like\":44.55,\"temp_min\":46.42,\"temp_max\":49.35,\"pressure\":1022,\"sea_level\":1022,\"grnd_level\":1020,\"humidity\":38,\"temp_kf\":1.63},\"weather\":[{\"id\":803,\"main\":\"Clouds\",\"description\":\"broken clouds\",\"icon\":\"04d\"}],\"clouds\":{\"all\":83},\"wind\":{\"speed\":12.24,\"deg\":190,\"gust\":19.26},\"visibility\":10000,\"pop\":0.02,\"sys\":{\"pod\":\"d\"},\"dt_txt\":\"2023-03-31 21:00:00\"},{\"dt\":1680307200,\"main\":{\"temp\":42.69,\"feels_like\":37.06,\"temp_min\":38.62,\"temp_max\":42.69,\"pressure\":1020,\"sea_level\":1020,\"grnd_level\":1019,\"humidity\":68,\"temp_kf\":2.26},\"weather\":[{\"id\":500,\"main\":\"Rain\",\"description\":\"light rain\",\"icon\":\"10n\"}],\"clouds\":{\"all\":91},\"wind\":{\"speed\":9.82,\"deg\":160,\"gust\":26.66},\"visibility\":6644,\"pop\":0.92,\"rain\":{\"3h\":2.47},\"sys\":{\"pod\":\"n\"},\"dt_txt\":\"2023-04-01 00:00:00\"},{\"dt\":1680318000,\"main\":{\"temp\":41.52,\"feels_like\":36.28,\"temp_min\":41.52,\"temp_max\":41.52,\"pressure\":1015,\"sea_level\":1015,\"grnd_level\":1015,\"humidity\":94,\"temp_kf\":0},\"weather\":[{\"id\":501,\"main\":\"Rain\",\"description\":\"moderate rain\",\"icon\":\"10n\"}],\"clouds\":{\"all\":100},\"wind\":{\"speed\":8.32,\"deg\":152,\"gust\":25.01},\"visibility\":10000,\"pop\":1,\"rain\":{\"3h\":5.55},\"sys\":{\"pod\":\"n\"},\"dt_txt\":\"2023-04-01 03:00:00\"},{\"dt\":1680328800,\"main\":{\"temp\":43.05,\"feels_like\":43.05,\"temp_min\":43.05,\"temp_max\":43.05,\"pressure\":1011,\"sea_level\":1011,\"grnd_level\":1011,\"humidity\":99,\"temp_kf\":0},\"weather\":[{\"id\":500,\"main\":\"Rain\",\"description\":\"light rain\",\"icon\":\"10n\"}],\"clouds\":{\"all\":100},\"wind\":{\"speed\":1.86,\"deg\":260,\"gust\":7.43},\"visibility\":10000,\"pop\":1,\"rain\":{\"3h\":1.45},\"sys\":{\"pod\":\"n\"},\"dt_txt\":\"2023-04-01 06:00:00\"},{\"dt\":1680339600,\"main\":{\"temp\":42.21,\"feels_like\":42.21,\"temp_min\":42.21,\"temp_max\":42.21,\"pressure\":1008,\"sea_level\":1008,\"grnd_level\":1008,\"humidity\":98,\"temp_kf\":0},\"weather\":[{\"id\":804,\"main\":\"Clouds\",\"description\":\"overcast clouds\",\"icon\":\"04n\"}],\"clouds\":{\"all\":100},\"wind\":{\"speed\":1.28,\"deg\":280,\"gust\":3.09},\"visibility\":7999,\"pop\":0.25,\"sys\":{\"pod\":\"n\"},\"dt_txt\":\"2023-04-01 09:00:00\"},{\"dt\":1680350400,\"main\":{\"temp\":44.31,\"feels_like\":42.04,\"temp_min\":44.31,\"temp_max\":44.31,\"pressure\":1003,\"sea_level\":1003,\"grnd_level\":1003,\"humidity\":99,\"temp_kf\":0},\"weather\":[{\"id\":500,\"main\":\"Rain\",\"description\":\"light rain\",\"icon\":\"10d\"}],\"clouds\":{\"all\":100},\"wind\":{\"speed\":4.32,\"deg\":140,\"gust\":15.05},\"visibility\":742,\"pop\":1,\"rain\":{\"3h\":1.61},\"sys\":{\"pod\":\"d\"},\"dt_txt\":\"2023-04-01 12:00:00\"},{\"dt\":1680361200,\"main\":{\"temp\":50.61,\"feels_like\":49.93,\"temp_min\":50.61,\"temp_max\":50.61,\"pressure\":1000,\"sea_level\":1000,\"grnd_level\":999,\"humidity\":97,\"temp_kf\":0},\"weather\":[{\"id\":501,\"main\":\"Rain\",\"description\":\"moderate rain\",\"icon\":\"10d\"}],\"clouds\":{\"all\":100},\"wind\":{\"speed\":9.89,\"deg\":212,\"gust\":33.22},\"visibility\":10000,\"pop\":1,\"rain\":{\"3h\":3.45},\"sys\":{\"pod\":\"d\"},\"dt_txt\":\"2023-04-01 15:00:00\"},{\"dt\":1680372000,\"main\":{\"temp\":56.84,\"feels_like\":56.5,\"temp_min\":56.84,\"temp_max\":56.84,\"pressure\":996,\"sea_level\":996,\"grnd_level\":995,\"humidity\":91,\"temp_kf\":0},\"weather\":[{\"id\":500,\"main\":\"Rain\",\"description\":\"light rain\",\"icon\":\"10d\"}],\"clouds\":{\"all\":100},\"wind\":{\"speed\":16.17,\"deg\":218,\"gust\":38.83},\"visibility\":10000,\"pop\":1,\"rain\":{\"3h\":0.47},\"sys\":{\"pod\":\"d\"},\"dt_txt\":\"2023-04-01 18:00:00\"},{\"dt\":1680382800,\"main\":{\"temp\":56.89,\"feels_like\":56.55,\"temp_min\":56.89,\"temp_max\":56.89,\"pressure\":993,\"sea_level\":993,\"grnd_level\":993,\"humidity\":91,\"temp_kf\":0},\"weather\":[{\"id\":500,\"main\":\"Rain\",\"description\":\"light rain\",\"icon\":\"10d\"}],\"clouds\":{\"all\":99},\"wind\":{\"speed\":11.77,\"deg\":212,\"gust\":27.29},\"visibility\":10000,\"pop\":0.64,\"rain\":{\"3h\":0.37},\"sys\":{\"pod\":\"d\"},\"dt_txt\":\"2023-04-01 21:00:00\"},{\"dt\":1680393600,\"main\":{\"temp\":53.47,\"feels_like\":52.99,\"temp_min\":53.47,\"temp_max\":53.47,\"pressure\":992,\"sea_level\":992,\"grnd_level\":991,\"humidity\":95,\"temp_kf\":0},\"weather\":[{\"id\":803,\"main\":\"Clouds\",\"description\":\"broken clouds\",\"icon\":\"04n\"}],\"clouds\":{\"all\":75},\"wind\":{\"speed\":9.84,\"deg\":202,\"gust\":27.67},\"visibility\":10000,\"pop\":0.53,\"sys\":{\"pod\":\"n\"},\"dt_txt\":\"2023-04-02 00:00:00\"},{\"dt\":1680404400,\"main\":{\"temp\":52.09,\"feels_like\":51.37,\"temp_min\":52.09,\"temp_max\":52.09,\"pressure\":990,\"sea_level\":990,\"grnd_level\":989,\"humidity\":93,\"temp_kf\":0},\"weather\":[{\"id\":500,\"main\":\"Rain\",\"description\":\"light rain\",\"icon\":\"10n\"}],\"clouds\":{\"all\":92},\"wind\":{\"speed\":7.87,\"deg\":275,\"gust\":20.29},\"visibility\":10000,\"pop\":0.97,\"rain\":{\"3h\":2.43},\"sys\":{\"pod\":\"n\"},\"dt_txt\":\"2023-04-02 03:00:00\"},{\"dt\":1680415200,\"main\":{\"temp\":49.12,\"feels_like\":43.63,\"temp_min\":49.12,\"temp_max\":49.12,\"pressure\":990,\"sea_level\":990,\"grnd_level\":990,\"humidity\":81,\"temp_kf\":0},\"weather\":[{\"id\":500,\"main\":\"Rain\",\"description\":\"light rain\",\"icon\":\"10n\"}],\"clouds\":{\"all\":96},\"wind\":{\"speed\":14.56,\"deg\":283,\"gust\":30.04},\"visibility\":10000,\"pop\":1,\"rain\":{\"3h\":1.06},\"sys\":{\"pod\":\"n\"},\"dt_txt\":\"2023-04-02 06:00:00\"},{\"dt\":1680426000,\"main\":{\"temp\":45.54,\"feels_like\":38.46,\"temp_min\":45.54,\"temp_max\":45.54,\"pressure\":995,\"sea_level\":995,\"grnd_level\":995,\"humidity\":74,\"temp_kf\":0},\"weather\":[{\"id\":804,\"main\":\"Clouds\",\"description\":\"overcast clouds\",\"icon\":\"04n\"}],\"clouds\":{\"all\":98},\"wind\":{\"speed\":16.84,\"deg\":310,\"gust\":33.69},\"visibility\":10000,\"pop\":0.24,\"sys\":{\"pod\":\"n\"},\"dt_txt\":\"2023-04-02 09:00:00\"},{\"dt\":1680436800,\"main\":{\"temp\":38.35,\"feels_like\":29.32,\"temp_min\":38.35,\"temp_max\":38.35,\"pressure\":1003,\"sea_level\":1003,\"grnd_level\":1003,\"humidity\":63,\"temp_kf\":0},\"weather\":[{\"id\":803,\"main\":\"Clouds\",\"description\":\"broken clouds\",\"icon\":\"04d\"}],\"clouds\":{\"all\":57},\"wind\":{\"speed\":16.35,\"deg\":312,\"gust\":34.72},\"visibility\":10000,\"pop\":0.13,\"sys\":{\"pod\":\"d\"},\"dt_txt\":\"2023-04-02 12:00:00\"},{\"dt\":1680447600,\"main\":{\"temp\":39.78,\"feels_like\":30.56,\"temp_min\":39.78,\"temp_max\":39.78,\"pressure\":1008,\"sea_level\":1008,\"grnd_level\":1007,\"humidity\":35,\"temp_kf\":0},\"weather\":[{\"id\":800,\"main\":\"Clear\",\"description\":\"clear sky\",\"icon\":\"01d\"}],\"clouds\":{\"all\":5},\"wind\":{\"speed\":18.52,\"deg\":327,\"gust\":29.51},\"visibility\":10000,\"pop\":0,\"sys\":{\"pod\":\"d\"},\"dt_txt\":\"2023-04-02 15:00:00\"},{\"dt\":1680458400,\"main\":{\"temp\":42.89,\"feels_like\":35.4,\"temp_min\":42.89,\"temp_max\":42.89,\"pressure\":1011,\"sea_level\":1011,\"grnd_level\":1011,\"humidity\":28,\"temp_kf\":0},\"weather\":[{\"id\":800,\"main\":\"Clear\",\"description\":\"clear sky\",\"icon\":\"01d\"}],\"clouds\":{\"all\":3},\"wind\":{\"speed\":15.46,\"deg\":329,\"gust\":22.39},\"visibility\":10000,\"pop\":0,\"sys\":{\"pod\":\"d\"},\"dt_txt\":\"2023-04-02 18:00:00\"},{\"dt\":1680469200,\"main\":{\"temp\":42.84,\"feels_like\":36.01,\"temp_min\":42.84,\"temp_max\":42.84,\"pressure\":1014,\"sea_level\":1014,\"grnd_level\":1013,\"humidity\":30,\"temp_kf\":0},\"weather\":[{\"id\":800,\"main\":\"Clear\",\"description\":\"clear sky\",\"icon\":\"01d\"}],\"clouds\":{\"all\":0},\"wind\":{\"speed\":13.2,\"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.81,\"feels_like\":30.69,\"temp_min\":37.81,\"temp_max\":37.81,\"pressure\":1018,\"sea_level\":1018,\"grnd_level\":1017,\"humidity\":37,\"temp_kf\":0},\"weather\":[{\"id\":800,\"main\":\"Clear\",\"description\":\"clear sky\",\"icon\":\"01n\"}],\"clouds\":{\"all\":0},\"wind\":{\"speed\":10.56,\"deg\":326,\"gust\":20.27},\"visibility\":10000,\"pop\":0,\"sys\":{\"pod\":\"n\"},\"dt_txt\":\"2023-04-03 00:00:00\"},{\"dt\":1680490800,\"main\":{\"temp\":34.27,\"feels_like\":27.72,\"temp_min\":34.27,\"temp_max\":34.27,\"pressure\":1019,\"sea_level\":1019,\"grnd_level\":1019,\"humidity\":38,\"temp_kf\":0},\"weather\":[{\"id\":800,\"main\":\"Clear\",\"description\":\"clear sky\",\"icon\":\"01n\"}],\"clouds\":{\"all\":7},\"wind\":{\"speed\":7.81,\"deg\":332,\"gust\":18.66},\"visibility\":10000,\"pop\":0,\"sys\":{\"pod\":\"n\"},\"dt_txt\":\"2023-04-03 03:00:00\"},{\"dt\":1680501600,\"main\":{\"temp\":32.79,\"feels_like\":29.97,\"temp_min\":32.79,\"temp_max\":32.79,\"pressure\":1020,\"sea_level\":1020,\"grnd_level\":1019,\"humidity\":38,\"temp_kf\":0},\"weather\":[{\"id\":800,\"main\":\"Clear\",\"description\":\"clear sky\",\"icon\":\"01n\"}],\"clouds\":{\"all\":8},\"wind\":{\"speed\":3.18,\"deg\":313,\"gust\":6.35},\"visibility\":10000,\"pop\":0,\"sys\":{\"pod\":\"n\"},\"dt_txt\":\"2023-04-03 06:00:00\"},{\"dt\":1680512400,\"main\":{\"temp\":32.43,\"feels_like\":29.48,\"temp_min\":32.43,\"temp_max\":32.43,\"pressure\":1021,\"sea_level\":1021,\"grnd_level\":1020,\"humidity\":41,\"temp_kf\":0},\"weather\":[{\"id\":800,\"main\":\"Clear\",\"description\":\"clear sky\",\"icon\":\"01n\"}],\"clouds\":{\"all\":9},\"wind\":{\"speed\":3.24,\"deg\":190,\"gust\":5.97},\"visibility\":10000,\"pop\":0,\"sys\":{\"pod\":\"n\"},\"dt_txt\":\"2023-04-03 09:00:00\"},{\"dt\":1680523200,\"main\":{\"temp\":35.71,\"feels_like\":29.8,\"temp_min\":35.71,\"temp_max\":35.71,\"pressure\":1022,\"sea_level\":1022,\"grnd_level\":1021,\"humidity\":44,\"temp_kf\":0},\"weather\":[{\"id\":801,\"main\":\"Clouds\",\"description\":\"few clouds\",\"icon\":\"02d\"}],\"clouds\":{\"all\":12},\"wind\":{\"speed\":7.25,\"deg\":202,\"gust\":15.46},\"visibility\":10000,\"pop\":0,\"sys\":{\"pod\":\"d\"},\"dt_txt\":\"2023-04-03 12:00:00\"},{\"dt\":1680534000,\"main\":{\"temp\":46.6,\"feels_like\":41.43,\"temp_min\":46.6,\"temp_max\":46.6,\"pressure\":1019,\"sea_level\":1019,\"grnd_level\":1019,\"humidity\":35,\"temp_kf\":0},\"weather\":[{\"id\":803,\"main\":\"Clouds\",\"description\":\"broken clouds\",\"icon\":\"04d\"}],\"clouds\":{\"all\":84},\"wind\":{\"speed\":11.1,\"deg\":208,\"gust\":17.92},\"visibility\":10000,\"pop\":0,\"sys\":{\"pod\":\"d\"},\"dt_txt\":\"2023-04-03 15:00:00\"},{\"dt\":1680544800,\"main\":{\"temp\":54.01,\"feels_like\":50.61,\"temp_min\":54.01,\"temp_max\":54.01,\"pressure\":1016,\"sea_level\":1016,\"grnd_level\":1015,\"humidity\":32,\"temp_kf\":0},\"weather\":[{\"id\":804,\"main\":\"Clouds\",\"description\":\"overcast clouds\",\"icon\":\"04d\"}],\"clouds\":{\"all\":91},\"wind\":{\"speed\":14.76,\"deg\":211,\"gust\":24.83},\"visibility\":10000,\"pop\":0,\"sys\":{\"pod\":\"d\"},\"dt_txt\":\"2023-04-03 18:00:00\"},{\"dt\":1680555600,\"main\":{\"temp\":52.66,\"feels_like\":49.55,\"temp_min\":52.66,\"temp_max\":52.66,\"pressure\":1013,\"sea_level\":1013,\"grnd_level\":1012,\"humidity\":41,\"temp_kf\":0},\"weather\":[{\"id\":804,\"main\":\"Clouds\",\"description\":\"overcast clouds\",\"icon\":\"04d\"}],\"clouds\":{\"all\":100},\"wind\":{\"speed\":14.79,\"deg\":209,\"gust\":32.48},\"visibility\":10000,\"pop\":0,\"sys\":{\"pod\":\"d\"},\"dt_txt\":\"2023-04-03 21:00:00\"},{\"dt\":1680566400,\"main\":{\"temp\":49.08,\"feels_like\":43.61,\"temp_min\":49.08,\"temp_max\":49.08,\"pressure\":1012,\"sea_level\":1012,\"grnd_level\":1012,\"humidity\":59,\"temp_kf\":0},\"weather\":[{\"id\":804,\"main\":\"Clouds\",\"description\":\"overcast clouds\",\"icon\":\"04n\"}],\"clouds\":{\"all\":90},\"wind\":{\"speed\":14.45,\"deg\":214,\"gust\":39.86},\"visibility\":10000,\"pop\":0,\"sys\":{\"pod\":\"n\"},\"dt_txt\":\"2023-04-04 00:00:00\"},{\"dt\":1680577200,\"main\":{\"temp\":48.43,\"feels_like\":44.82,\"temp_min\":48.43,\"temp_max\":48.43,\"pressure\":1014,\"sea_level\":1014,\"grnd_level\":1014,\"humidity\":74,\"temp_kf\":0},\"weather\":[{\"id\":804,\"main\":\"Clouds\",\"description\":\"overcast clouds\",\"icon\":\"04n\"}],\"clouds\":{\"all\":94},\"wind\":{\"speed\":8.1,\"deg\":265,\"gust\":22.64},\"visibility\":10000,\"pop\":0.2,\"sys\":{\"pod\":\"n\"},\"dt_txt\":\"2023-04-04 03:00:00\"},{\"dt\":1680588000,\"main\":{\"temp\":46.44,\"feels_like\":46.44,\"temp_min\":46.44,\"temp_max\":46.44,\"pressure\":1015,\"sea_level\":1015,\"grnd_level\":1014,\"humidity\":87,\"temp_kf\":0},\"weather\":[{\"id\":500,\"main\":\"Rain\",\"description\":\"light rain\",\"icon\":\"10n\"}],\"clouds\":{\"all\":97},\"wind\":{\"speed\":2.73,\"deg\":197,\"gust\":4.18},\"visibility\":10000,\"pop\":0.49,\"rain\":{\"3h\":0.51},\"sys\":{\"pod\":\"n\"},\"dt_txt\":\"2023-04-04 06:00:00\"},{\"dt\":1680598800,\"main\":{\"temp\":46.38,\"feels_like\":44.44,\"temp_min\":46.38,\"temp_max\":46.38,\"pressure\":1014,\"sea_level\":1014,\"grnd_level\":1014,\"humidity\":87,\"temp_kf\":0},\"weather\":[{\"id\":500,\"main\":\"Rain\",\"description\":\"light rain\",\"icon\":\"10n\"}],\"clouds\":{\"all\":100},\"wind\":{\"speed\":4.34,\"deg\":195,\"gust\":10.16},\"visibility\":10000,\"pop\":0.3,\"rain\":{\"3h\":0.1},\"sys\":{\"pod\":\"n\"},\"dt_txt\":\"2023-04-04 09:00:00\"},{\"dt\":1680609600,\"main\":{\"temp\":47.7,\"feels_like\":46.6,\"temp_min\":47.7,\"temp_max\":47.7,\"pressure\":1016,\"sea_level\":1016,\"grnd_level\":1015,\"humidity\":86,\"temp_kf\":0},\"weather\":[{\"id\":804,\"main\":\"Clouds\",\"description\":\"overcast clouds\",\"icon\":\"04d\"}],\"clouds\":{\"all\":100},\"wind\":{\"speed\":3.51,\"deg\":210,\"gust\":6.85},\"visibility\":10000,\"pop\":0.11,\"sys\":{\"pod\":\"d\"},\"dt_txt\":\"2023-04-04 12:00:00\"},{\"dt\":1680620400,\"main\":{\"temp\":55.44,\"feels_like\":53.87,\"temp_min\":55.44,\"temp_max\":55.44,\"pressure\":1016,\"sea_level\":1016,\"grnd_level\":1016,\"humidity\":68,\"temp_kf\":0},\"weather\":[{\"id\":804,\"main\":\"Clouds\",\"description\":\"overcast clouds\",\"icon\":\"04d\"}],\"clouds\":{\"all\":100},\"wind\":{\"speed\":2.33,\"deg\":230,\"gust\":4.14},\"visibility\":10000,\"pop\":0,\"sys\":{\"pod\":\"d\"},\"dt_txt\":\"2023-04-04 15:00:00\"},{\"dt\":1680631200,\"main\":{\"temp\":58.42,\"feels_like\":56.93,\"temp_min\":58.42,\"temp_max\":58.42,\"pressure\":1016,\"sea_level\":1016,\"grnd_level\":1016,\"humidity\":63,\"temp_kf\":0},\"weather\":[{\"id\":804,\"main\":\"Clouds\",\"description\":\"overcast clouds\",\"icon\":\"04d\"}],\"clouds\":{\"all\":100},\"wind\":{\"speed\":2.15,\"deg\":90,\"gust\":2.28},\"visibility\":10000,\"pop\":0.08,\"sys\":{\"pod\":\"d\"},\"dt_txt\":\"2023-04-04 18:00:00\"},{\"dt\":1680642000,\"main\":{\"temp\":56.84,\"feels_like\":55.47,\"temp_min\":56.84,\"temp_max\":56.84,\"pressure\":1018,\"sea_level\":1018,\"grnd_level\":1018,\"humidity\":69,\"temp_kf\":0},\"weather\":[{\"id\":804,\"main\":\"Clouds\",\"description\":\"overcast clouds\",\"icon\":\"04d\"}],\"clouds\":{\"all\":100},\"wind\":{\"speed\":5.44,\"deg\":67,\"gust\":6.91},\"visibility\":10000,\"pop\":0,\"sys\":{\"pod\":\"d\"},\"dt_txt\":\"2023-04-04 21:00:00\"},{\"dt\":1680652800,\"main\":{\"temp\":51.75,\"feels_like\":50.29,\"temp_min\":51.75,\"temp_max\":51.75,\"pressure\":1021,\"sea_level\":1021,\"grnd_level\":1020,\"humidity\":78,\"temp_kf\":0},\"weather\":[{\"id\":804,\"main\":\"Clouds\",\"description\":\"overcast clouds\",\"icon\":\"04n\"}],\"clouds\":{\"all\":100},\"wind\":{\"speed\":4.68,\"deg\":104,\"gust\":8.59},\"visibility\":10000,\"pop\":0,\"sys\":{\"pod\":\"n\"},\"dt_txt\":\"2023-04-05 00:00:00\"},{\"dt\":1680663600,\"main\":{\"temp\":50.2,\"feels_like\":48.72,\"temp_min\":50.2,\"temp_max\":50.2,\"pressure\":1022,\"sea_level\":1022,\"grnd_level\":1022,\"humidity\":81,\"temp_kf\":0},\"weather\":[{\"id\":804,\"main\":\"Clouds\",\"description\":\"overcast clouds\",\"icon\":\"04n\"}],\"clouds\":{\"all\":99},\"wind\":{\"speed\":3.42,\"deg\":110,\"gust\":6.67},\"visibility\":10000,\"pop\":0,\"sys\":{\"pod\":\"n\"},\"dt_txt\":\"2023-04-05 03:00:00\"},{\"dt\":1680674400,\"main\":{\"temp\":49.17,\"feels_like\":48.13,\"temp_min\":49.17,\"temp_max\":49.17,\"pressure\":1022,\"sea_level\":1022,\"grnd_level\":1022,\"humidity\":87,\"temp_kf\":0},\"weather\":[{\"id\":804,\"main\":\"Clouds\",\"description\":\"overcast clouds\",\"icon\":\"04n\"}],\"clouds\":{\"all\":100},\"wind\":{\"speed\":3.71,\"deg\":93,\"gust\":7.56},\"visibility\":10000,\"pop\":0,\"sys\":{\"pod\":\"n\"},\"dt_txt\":\"2023-04-05 06:00:00\"},{\"dt\":1680685200,\"main\":{\"temp\":47.48,\"feels_like\":46.09,\"temp_min\":47.48,\"temp_max\":47.48,\"pressure\":1023,\"sea_level\":1023,\"grnd_level\":1022,\"humidity\":92,\"temp_kf\":0},\"weather\":[{\"id\":804,\"main\":\"Clouds\",\"description\":\"overcast clouds\",\"icon\":\"04n\"}],\"clouds\":{\"all\":100},\"wind\":{\"speed\":3.83,\"deg\":70,\"gust\":7.54},\"visibility\":10000,\"pop\":0,\"sys\":{\"pod\":\"n\"},\"dt_txt\":\"2023-04-05 09:00:00\"},{\"dt\":1680696000,\"main\":{\"temp\":47.35,\"feels_like\":44.92,\"temp_min\":47.35,\"temp_max\":47.35,\"pressure\":1023,\"sea_level\":1023,\"grnd_level\":1023,\"humidity\":91,\"temp_kf\":0},\"weather\":[{\"id\":804,\"main\":\"Clouds\",\"description\":\"overcast clouds\",\"icon\":\"04d\"}],\"clouds\":{\"all\":100},\"wind\":{\"speed\":5.3,\"deg\":83,\"gust\":11.92},\"visibility\":10000,\"pop\":0,\"sys\":{\"pod\":\"d\"},\"dt_txt\":\"2023-04-05 12:00:00\"},{\"dt\":1680706800,\"main\":{\"temp\":51.48,\"feels_like\":50.36,\"temp_min\":51.48,\"temp_max\":51.48,\"pressure\":1023,\"sea_level\":1023,\"grnd_level\":1022,\"humidity\":86,\"temp_kf\":0},\"weather\":[{\"id\":804,\"main\":\"Clouds\",\"description\":\"overcast clouds\",\"icon\":\"04d\"}],\"clouds\":{\"all\":100},\"wind\":{\"speed\":5.57,\"deg\":107,\"gust\":10.04},\"visibility\":10000,\"pop\":0,\"sys\":{\"pod\":\"d\"},\"dt_txt\":\"2023-04-05 15:00:00\"},{\"dt\":1680717600,\"main\":{\"temp\":53.19,\"feels_like\":52.29,\"temp_min\":53.19,\"temp_max\":53.19,\"pressure\":1020,\"sea_level\":1020,\"grnd_level\":1019,\"humidity\":87,\"temp_kf\":0},\"weather\":[{\"id\":804,\"main\":\"Clouds\",\"description\":\"overcast clouds\",\"icon\":\"04d\"}],\"clouds\":{\"all\":100},\"wind\":{\"speed\":4.9,\"deg\":107,\"gust\":9.69},\"visibility\":10000,\"pop\":0,\"sys\":{\"pod\":\"d\"},\"dt_txt\":\"2023-04-05 18: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": 51,
"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": 59,
"id": "7fe29f4b",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'200'"
]
},
"execution_count": 59,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import json\n",
"\n",
"# convert json to a nested dict\n",
"weather_dict = json.loads(url_text)\n",
"\n",
"weather_dict['cod']"
]
},
{
"cell_type": "code",
"execution_count": 60,
"id": "aa60c358",
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"text/plain": [
"[{'dt': 1680296400,\n",
" 'main': {'temp': 49.35,\n",
" 'feels_like': 44.55,\n",
" 'temp_min': 46.42,\n",
" 'temp_max': 49.35,\n",
" 'pressure': 1022,\n",
" 'sea_level': 1022,\n",
" 'grnd_level': 1020,\n",
" 'humidity': 38,\n",
" 'temp_kf': 1.63},\n",
" 'weather': [{'id': 803,\n",
" 'main': 'Clouds',\n",
" 'description': 'broken clouds',\n",
" 'icon': '04d'}],\n",
" 'clouds': {'all': 83},\n",
" 'wind': {'speed': 12.24, 'deg': 190, 'gust': 19.26},\n",
" 'visibility': 10000,\n",
" 'pop': 0.02,\n",
" 'sys': {'pod': 'd'},\n",
" 'dt_txt': '2023-03-31 21:00:00'},\n",
" {'dt': 1680307200,\n",
" 'main': {'temp': 42.69,\n",
" 'feels_like': 37.06,\n",
" 'temp_min': 38.62,\n",
" 'temp_max': 42.69,\n",
" 'pressure': 1020,\n",
" 'sea_level': 1020,\n",
" 'grnd_level': 1019,\n",
" 'humidity': 68,\n",
" 'temp_kf': 2.26},\n",
" 'weather': [{'id': 500,\n",
" 'main': 'Rain',\n",
" 'description': 'light rain',\n",
" 'icon': '10n'}],\n",
" 'clouds': {'all': 91},\n",
" 'wind': {'speed': 9.82, 'deg': 160, 'gust': 26.66},\n",
" 'visibility': 6644,\n",
" 'pop': 0.92,\n",
" 'rain': {'3h': 2.47},\n",
" 'sys': {'pod': 'n'},\n",
" 'dt_txt': '2023-04-01 00:00:00'},\n",
" {'dt': 1680318000,\n",
" 'main': {'temp': 41.52,\n",
" 'feels_like': 36.28,\n",
" 'temp_min': 41.52,\n",
" 'temp_max': 41.52,\n",
" 'pressure': 1015,\n",
" 'sea_level': 1015,\n",
" 'grnd_level': 1015,\n",
" 'humidity': 94,\n",
" 'temp_kf': 0},\n",
" 'weather': [{'id': 501,\n",
" 'main': 'Rain',\n",
" 'description': 'moderate rain',\n",
" 'icon': '10n'}],\n",
" 'clouds': {'all': 100},\n",
" 'wind': {'speed': 8.32, 'deg': 152, 'gust': 25.01},\n",
" 'visibility': 10000,\n",
" 'pop': 1,\n",
" 'rain': {'3h': 5.55},\n",
" 'sys': {'pod': 'n'},\n",
" 'dt_txt': '2023-04-01 03:00:00'},\n",
" {'dt': 1680328800,\n",
" 'main': {'temp': 43.05,\n",
" 'feels_like': 43.05,\n",
" 'temp_min': 43.05,\n",
" 'temp_max': 43.05,\n",
" 'pressure': 1011,\n",
" 'sea_level': 1011,\n",
" 'grnd_level': 1011,\n",
" 'humidity': 99,\n",
" 'temp_kf': 0},\n",
" 'weather': [{'id': 500,\n",
" 'main': 'Rain',\n",
" 'description': 'light rain',\n",
" 'icon': '10n'}],\n",
" 'clouds': {'all': 100},\n",
" 'wind': {'speed': 1.86, 'deg': 260, 'gust': 7.43},\n",
" 'visibility': 10000,\n",
" 'pop': 1,\n",
" 'rain': {'3h': 1.45},\n",
" 'sys': {'pod': 'n'},\n",
" 'dt_txt': '2023-04-01 06:00:00'},\n",
" {'dt': 1680339600,\n",
" 'main': {'temp': 42.21,\n",
" 'feels_like': 42.21,\n",
" 'temp_min': 42.21,\n",
" 'temp_max': 42.21,\n",
" 'pressure': 1008,\n",
" 'sea_level': 1008,\n",
" 'grnd_level': 1008,\n",
" 'humidity': 98,\n",
" 'temp_kf': 0},\n",
" 'weather': [{'id': 804,\n",
" 'main': 'Clouds',\n",
" 'description': 'overcast clouds',\n",
" 'icon': '04n'}],\n",
" 'clouds': {'all': 100},\n",
" 'wind': {'speed': 1.28, 'deg': 280, 'gust': 3.09},\n",
" 'visibility': 7999,\n",
" 'pop': 0.25,\n",
" 'sys': {'pod': 'n'},\n",
" 'dt_txt': '2023-04-01 09:00:00'},\n",
" {'dt': 1680350400,\n",
" 'main': {'temp': 44.31,\n",
" 'feels_like': 42.04,\n",
" 'temp_min': 44.31,\n",
" 'temp_max': 44.31,\n",
" 'pressure': 1003,\n",
" 'sea_level': 1003,\n",
" 'grnd_level': 1003,\n",
" 'humidity': 99,\n",
" 'temp_kf': 0},\n",
" 'weather': [{'id': 500,\n",
" 'main': 'Rain',\n",
" 'description': 'light rain',\n",
" 'icon': '10d'}],\n",
" 'clouds': {'all': 100},\n",
" 'wind': {'speed': 4.32, 'deg': 140, 'gust': 15.05},\n",
" 'visibility': 742,\n",
" 'pop': 1,\n",
" 'rain': {'3h': 1.61},\n",
" 'sys': {'pod': 'd'},\n",
" 'dt_txt': '2023-04-01 12:00:00'},\n",
" {'dt': 1680361200,\n",
" 'main': {'temp': 50.61,\n",
" 'feels_like': 49.93,\n",
" 'temp_min': 50.61,\n",
" 'temp_max': 50.61,\n",
" 'pressure': 1000,\n",
" 'sea_level': 1000,\n",
" 'grnd_level': 999,\n",
" 'humidity': 97,\n",
" 'temp_kf': 0},\n",
" 'weather': [{'id': 501,\n",
" 'main': 'Rain',\n",
" 'description': 'moderate rain',\n",
" 'icon': '10d'}],\n",
" 'clouds': {'all': 100},\n",
" 'wind': {'speed': 9.89, 'deg': 212, 'gust': 33.22},\n",
" 'visibility': 10000,\n",
" 'pop': 1,\n",
" 'rain': {'3h': 3.45},\n",
" 'sys': {'pod': 'd'},\n",
" 'dt_txt': '2023-04-01 15:00:00'},\n",
" {'dt': 1680372000,\n",
" 'main': {'temp': 56.84,\n",
" 'feels_like': 56.5,\n",
" 'temp_min': 56.84,\n",
" 'temp_max': 56.84,\n",
" 'pressure': 996,\n",
" 'sea_level': 996,\n",
" 'grnd_level': 995,\n",
" 'humidity': 91,\n",
" 'temp_kf': 0},\n",
" 'weather': [{'id': 500,\n",
" 'main': 'Rain',\n",
" 'description': 'light rain',\n",
" 'icon': '10d'}],\n",
" 'clouds': {'all': 100},\n",
" 'wind': {'speed': 16.17, 'deg': 218, 'gust': 38.83},\n",
" 'visibility': 10000,\n",
" 'pop': 1,\n",
" 'rain': {'3h': 0.47},\n",
" 'sys': {'pod': 'd'},\n",
" 'dt_txt': '2023-04-01 18:00:00'},\n",
" {'dt': 1680382800,\n",
" 'main': {'temp': 56.89,\n",
" 'feels_like': 56.55,\n",
" 'temp_min': 56.89,\n",
" 'temp_max': 56.89,\n",
" 'pressure': 993,\n",
" 'sea_level': 993,\n",
" 'grnd_level': 993,\n",
" 'humidity': 91,\n",
" 'temp_kf': 0},\n",
" 'weather': [{'id': 500,\n",
" 'main': 'Rain',\n",
" 'description': 'light rain',\n",
" 'icon': '10d'}],\n",
" 'clouds': {'all': 99},\n",
" 'wind': {'speed': 11.77, 'deg': 212, 'gust': 27.29},\n",
" 'visibility': 10000,\n",
" 'pop': 0.64,\n",
" 'rain': {'3h': 0.37},\n",
" 'sys': {'pod': 'd'},\n",
" 'dt_txt': '2023-04-01 21:00:00'},\n",
" {'dt': 1680393600,\n",
" 'main': {'temp': 53.47,\n",
" 'feels_like': 52.99,\n",
" 'temp_min': 53.47,\n",
" 'temp_max': 53.47,\n",
" 'pressure': 992,\n",
" 'sea_level': 992,\n",
" 'grnd_level': 991,\n",
" 'humidity': 95,\n",
" 'temp_kf': 0},\n",
" 'weather': [{'id': 803,\n",
" 'main': 'Clouds',\n",
" 'description': 'broken clouds',\n",
" 'icon': '04n'}],\n",
" 'clouds': {'all': 75},\n",
" 'wind': {'speed': 9.84, 'deg': 202, 'gust': 27.67},\n",
" 'visibility': 10000,\n",
" 'pop': 0.53,\n",
" 'sys': {'pod': 'n'},\n",
" 'dt_txt': '2023-04-02 00:00:00'},\n",
" {'dt': 1680404400,\n",
" 'main': {'temp': 52.09,\n",
" 'feels_like': 51.37,\n",
" 'temp_min': 52.09,\n",
" 'temp_max': 52.09,\n",
" 'pressure': 990,\n",
" 'sea_level': 990,\n",
" 'grnd_level': 989,\n",
" 'humidity': 93,\n",
" 'temp_kf': 0},\n",
" 'weather': [{'id': 500,\n",
" 'main': 'Rain',\n",
" 'description': 'light rain',\n",
" 'icon': '10n'}],\n",
" 'clouds': {'all': 92},\n",
" 'wind': {'speed': 7.87, 'deg': 275, 'gust': 20.29},\n",
" 'visibility': 10000,\n",
" 'pop': 0.97,\n",
" 'rain': {'3h': 2.43},\n",
" 'sys': {'pod': 'n'},\n",
" 'dt_txt': '2023-04-02 03:00:00'},\n",
" {'dt': 1680415200,\n",
" 'main': {'temp': 49.12,\n",
" 'feels_like': 43.63,\n",
" 'temp_min': 49.12,\n",
" 'temp_max': 49.12,\n",
" 'pressure': 990,\n",
" 'sea_level': 990,\n",
" 'grnd_level': 990,\n",
" 'humidity': 81,\n",
" 'temp_kf': 0},\n",
" 'weather': [{'id': 500,\n",
" 'main': 'Rain',\n",
" 'description': 'light rain',\n",
" 'icon': '10n'}],\n",
" 'clouds': {'all': 96},\n",
" 'wind': {'speed': 14.56, 'deg': 283, 'gust': 30.04},\n",
" 'visibility': 10000,\n",
" 'pop': 1,\n",
" 'rain': {'3h': 1.06},\n",
" 'sys': {'pod': 'n'},\n",
" 'dt_txt': '2023-04-02 06:00:00'},\n",
" {'dt': 1680426000,\n",
" 'main': {'temp': 45.54,\n",
" 'feels_like': 38.46,\n",
" 'temp_min': 45.54,\n",
" 'temp_max': 45.54,\n",
" 'pressure': 995,\n",
" 'sea_level': 995,\n",
" 'grnd_level': 995,\n",
" 'humidity': 74,\n",
" 'temp_kf': 0},\n",
" 'weather': [{'id': 804,\n",
" 'main': 'Clouds',\n",
" 'description': 'overcast clouds',\n",
" 'icon': '04n'}],\n",
" 'clouds': {'all': 98},\n",
" 'wind': {'speed': 16.84, 'deg': 310, 'gust': 33.69},\n",
" 'visibility': 10000,\n",
" 'pop': 0.24,\n",
" 'sys': {'pod': 'n'},\n",
" 'dt_txt': '2023-04-02 09:00:00'},\n",
" {'dt': 1680436800,\n",
" 'main': {'temp': 38.35,\n",
" 'feels_like': 29.32,\n",
" 'temp_min': 38.35,\n",
" 'temp_max': 38.35,\n",
" 'pressure': 1003,\n",
" 'sea_level': 1003,\n",
" 'grnd_level': 1003,\n",
" 'humidity': 63,\n",
" 'temp_kf': 0},\n",
" 'weather': [{'id': 803,\n",
" 'main': 'Clouds',\n",
" 'description': 'broken clouds',\n",
" 'icon': '04d'}],\n",
" 'clouds': {'all': 57},\n",
" 'wind': {'speed': 16.35, 'deg': 312, 'gust': 34.72},\n",
" 'visibility': 10000,\n",
" 'pop': 0.13,\n",
" 'sys': {'pod': 'd'},\n",
" 'dt_txt': '2023-04-02 12:00:00'},\n",
" {'dt': 1680447600,\n",
" 'main': {'temp': 39.78,\n",
" 'feels_like': 30.56,\n",
" 'temp_min': 39.78,\n",
" 'temp_max': 39.78,\n",
" 'pressure': 1008,\n",
" 'sea_level': 1008,\n",
" 'grnd_level': 1007,\n",
" 'humidity': 35,\n",
" 'temp_kf': 0},\n",
" 'weather': [{'id': 800,\n",
" 'main': 'Clear',\n",
" 'description': 'clear sky',\n",
" 'icon': '01d'}],\n",
" 'clouds': {'all': 5},\n",
" 'wind': {'speed': 18.52, 'deg': 327, 'gust': 29.51},\n",
" 'visibility': 10000,\n",
" 'pop': 0,\n",
" 'sys': {'pod': 'd'},\n",
" 'dt_txt': '2023-04-02 15:00:00'},\n",
" {'dt': 1680458400,\n",
" 'main': {'temp': 42.89,\n",
" 'feels_like': 35.4,\n",
" 'temp_min': 42.89,\n",
" 'temp_max': 42.89,\n",
" 'pressure': 1011,\n",
" 'sea_level': 1011,\n",
" 'grnd_level': 1011,\n",
" 'humidity': 28,\n",
" 'temp_kf': 0},\n",
" 'weather': [{'id': 800,\n",
" 'main': 'Clear',\n",
" 'description': 'clear sky',\n",
" 'icon': '01d'}],\n",
" 'clouds': {'all': 3},\n",
" 'wind': {'speed': 15.46, 'deg': 329, 'gust': 22.39},\n",
" 'visibility': 10000,\n",
" 'pop': 0,\n",
" 'sys': {'pod': 'd'},\n",
" 'dt_txt': '2023-04-02 18:00:00'},\n",
" {'dt': 1680469200,\n",
" 'main': {'temp': 42.84,\n",
" 'feels_like': 36.01,\n",
" 'temp_min': 42.84,\n",
" 'temp_max': 42.84,\n",
" 'pressure': 1014,\n",
" 'sea_level': 1014,\n",
" 'grnd_level': 1013,\n",
" 'humidity': 30,\n",
" 'temp_kf': 0},\n",
" 'weather': [{'id': 800,\n",
" 'main': 'Clear',\n",
" 'description': 'clear sky',\n",
" 'icon': '01d'}],\n",
" 'clouds': {'all': 0},\n",
" 'wind': {'speed': 13.2, 'deg': 326, 'gust': 18.54},\n",
" 'visibility': 10000,\n",
" 'pop': 0,\n",
" 'sys': {'pod': 'd'},\n",
" 'dt_txt': '2023-04-02 21:00:00'},\n",
" {'dt': 1680480000,\n",
" 'main': {'temp': 37.81,\n",
" 'feels_like': 30.69,\n",
" 'temp_min': 37.81,\n",
" 'temp_max': 37.81,\n",
" 'pressure': 1018,\n",
" 'sea_level': 1018,\n",
" 'grnd_level': 1017,\n",
" 'humidity': 37,\n",
" 'temp_kf': 0},\n",
" 'weather': [{'id': 800,\n",
" 'main': 'Clear',\n",
" 'description': 'clear sky',\n",
" 'icon': '01n'}],\n",
" 'clouds': {'all': 0},\n",
" 'wind': {'speed': 10.56, 'deg': 326, 'gust': 20.27},\n",
" 'visibility': 10000,\n",
" 'pop': 0,\n",
" 'sys': {'pod': 'n'},\n",
" 'dt_txt': '2023-04-03 00:00:00'},\n",
" {'dt': 1680490800,\n",
" 'main': {'temp': 34.27,\n",
" 'feels_like': 27.72,\n",
" 'temp_min': 34.27,\n",
" 'temp_max': 34.27,\n",
" 'pressure': 1019,\n",
" 'sea_level': 1019,\n",
" 'grnd_level': 1019,\n",
" 'humidity': 38,\n",
" 'temp_kf': 0},\n",
" 'weather': [{'id': 800,\n",
" 'main': 'Clear',\n",
" 'description': 'clear sky',\n",
" 'icon': '01n'}],\n",
" 'clouds': {'all': 7},\n",
" 'wind': {'speed': 7.81, 'deg': 332, 'gust': 18.66},\n",
" 'visibility': 10000,\n",
" 'pop': 0,\n",
" 'sys': {'pod': 'n'},\n",
" 'dt_txt': '2023-04-03 03:00:00'},\n",
" {'dt': 1680501600,\n",
" 'main': {'temp': 32.79,\n",
" 'feels_like': 29.97,\n",
" 'temp_min': 32.79,\n",
" 'temp_max': 32.79,\n",
" 'pressure': 1020,\n",
" 'sea_level': 1020,\n",
" 'grnd_level': 1019,\n",
" 'humidity': 38,\n",
" 'temp_kf': 0},\n",
" 'weather': [{'id': 800,\n",
" 'main': 'Clear',\n",
" 'description': 'clear sky',\n",
" 'icon': '01n'}],\n",
" 'clouds': {'all': 8},\n",
" 'wind': {'speed': 3.18, 'deg': 313, 'gust': 6.35},\n",
" 'visibility': 10000,\n",
" 'pop': 0,\n",
" 'sys': {'pod': 'n'},\n",
" 'dt_txt': '2023-04-03 06:00:00'},\n",
" {'dt': 1680512400,\n",
" 'main': {'temp': 32.43,\n",
" 'feels_like': 29.48,\n",
" 'temp_min': 32.43,\n",
" 'temp_max': 32.43,\n",
" 'pressure': 1021,\n",
" 'sea_level': 1021,\n",
" 'grnd_level': 1020,\n",
" 'humidity': 41,\n",
" 'temp_kf': 0},\n",
" 'weather': [{'id': 800,\n",
" 'main': 'Clear',\n",
" 'description': 'clear sky',\n",
" 'icon': '01n'}],\n",
" 'clouds': {'all': 9},\n",
" 'wind': {'speed': 3.24, 'deg': 190, 'gust': 5.97},\n",
" 'visibility': 10000,\n",
" 'pop': 0,\n",
" 'sys': {'pod': 'n'},\n",
" 'dt_txt': '2023-04-03 09:00:00'},\n",
" {'dt': 1680523200,\n",
" 'main': {'temp': 35.71,\n",
" 'feels_like': 29.8,\n",
" 'temp_min': 35.71,\n",
" 'temp_max': 35.71,\n",
" 'pressure': 1022,\n",
" 'sea_level': 1022,\n",
" 'grnd_level': 1021,\n",
" 'humidity': 44,\n",
" 'temp_kf': 0},\n",
" 'weather': [{'id': 801,\n",
" 'main': 'Clouds',\n",
" 'description': 'few clouds',\n",
" 'icon': '02d'}],\n",
" 'clouds': {'all': 12},\n",
" 'wind': {'speed': 7.25, 'deg': 202, 'gust': 15.46},\n",
" 'visibility': 10000,\n",
" 'pop': 0,\n",
" 'sys': {'pod': 'd'},\n",
" 'dt_txt': '2023-04-03 12:00:00'},\n",
" {'dt': 1680534000,\n",
" 'main': {'temp': 46.6,\n",
" 'feels_like': 41.43,\n",
" 'temp_min': 46.6,\n",
" 'temp_max': 46.6,\n",
" 'pressure': 1019,\n",
" 'sea_level': 1019,\n",
" 'grnd_level': 1019,\n",
" 'humidity': 35,\n",
" 'temp_kf': 0},\n",
" 'weather': [{'id': 803,\n",
" 'main': 'Clouds',\n",
" 'description': 'broken clouds',\n",
" 'icon': '04d'}],\n",
" 'clouds': {'all': 84},\n",
" 'wind': {'speed': 11.1, 'deg': 208, 'gust': 17.92},\n",
" 'visibility': 10000,\n",
" 'pop': 0,\n",
" 'sys': {'pod': 'd'},\n",
" 'dt_txt': '2023-04-03 15:00:00'},\n",
" {'dt': 1680544800,\n",
" 'main': {'temp': 54.01,\n",
" 'feels_like': 50.61,\n",
" 'temp_min': 54.01,\n",
" 'temp_max': 54.01,\n",
" 'pressure': 1016,\n",
" 'sea_level': 1016,\n",
" 'grnd_level': 1015,\n",
" 'humidity': 32,\n",
" 'temp_kf': 0},\n",
" 'weather': [{'id': 804,\n",
" 'main': 'Clouds',\n",
" 'description': 'overcast clouds',\n",
" 'icon': '04d'}],\n",
" 'clouds': {'all': 91},\n",
" 'wind': {'speed': 14.76, 'deg': 211, 'gust': 24.83},\n",
" 'visibility': 10000,\n",
" 'pop': 0,\n",
" 'sys': {'pod': 'd'},\n",
" 'dt_txt': '2023-04-03 18:00:00'},\n",
" {'dt': 1680555600,\n",
" 'main': {'temp': 52.66,\n",
" 'feels_like': 49.55,\n",
" 'temp_min': 52.66,\n",
" 'temp_max': 52.66,\n",
" 'pressure': 1013,\n",
" 'sea_level': 1013,\n",
" 'grnd_level': 1012,\n",
" 'humidity': 41,\n",
" 'temp_kf': 0},\n",
" 'weather': [{'id': 804,\n",
" 'main': 'Clouds',\n",
" 'description': 'overcast clouds',\n",
" 'icon': '04d'}],\n",
" 'clouds': {'all': 100},\n",
" 'wind': {'speed': 14.79, 'deg': 209, 'gust': 32.48},\n",
" 'visibility': 10000,\n",
" 'pop': 0,\n",
" 'sys': {'pod': 'd'},\n",
" 'dt_txt': '2023-04-03 21:00:00'},\n",
" {'dt': 1680566400,\n",
" 'main': {'temp': 49.08,\n",
" 'feels_like': 43.61,\n",
" 'temp_min': 49.08,\n",
" 'temp_max': 49.08,\n",
" 'pressure': 1012,\n",
" 'sea_level': 1012,\n",
" 'grnd_level': 1012,\n",
" 'humidity': 59,\n",
" 'temp_kf': 0},\n",
" 'weather': [{'id': 804,\n",
" 'main': 'Clouds',\n",
" 'description': 'overcast clouds',\n",
" 'icon': '04n'}],\n",
" 'clouds': {'all': 90},\n",
" 'wind': {'speed': 14.45, 'deg': 214, 'gust': 39.86},\n",
" 'visibility': 10000,\n",
" 'pop': 0,\n",
" 'sys': {'pod': 'n'},\n",
" 'dt_txt': '2023-04-04 00:00:00'},\n",
" {'dt': 1680577200,\n",
" 'main': {'temp': 48.43,\n",
" 'feels_like': 44.82,\n",
" 'temp_min': 48.43,\n",
" 'temp_max': 48.43,\n",
" 'pressure': 1014,\n",
" 'sea_level': 1014,\n",
" 'grnd_level': 1014,\n",
" 'humidity': 74,\n",
" 'temp_kf': 0},\n",
" 'weather': [{'id': 804,\n",
" 'main': 'Clouds',\n",
" 'description': 'overcast clouds',\n",
" 'icon': '04n'}],\n",
" 'clouds': {'all': 94},\n",
" 'wind': {'speed': 8.1, 'deg': 265, 'gust': 22.64},\n",
" 'visibility': 10000,\n",
" 'pop': 0.2,\n",
" 'sys': {'pod': 'n'},\n",
" 'dt_txt': '2023-04-04 03:00:00'},\n",
" {'dt': 1680588000,\n",
" 'main': {'temp': 46.44,\n",
" 'feels_like': 46.44,\n",
" 'temp_min': 46.44,\n",
" 'temp_max': 46.44,\n",
" 'pressure': 1015,\n",
" 'sea_level': 1015,\n",
" 'grnd_level': 1014,\n",
" 'humidity': 87,\n",
" 'temp_kf': 0},\n",
" 'weather': [{'id': 500,\n",
" 'main': 'Rain',\n",
" 'description': 'light rain',\n",
" 'icon': '10n'}],\n",
" 'clouds': {'all': 97},\n",
" 'wind': {'speed': 2.73, 'deg': 197, 'gust': 4.18},\n",
" 'visibility': 10000,\n",
" 'pop': 0.49,\n",
" 'rain': {'3h': 0.51},\n",
" 'sys': {'pod': 'n'},\n",
" 'dt_txt': '2023-04-04 06:00:00'},\n",
" {'dt': 1680598800,\n",
" 'main': {'temp': 46.38,\n",
" 'feels_like': 44.44,\n",
" 'temp_min': 46.38,\n",
" 'temp_max': 46.38,\n",
" 'pressure': 1014,\n",
" 'sea_level': 1014,\n",
" 'grnd_level': 1014,\n",
" 'humidity': 87,\n",
" 'temp_kf': 0},\n",
" 'weather': [{'id': 500,\n",
" 'main': 'Rain',\n",
" 'description': 'light rain',\n",
" 'icon': '10n'}],\n",
" 'clouds': {'all': 100},\n",
" 'wind': {'speed': 4.34, 'deg': 195, 'gust': 10.16},\n",
" 'visibility': 10000,\n",
" 'pop': 0.3,\n",
" 'rain': {'3h': 0.1},\n",
" 'sys': {'pod': 'n'},\n",
" 'dt_txt': '2023-04-04 09:00:00'},\n",
" {'dt': 1680609600,\n",
" 'main': {'temp': 47.7,\n",
" 'feels_like': 46.6,\n",
" 'temp_min': 47.7,\n",
" 'temp_max': 47.7,\n",
" 'pressure': 1016,\n",
" 'sea_level': 1016,\n",
" 'grnd_level': 1015,\n",
" 'humidity': 86,\n",
" 'temp_kf': 0},\n",
" 'weather': [{'id': 804,\n",
" 'main': 'Clouds',\n",
" 'description': 'overcast clouds',\n",
" 'icon': '04d'}],\n",
" 'clouds': {'all': 100},\n",
" 'wind': {'speed': 3.51, 'deg': 210, 'gust': 6.85},\n",
" 'visibility': 10000,\n",
" 'pop': 0.11,\n",
" 'sys': {'pod': 'd'},\n",
" 'dt_txt': '2023-04-04 12:00:00'},\n",
" {'dt': 1680620400,\n",
" 'main': {'temp': 55.44,\n",
" 'feels_like': 53.87,\n",
" 'temp_min': 55.44,\n",
" 'temp_max': 55.44,\n",
" 'pressure': 1016,\n",
" 'sea_level': 1016,\n",
" 'grnd_level': 1016,\n",
" 'humidity': 68,\n",
" 'temp_kf': 0},\n",
" 'weather': [{'id': 804,\n",
" 'main': 'Clouds',\n",
" 'description': 'overcast clouds',\n",
" 'icon': '04d'}],\n",
" 'clouds': {'all': 100},\n",
" 'wind': {'speed': 2.33, 'deg': 230, 'gust': 4.14},\n",
" 'visibility': 10000,\n",
" 'pop': 0,\n",
" 'sys': {'pod': 'd'},\n",
" 'dt_txt': '2023-04-04 15:00:00'},\n",
" {'dt': 1680631200,\n",
" 'main': {'temp': 58.42,\n",
" 'feels_like': 56.93,\n",
" 'temp_min': 58.42,\n",
" 'temp_max': 58.42,\n",
" 'pressure': 1016,\n",
" 'sea_level': 1016,\n",
" 'grnd_level': 1016,\n",
" 'humidity': 63,\n",
" 'temp_kf': 0},\n",
" 'weather': [{'id': 804,\n",
" 'main': 'Clouds',\n",
" 'description': 'overcast clouds',\n",
" 'icon': '04d'}],\n",
" 'clouds': {'all': 100},\n",
" 'wind': {'speed': 2.15, 'deg': 90, 'gust': 2.28},\n",
" 'visibility': 10000,\n",
" 'pop': 0.08,\n",
" 'sys': {'pod': 'd'},\n",
" 'dt_txt': '2023-04-04 18:00:00'},\n",
" {'dt': 1680642000,\n",
" 'main': {'temp': 56.84,\n",
" 'feels_like': 55.47,\n",
" 'temp_min': 56.84,\n",
" 'temp_max': 56.84,\n",
" 'pressure': 1018,\n",
" 'sea_level': 1018,\n",
" 'grnd_level': 1018,\n",
" 'humidity': 69,\n",
" 'temp_kf': 0},\n",
" 'weather': [{'id': 804,\n",
" 'main': 'Clouds',\n",
" 'description': 'overcast clouds',\n",
" 'icon': '04d'}],\n",
" 'clouds': {'all': 100},\n",
" 'wind': {'speed': 5.44, 'deg': 67, 'gust': 6.91},\n",
" 'visibility': 10000,\n",
" 'pop': 0,\n",
" 'sys': {'pod': 'd'},\n",
" 'dt_txt': '2023-04-04 21:00:00'},\n",
" {'dt': 1680652800,\n",
" 'main': {'temp': 51.75,\n",
" 'feels_like': 50.29,\n",
" 'temp_min': 51.75,\n",
" 'temp_max': 51.75,\n",
" 'pressure': 1021,\n",
" 'sea_level': 1021,\n",
" 'grnd_level': 1020,\n",
" 'humidity': 78,\n",
" 'temp_kf': 0},\n",
" 'weather': [{'id': 804,\n",
" 'main': 'Clouds',\n",
" 'description': 'overcast clouds',\n",
" 'icon': '04n'}],\n",
" 'clouds': {'all': 100},\n",
" 'wind': {'speed': 4.68, 'deg': 104, 'gust': 8.59},\n",
" 'visibility': 10000,\n",
" 'pop': 0,\n",
" 'sys': {'pod': 'n'},\n",
" 'dt_txt': '2023-04-05 00:00:00'},\n",
" {'dt': 1680663600,\n",
" 'main': {'temp': 50.2,\n",
" 'feels_like': 48.72,\n",
" 'temp_min': 50.2,\n",
" 'temp_max': 50.2,\n",
" 'pressure': 1022,\n",
" 'sea_level': 1022,\n",
" 'grnd_level': 1022,\n",
" 'humidity': 81,\n",
" 'temp_kf': 0},\n",
" 'weather': [{'id': 804,\n",
" 'main': 'Clouds',\n",
" 'description': 'overcast clouds',\n",
" 'icon': '04n'}],\n",
" 'clouds': {'all': 99},\n",
" 'wind': {'speed': 3.42, 'deg': 110, 'gust': 6.67},\n",
" 'visibility': 10000,\n",
" 'pop': 0,\n",
" 'sys': {'pod': 'n'},\n",
" 'dt_txt': '2023-04-05 03:00:00'},\n",
" {'dt': 1680674400,\n",
" 'main': {'temp': 49.17,\n",
" 'feels_like': 48.13,\n",
" 'temp_min': 49.17,\n",
" 'temp_max': 49.17,\n",
" 'pressure': 1022,\n",
" 'sea_level': 1022,\n",
" 'grnd_level': 1022,\n",
" 'humidity': 87,\n",
" 'temp_kf': 0},\n",
" 'weather': [{'id': 804,\n",
" 'main': 'Clouds',\n",
" 'description': 'overcast clouds',\n",
" 'icon': '04n'}],\n",
" 'clouds': {'all': 100},\n",
" 'wind': {'speed': 3.71, 'deg': 93, 'gust': 7.56},\n",
" 'visibility': 10000,\n",
" 'pop': 0,\n",
" 'sys': {'pod': 'n'},\n",
" 'dt_txt': '2023-04-05 06:00:00'},\n",
" {'dt': 1680685200,\n",
" 'main': {'temp': 47.48,\n",
" 'feels_like': 46.09,\n",
" 'temp_min': 47.48,\n",
" 'temp_max': 47.48,\n",
" 'pressure': 1023,\n",
" 'sea_level': 1023,\n",
" 'grnd_level': 1022,\n",
" 'humidity': 92,\n",
" 'temp_kf': 0},\n",
" 'weather': [{'id': 804,\n",
" 'main': 'Clouds',\n",
" 'description': 'overcast clouds',\n",
" 'icon': '04n'}],\n",
" 'clouds': {'all': 100},\n",
" 'wind': {'speed': 3.83, 'deg': 70, 'gust': 7.54},\n",
" 'visibility': 10000,\n",
" 'pop': 0,\n",
" 'sys': {'pod': 'n'},\n",
" 'dt_txt': '2023-04-05 09:00:00'},\n",
" {'dt': 1680696000,\n",
" 'main': {'temp': 47.35,\n",
" 'feels_like': 44.92,\n",
" 'temp_min': 47.35,\n",
" 'temp_max': 47.35,\n",
" 'pressure': 1023,\n",
" 'sea_level': 1023,\n",
" 'grnd_level': 1023,\n",
" 'humidity': 91,\n",
" 'temp_kf': 0},\n",
" 'weather': [{'id': 804,\n",
" 'main': 'Clouds',\n",
" 'description': 'overcast clouds',\n",
" 'icon': '04d'}],\n",
" 'clouds': {'all': 100},\n",
" 'wind': {'speed': 5.3, 'deg': 83, 'gust': 11.92},\n",
" 'visibility': 10000,\n",
" 'pop': 0,\n",
" 'sys': {'pod': 'd'},\n",
" 'dt_txt': '2023-04-05 12:00:00'},\n",
" {'dt': 1680706800,\n",
" 'main': {'temp': 51.48,\n",
" 'feels_like': 50.36,\n",
" 'temp_min': 51.48,\n",
" 'temp_max': 51.48,\n",
" 'pressure': 1023,\n",
" 'sea_level': 1023,\n",
" 'grnd_level': 1022,\n",
" 'humidity': 86,\n",
" 'temp_kf': 0},\n",
" 'weather': [{'id': 804,\n",
" 'main': 'Clouds',\n",
" 'description': 'overcast clouds',\n",
" 'icon': '04d'}],\n",
" 'clouds': {'all': 100},\n",
" 'wind': {'speed': 5.57, 'deg': 107, 'gust': 10.04},\n",
" 'visibility': 10000,\n",
" 'pop': 0,\n",
" 'sys': {'pod': 'd'},\n",
" 'dt_txt': '2023-04-05 15:00:00'},\n",
" {'dt': 1680717600,\n",
" 'main': {'temp': 53.19,\n",
" 'feels_like': 52.29,\n",
" 'temp_min': 53.19,\n",
" 'temp_max': 53.19,\n",
" 'pressure': 1020,\n",
" 'sea_level': 1020,\n",
" 'grnd_level': 1019,\n",
" 'humidity': 87,\n",
" 'temp_kf': 0},\n",
" 'weather': [{'id': 804,\n",
" 'main': 'Clouds',\n",
" 'description': 'overcast clouds',\n",
" 'icon': '04d'}],\n",
" 'clouds': {'all': 100},\n",
" 'wind': {'speed': 4.9, 'deg': 107, 'gust': 9.69},\n",
" 'visibility': 10000,\n",
" 'pop': 0,\n",
" 'sys': {'pod': 'd'},\n",
" 'dt_txt': '2023-04-05 18:00:00'}]"
]
},
"execution_count": 60,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"weather_dict['list']"
]
},
{
"cell_type": "markdown",
"id": "f3c16f79",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"## Cleaning up data from one instant"
]
},
{
"cell_type": "code",
"execution_count": 64,
"id": "d60c2c56",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"{'dt': 1680328800,\n",
" 'main': {'temp': 43.05,\n",
" 'feels_like': 43.05,\n",
" 'temp_min': 43.05,\n",
" 'temp_max': 43.05,\n",
" 'pressure': 1011,\n",
" 'sea_level': 1011,\n",
" 'grnd_level': 1011,\n",
" 'humidity': 99,\n",
" 'temp_kf': 0},\n",
" 'weather': [{'id': 500,\n",
" 'main': 'Rain',\n",
" 'description': 'light rain',\n",
" 'icon': '10n'}],\n",
" 'clouds': {'all': 100},\n",
" 'wind': {'speed': 1.86, 'deg': 260, 'gust': 7.43},\n",
" 'visibility': 10000,\n",
" 'pop': 1,\n",
" 'rain': {'3h': 1.45},\n",
" 'sys': {'pod': 'n'},\n",
" 'dt_txt': '2023-04-01 06:00:00'}"
]
},
"execution_count": 64,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"d = weather_dict['list'][3]\n",
"d"
]
},
{
"cell_type": "code",
"execution_count": 65,
"id": "82ec7713",
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"text/plain": [
"{'dt': 1680328800,\n",
" 'main': {'temp': 43.05,\n",
" 'feels_like': 43.05,\n",
" 'temp_min': 43.05,\n",
" 'temp_max': 43.05,\n",
" 'pressure': 1011,\n",
" 'sea_level': 1011,\n",
" 'grnd_level': 1011,\n",
" 'humidity': 99,\n",
" 'temp_kf': 0},\n",
" 'weather': [{'id': 500,\n",
" 'main': 'Rain',\n",
" 'description': 'light rain',\n",
" 'icon': '10n'}],\n",
" 'clouds': {'all': 100},\n",
" 'wind': {'speed': 1.86, 'deg': 260, 'gust': 7.43},\n",
" 'visibility': 10000,\n",
" 'pop': 1,\n",
" 'rain': {'3h': 1.45},\n",
" 'sys': {'pod': 'n'},\n",
" 'dt_txt': '2023-04-01 06:00:00',\n",
" 'datetime': datetime.datetime(2023, 4, 1, 2, 0)}"
]
},
"execution_count": 65,
"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": 69,
"id": "08fa7c73",
"metadata": {},
"outputs": [],
"source": [
"for key, val in d['main'].items():\n",
" d[key] = val\n",
"del d['main']"
]
},
{
"cell_type": "code",
"execution_count": 70,
"id": "85ca2149",
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"text/plain": [
"{'dt': 1680328800,\n",
" 'weather': [{'id': 500,\n",
" 'main': 'Rain',\n",
" 'description': 'light rain',\n",
" 'icon': '10n'}],\n",
" 'clouds': {'all': 100},\n",
" 'wind': {'speed': 1.86, 'deg': 260, 'gust': 7.43},\n",
" 'visibility': 10000,\n",
" 'pop': 1,\n",
" 'rain': {'3h': 1.45},\n",
" 'sys': {'pod': 'n'},\n",
" 'dt_txt': '2023-04-01 06:00:00',\n",
" 'datetime': datetime.datetime(2023, 4, 1, 2, 0),\n",
" 'temp': 43.05,\n",
" 'feels_like': 43.05,\n",
" 'temp_min': 43.05,\n",
" 'temp_max': 43.05,\n",
" 'pressure': 1011,\n",
" 'sea_level': 1011,\n",
" 'grnd_level': 1011,\n",
" 'humidity': 99,\n",
" 'temp_kf': 0}"
]
},
"execution_count": 70,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"d"
]
},
{
"cell_type": "code",
"execution_count": 72,
"id": "0e8ae26e",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"{'a': 1, 'b': 32, 'c': 100, 'd': 3298}"
]
},
"execution_count": 72,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"some_dict = {'a': 1, 'b': 32}\n",
"some_other_dict = {'c': 100, 'd': 3298}\n",
"\n",
"some_dict.update(some_other_dict)\n",
"\n",
"some_dict"
]
},
{
"cell_type": "code",
"execution_count": 24,
"id": "59086e4f",
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"text/plain": [
"{'dt': 1680264000,\n",
" 'weather': [{'id': 801,\n",
" 'main': 'Clouds',\n",
" 'description': 'few clouds',\n",
" 'icon': '02d'}],\n",
" 'clouds': {'all': 17},\n",
" 'wind': {'speed': 6.08, 'deg': 258, 'gust': 10.69},\n",
" 'visibility': 10000,\n",
" 'pop': 0,\n",
" 'sys': {'pod': 'd'},\n",
" 'dt_txt': '2023-03-31 12:00:00',\n",
" 'datetime': datetime.datetime(2023, 3, 31, 8, 0),\n",
" 'temp': 28.09,\n",
" 'feels_like': 21.51,\n",
" 'temp_min': 28.09,\n",
" 'temp_max': 33.62,\n",
" 'pressure': 1027,\n",
" 'sea_level': 1027,\n",
" 'grnd_level': 1027,\n",
" 'humidity': 61,\n",
" 'temp_kf': -3.07}"
]
},
"execution_count": 24,
"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": 75,
"id": "e5b86ee5",
"metadata": {},
"outputs": [],
"source": [
"from weather_api import 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": 73,
"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": 76,
"id": "1501f143",
"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", "1680296400 | \n", "10000 | \n", "0.00 | \n", "2023-03-31 21:00:00 | \n", "97 | \n", "11.32 | \n", "135 | \n", "15.82 | \n", "n | \n", "58.21 | \n", "... | \n", "1021 | \n", "1021 | \n", "1014 | \n", "67 | \n", "0.36 | \n", "804 | \n", "Clouds | \n", "overcast clouds | \n", "04n | \n", "NaN | \n", "
1 | \n", "1680307200 | \n", "10000 | \n", "0.00 | \n", "2023-04-01 00:00:00 | \n", "85 | \n", "13.04 | \n", "131 | \n", "13.94 | \n", "d | \n", "60.10 | \n", "... | \n", "1022 | \n", "1022 | \n", "1015 | \n", "58 | \n", "-0.43 | \n", "804 | \n", "Clouds | \n", "overcast clouds | \n", "04d | \n", "NaN | \n", "
2 | \n", "1680318000 | \n", "10000 | \n", "0.00 | \n", "2023-04-01 03:00:00 | \n", "58 | \n", "11.88 | \n", "138 | \n", "11.92 | \n", "d | \n", "64.02 | \n", "... | \n", "1022 | \n", "1022 | \n", "1014 | \n", "48 | \n", "0.00 | \n", "803 | \n", "Clouds | \n", "broken clouds | \n", "04d | \n", "NaN | \n", "
3 | \n", "1680328800 | \n", "10000 | \n", "0.00 | \n", "2023-04-01 06:00:00 | \n", "43 | \n", "14.99 | \n", "138 | \n", "14.32 | \n", "d | \n", "63.30 | \n", "... | \n", "1021 | \n", "1021 | \n", "1013 | \n", "48 | \n", "0.00 | \n", "802 | \n", "Clouds | \n", "scattered clouds | \n", "03d | \n", "NaN | \n", "
4 | \n", "1680339600 | \n", "10000 | \n", "0.00 | \n", "2023-04-01 09:00:00 | \n", "10 | \n", "10.11 | \n", "128 | \n", "14.56 | \n", "n | \n", "58.93 | \n", "... | \n", "1022 | \n", "1022 | \n", "1014 | \n", "54 | \n", "0.00 | \n", "800 | \n", "Clear | \n", "clear sky | \n", "01n | \n", "NaN | \n", "
5 | \n", "1680350400 | \n", "10000 | \n", "0.00 | \n", "2023-04-01 12:00:00 | \n", "6 | \n", "7.49 | \n", "128 | \n", "13.24 | \n", "n | \n", "56.77 | \n", "... | \n", "1023 | \n", "1023 | \n", "1014 | \n", "62 | \n", "0.00 | \n", "800 | \n", "Clear | \n", "clear sky | \n", "01n | \n", "NaN | \n", "
6 | \n", "1680361200 | \n", "10000 | \n", "0.00 | \n", "2023-04-01 15:00:00 | \n", "8 | \n", "9.73 | \n", "117 | \n", "17.74 | \n", "n | \n", "55.72 | \n", "... | \n", "1021 | \n", "1021 | \n", "1013 | \n", "68 | \n", "0.00 | \n", "800 | \n", "Clear | \n", "clear sky | \n", "01n | \n", "NaN | \n", "
7 | \n", "1680372000 | \n", "10000 | \n", "0.00 | \n", "2023-04-01 18:00:00 | \n", "6 | \n", "6.96 | \n", "112 | \n", "11.97 | \n", "n | \n", "54.39 | \n", "... | \n", "1020 | \n", "1020 | \n", "1012 | \n", "72 | \n", "0.00 | \n", "800 | \n", "Clear | \n", "clear sky | \n", "01n | \n", "NaN | \n", "
8 | \n", "1680382800 | \n", "10000 | \n", "0.00 | \n", "2023-04-01 21:00:00 | \n", "51 | \n", "9.42 | \n", "97 | \n", "13.47 | \n", "n | \n", "58.78 | \n", "... | \n", "1020 | \n", "1020 | \n", "1012 | \n", "61 | \n", "0.00 | \n", "803 | \n", "Clouds | \n", "broken clouds | \n", "04n | \n", "NaN | \n", "
9 | \n", "1680393600 | \n", "10000 | \n", "0.00 | \n", "2023-04-02 00:00:00 | \n", "76 | \n", "9.10 | \n", "92 | \n", "11.90 | \n", "d | \n", "61.36 | \n", "... | \n", "1020 | \n", "1020 | \n", "1012 | \n", "59 | \n", "0.00 | \n", "803 | \n", "Clouds | \n", "broken clouds | \n", "04d | \n", "NaN | \n", "
10 | \n", "1680404400 | \n", "10000 | \n", "0.00 | \n", "2023-04-02 03:00:00 | \n", "96 | \n", "8.34 | \n", "91 | \n", "9.93 | \n", "d | \n", "64.92 | \n", "... | \n", "1019 | \n", "1019 | \n", "1011 | \n", "53 | \n", "0.00 | \n", "804 | \n", "Clouds | \n", "overcast clouds | \n", "04d | \n", "NaN | \n", "
11 | \n", "1680415200 | \n", "10000 | \n", "0.00 | \n", "2023-04-02 06:00:00 | \n", "76 | \n", "11.79 | \n", "119 | \n", "11.03 | \n", "d | \n", "67.28 | \n", "... | \n", "1016 | \n", "1016 | \n", "1008 | \n", "49 | \n", "0.00 | \n", "803 | \n", "Clouds | \n", "broken clouds | \n", "04d | \n", "NaN | \n", "
12 | \n", "1680426000 | \n", "10000 | \n", "0.00 | \n", "2023-04-02 09:00:00 | \n", "2 | \n", "11.27 | \n", "117 | \n", "16.33 | \n", "n | \n", "60.60 | \n", "... | \n", "1017 | \n", "1017 | \n", "1009 | \n", "60 | \n", "0.00 | \n", "800 | \n", "Clear | \n", "clear sky | \n", "01n | \n", "NaN | \n", "
13 | \n", "1680436800 | \n", "10000 | \n", "0.00 | \n", "2023-04-02 12:00:00 | \n", "3 | \n", "8.30 | \n", "109 | \n", "17.05 | \n", "n | \n", "57.58 | \n", "... | \n", "1018 | \n", "1018 | \n", "1010 | \n", "72 | \n", "0.00 | \n", "800 | \n", "Clear | \n", "clear sky | \n", "01n | \n", "NaN | \n", "
14 | \n", "1680447600 | \n", "10000 | \n", "0.00 | \n", "2023-04-02 15:00:00 | \n", "2 | \n", "7.38 | \n", "96 | \n", "15.99 | \n", "n | \n", "56.64 | \n", "... | \n", "1017 | \n", "1017 | \n", "1009 | \n", "74 | \n", "0.00 | \n", "800 | \n", "Clear | \n", "clear sky | \n", "01n | \n", "NaN | \n", "
15 | \n", "1680458400 | \n", "10000 | \n", "0.00 | \n", "2023-04-02 18:00:00 | \n", "7 | \n", "5.88 | \n", "91 | \n", "8.41 | \n", "n | \n", "55.98 | \n", "... | \n", "1016 | \n", "1016 | \n", "1008 | \n", "80 | \n", "0.00 | \n", "800 | \n", "Clear | \n", "clear sky | \n", "01n | \n", "NaN | \n", "
16 | \n", "1680469200 | \n", "10000 | \n", "0.00 | \n", "2023-04-02 21:00:00 | \n", "10 | \n", "3.67 | \n", "76 | \n", "4.07 | \n", "n | \n", "55.81 | \n", "... | \n", "1016 | \n", "1016 | \n", "1008 | \n", "81 | \n", "0.00 | \n", "800 | \n", "Clear | \n", "clear sky | \n", "01n | \n", "NaN | \n", "
17 | \n", "1680480000 | \n", "10000 | \n", "0.00 | \n", "2023-04-03 00:00:00 | \n", "14 | \n", "2.82 | \n", "45 | \n", "5.03 | \n", "d | \n", "66.18 | \n", "... | \n", "1017 | \n", "1017 | \n", "1009 | \n", "52 | \n", "0.00 | \n", "801 | \n", "Clouds | \n", "few clouds | \n", "02d | \n", "NaN | \n", "
18 | \n", "1680490800 | \n", "10000 | \n", "0.00 | \n", "2023-04-03 03:00:00 | \n", "7 | \n", "7.14 | \n", "239 | \n", "7.65 | \n", "d | \n", "69.96 | \n", "... | \n", "1016 | \n", "1016 | \n", "1008 | \n", "46 | \n", "0.00 | \n", "800 | \n", "Clear | \n", "clear sky | \n", "01d | \n", "NaN | \n", "
19 | \n", "1680501600 | \n", "10000 | \n", "0.00 | \n", "2023-04-03 06:00:00 | \n", "7 | \n", "5.61 | \n", "215 | \n", "6.69 | \n", "d | \n", "69.67 | \n", "... | \n", "1014 | \n", "1014 | \n", "1006 | \n", "45 | \n", "0.00 | \n", "800 | \n", "Clear | \n", "clear sky | \n", "01d | \n", "NaN | \n", "
20 | \n", "1680512400 | \n", "10000 | \n", "0.00 | \n", "2023-04-03 09:00:00 | \n", "9 | \n", "7.20 | \n", "145 | \n", "9.33 | \n", "n | \n", "64.62 | \n", "... | \n", "1015 | \n", "1015 | \n", "1007 | \n", "61 | \n", "0.00 | \n", "800 | \n", "Clear | \n", "clear sky | \n", "01n | \n", "NaN | \n", "
21 | \n", "1680523200 | \n", "10000 | \n", "0.00 | \n", "2023-04-03 12:00:00 | \n", "8 | \n", "6.29 | \n", "78 | \n", "13.02 | \n", "n | \n", "62.26 | \n", "... | \n", "1015 | \n", "1015 | \n", "1007 | \n", "66 | \n", "0.00 | \n", "800 | \n", "Clear | \n", "clear sky | \n", "01n | \n", "NaN | \n", "
22 | \n", "1680534000 | \n", "10000 | \n", "0.00 | \n", "2023-04-03 15:00:00 | \n", "10 | \n", "6.49 | \n", "71 | \n", "13.38 | \n", "n | \n", "62.60 | \n", "... | \n", "1014 | \n", "1014 | \n", "1006 | \n", "59 | \n", "0.00 | \n", "800 | \n", "Clear | \n", "clear sky | \n", "01n | \n", "NaN | \n", "
23 | \n", "1680544800 | \n", "10000 | \n", "0.00 | \n", "2023-04-03 18:00:00 | \n", "27 | \n", "7.27 | \n", "60 | \n", "17.76 | \n", "n | \n", "62.62 | \n", "... | \n", "1013 | \n", "1013 | \n", "1005 | \n", "56 | \n", "0.00 | \n", "802 | \n", "Clouds | \n", "scattered clouds | \n", "03n | \n", "NaN | \n", "
24 | \n", "1680555600 | \n", "10000 | \n", "0.00 | \n", "2023-04-03 21:00:00 | \n", "7 | \n", "6.98 | \n", "35 | \n", "16.13 | \n", "n | \n", "62.08 | \n", "... | \n", "1013 | \n", "1013 | \n", "1005 | \n", "46 | \n", "0.00 | \n", "800 | \n", "Clear | \n", "clear sky | \n", "01n | \n", "NaN | \n", "
25 | \n", "1680566400 | \n", "10000 | \n", "0.00 | \n", "2023-04-04 00:00:00 | \n", "15 | \n", "11.63 | \n", "4 | \n", "20.94 | \n", "d | \n", "74.53 | \n", "... | \n", "1014 | \n", "1014 | \n", "1006 | \n", "30 | \n", "0.00 | \n", "801 | \n", "Clouds | \n", "few clouds | \n", "02d | \n", "NaN | \n", "
26 | \n", "1680577200 | \n", "10000 | \n", "0.00 | \n", "2023-04-04 03:00:00 | \n", "5 | \n", "9.22 | \n", "329 | \n", "12.93 | \n", "d | \n", "81.43 | \n", "... | \n", "1012 | \n", "1012 | \n", "1004 | \n", "29 | \n", "0.00 | \n", "800 | \n", "Clear | \n", "clear sky | \n", "01d | \n", "NaN | \n", "
27 | \n", "1680588000 | \n", "10000 | \n", "0.00 | \n", "2023-04-04 06:00:00 | \n", "40 | \n", "6.42 | \n", "111 | \n", "7.83 | \n", "d | \n", "81.66 | \n", "... | \n", "1010 | \n", "1010 | \n", "1002 | \n", "29 | \n", "0.00 | \n", "802 | \n", "Clouds | \n", "scattered clouds | \n", "03d | \n", "NaN | \n", "
28 | \n", "1680598800 | \n", "10000 | \n", "0.00 | \n", "2023-04-04 09:00:00 | \n", "100 | \n", "12.88 | \n", "39 | \n", "26.69 | \n", "n | \n", "76.41 | \n", "... | \n", "1010 | \n", "1010 | \n", "1003 | \n", "33 | \n", "0.00 | \n", "804 | \n", "Clouds | \n", "overcast clouds | \n", "04n | \n", "NaN | \n", "
29 | \n", "1680609600 | \n", "10000 | \n", "0.00 | \n", "2023-04-04 12:00:00 | \n", "100 | \n", "6.11 | \n", "343 | \n", "12.55 | \n", "n | \n", "72.61 | \n", "... | \n", "1011 | \n", "1011 | \n", "1003 | \n", "44 | \n", "0.00 | \n", "804 | \n", "Clouds | \n", "overcast clouds | \n", "04n | \n", "NaN | \n", "
30 | \n", "1680620400 | \n", "10000 | \n", "0.05 | \n", "2023-04-04 15:00:00 | \n", "100 | \n", "13.47 | \n", "16 | \n", "28.70 | \n", "n | \n", "73.63 | \n", "... | \n", "1009 | \n", "1009 | \n", "1001 | \n", "34 | \n", "0.00 | \n", "804 | \n", "Clouds | \n", "overcast clouds | \n", "04n | \n", "NaN | \n", "
31 | \n", "1680631200 | \n", "10000 | \n", "0.30 | \n", "2023-04-04 18:00:00 | \n", "100 | \n", "7.31 | \n", "341 | \n", "13.40 | \n", "n | \n", "64.65 | \n", "... | \n", "1009 | \n", "1009 | \n", "1001 | \n", "78 | \n", "0.00 | \n", "500 | \n", "Rain | \n", "light rain | \n", "10n | \n", "{'3h': 0.19} | \n", "
32 | \n", "1680642000 | \n", "10000 | \n", "0.00 | \n", "2023-04-04 21:00:00 | \n", "100 | \n", "7.76 | \n", "53 | \n", "20.27 | \n", "n | \n", "66.06 | \n", "... | \n", "1008 | \n", "1008 | \n", "1000 | \n", "68 | \n", "0.00 | \n", "804 | \n", "Clouds | \n", "overcast clouds | \n", "04n | \n", "NaN | \n", "
33 | \n", "1680652800 | \n", "10000 | \n", "0.32 | \n", "2023-04-05 00:00:00 | \n", "100 | \n", "16.20 | \n", "17 | \n", "26.06 | \n", "d | \n", "66.88 | \n", "... | \n", "1007 | \n", "1007 | \n", "999 | \n", "63 | \n", "0.00 | \n", "500 | \n", "Rain | \n", "light rain | \n", "10d | \n", "{'3h': 0.17} | \n", "
34 | \n", "1680663600 | \n", "10000 | \n", "0.58 | \n", "2023-04-05 03:00:00 | \n", "87 | \n", "16.78 | \n", "351 | \n", "23.26 | \n", "d | \n", "72.36 | \n", "... | \n", "1005 | \n", "1005 | \n", "997 | \n", "64 | \n", "0.00 | \n", "500 | \n", "Rain | \n", "light rain | \n", "10d | \n", "{'3h': 0.35} | \n", "
35 | \n", "1680674400 | \n", "9854 | \n", "1.00 | \n", "2023-04-05 06:00:00 | \n", "89 | \n", "16.22 | \n", "310 | \n", "22.48 | \n", "d | \n", "67.60 | \n", "... | \n", "1004 | \n", "1004 | \n", "996 | \n", "75 | \n", "0.00 | \n", "500 | \n", "Rain | \n", "light rain | \n", "10d | \n", "{'3h': 2.25} | \n", "
36 | \n", "1680685200 | \n", "10000 | \n", "0.40 | \n", "2023-04-05 09:00:00 | \n", "32 | \n", "12.84 | \n", "322 | \n", "24.34 | \n", "n | \n", "63.99 | \n", "... | \n", "1004 | \n", "1004 | \n", "996 | \n", "84 | \n", "0.00 | \n", "500 | \n", "Rain | \n", "light rain | \n", "10n | \n", "{'3h': 0.11} | \n", "
37 | \n", "1680696000 | \n", "10000 | \n", "0.23 | \n", "2023-04-05 12:00:00 | \n", "17 | \n", "17.90 | \n", "335 | \n", "31.34 | \n", "n | \n", "63.39 | \n", "... | \n", "1003 | \n", "1003 | \n", "995 | \n", "73 | \n", "0.00 | \n", "801 | \n", "Clouds | \n", "few clouds | \n", "02n | \n", "NaN | \n", "
38 | \n", "1680706800 | \n", "10000 | \n", "0.22 | \n", "2023-04-05 15:00:00 | \n", "31 | \n", "24.56 | \n", "333 | \n", "38.39 | \n", "n | \n", "64.83 | \n", "... | \n", "1001 | \n", "1001 | \n", "993 | \n", "73 | \n", "0.00 | \n", "802 | \n", "Clouds | \n", "scattered clouds | \n", "03n | \n", "NaN | \n", "
39 | \n", "1680717600 | \n", "10000 | \n", "0.77 | \n", "2023-04-05 18:00:00 | \n", "62 | \n", "26.73 | \n", "322 | \n", "39.64 | \n", "n | \n", "62.49 | \n", "... | \n", "999 | \n", "999 | \n", "991 | \n", "88 | \n", "0.00 | \n", "500 | \n", "Rain | \n", "light rain | \n", "10n | \n", "{'3h': 2.56} | \n", "
40 rows × 23 columns
\n", "