python采集天气数据并做数据可视化
作者:魔王不会哭 发布时间:2022-07-16 15:26:39
标签:python,天气,可视化
前言
最近天气好像有了点小脾气,总是在万分晴朗得时候耍点小性子~
阴会天,下上一会的雨~提醒我们时刻记得带伞哦,不然会被雨淋或者被太阳公公晒到 😜
那么今天我就来分享一下采集天气数据 并做数据可视化的代码吧~
知识点:
动态数据抓包
requests发送请求
结构化+非结构化数据解析
开发环境:
python 3.8 运行代码
pycharm 2021.2 辅助敲代码
requests
如果安装python第三方模块:
win + R 输入 cmd 点击确定, 输入安装命令 pip install 模块名 (pip install requests) 回车
在pycharm中点击Terminal(终端) 输入安装命令
代码实现:
发送请求
获取数据
解析数据
保存数据
采集天气数据代码
导入模块
import requests # 第三方模块 提前安装 发送请求 (Python里面浏览器) 爆红是因为你没有安装模块
# 如果安装了 但还是爆红是因为什么呢? 解释器在pycharm里面配置的不对
import parsel
import csv
# 翻译插件
with open('天气.csv', mode='a', encoding='utf-8', newline='') as f:
csv_writer = csv.writer(f)
csv_writer.writerow(["日期", "最高温度", "最低温度", "天气", "风向", "城市"])
city_list = [54511, 58362, 59287, 59493]
for city in city_list:
for year in range(2011, 2022):
for month in range(1, 13):
url = f'https://tianqi.2345.com/Pc/GetHistory?areaInfo%5BareaId%5D={city}&areaInfo%5BareaType%5D=2&date%5Byear%5D={year}&date%5Bmonth%5D={month}'
1. 发送请求
response = requests.get(url=url)
# <Response [200]>: 请求成功
2. 获取数据
# json数据传输格式
json_data = response.json()
# 字典类型数据
3. 解析数据
# 结构化数据解析
html_data = json_data['data']
selector = parsel.Selector(html_data)
# 正则 css xpath json字典数据解析
tr_list = selector.css('.history-table tr')
# tr_list[1:] 从列表的第二个元素开始取
for tr in tr_list[1:]:
# <X>fhwaeuifhwiuf</X>
td = tr.css('td::text').getall()
if td[2] == '°':
td[2] = td[1]
if city == 54511:
td.append("北京")
elif city == 58362:
td.append("上海")
elif city == 59287:
td.append("广州")
elif city == 59493:
td.append("深圳")
print(td)
# 文件名 写入方式 追加写入 编码方式 utf-8 数据空行
with open('天气.csv', mode='a', encoding='utf-8', newline='') as f:
csv_writer = csv.writer(f)
csv_writer.writerow(td)
数据分析代码
导入包
import pandas as pd
import datetime
from pyecharts import options as opts
from pyecharts.charts import *
from pyecharts.commons.utils import JsCode
读入数据
data = pd.read_csv('天气.csv')
data
数据预览
data.sample(5)
data.info()
分割日期/星期
data[['日期','星期']] = data['日期'].str.split(' ',expand=True,n=1)
data
去除多余字符
data[['最高温度','最低温度']] = data[['最高温度','最低温度']].apply(lambda x: x.str.replace('°',''))
data.head()
计算下雪天气
data.loc[data['天气'].str.contains('雪'),'下雪吗']='是'
data.fillna('否',inplace=True)
分割日期时间
data['日期'] = pd.to_datetime(data['日期'])
data[['最高温度','最低温度']] = data[['最高温度','最低温度']].astype('int')
data['年份'] = data['日期'].dt.year
data['月份'] = data['日期'].dt.month
data['日'] = data['日期'].dt.day
# 预览
data.sample(5)
各城市初雪的时间
s_data = data[data['下雪吗']=='是']
s_data[(s_data['月份']>=9)].groupby('年份').first().reset_index()
各城市下雪天气分布
s_data.groupby(['城市','年份'])['日期'].count().to_frame('下雪天数').reset_index()
做透视表
data_bj = data[(data['年份'] == 2021) & (data['城市'] == '北京')]
data_bj = data_bj.groupby(['月份','天气'], as_index=False)['日期'].count()
data_pivot = pd.pivot(data_bj,
values='日期',
index='月份',
columns='天气')
data_pivot = data_pivot.astype('float')
# 按照 索引年月倒序排序
data_pivot.sort_index(ascending=False,inplace=True)
# 资料、解答、教程可加Q :261823976免费领
data_pivot
北上广深2021年10月份天气热力图分布
import matplotlib.pyplot as plt
import matplotlib.colors as mcolors
import seaborn as sns
#设置全局默认字体 为 雅黑
plt.rcParams['font.family'] = ['Microsoft YaHei']
# 设置全局轴标签字典大小
plt.rcParams["axes.labelsize"] = 14
# 设置背景
sns.set_style("darkgrid",{"font.family":['Microsoft YaHei', 'SimHei']})
# 设置画布长宽 和 dpi
plt.figure(figsize=(18,8),dpi=100)
# 自定义色卡
cmap = mcolors.LinearSegmentedColormap.from_list("n",['#95B359','#D3CF63','#E0991D','#D96161','#A257D0','#7B1216'])
# 绘制热力图
ax = sns.heatmap(data_pivot, cmap=cmap, vmax=30,
annot=True, # 热力图上显示数值
linewidths=0.5,
)
# 将x轴刻度放在最上面
ax.xaxis.set_ticks_position('top')
plt.title('北京最近10个月天气分布',fontsize=16) #图片标题文本和字体大小
plt.show()
data_gz= data[(data['年份'] == 2021) & (data['城市'] == '广州')]
data_gz = data_gz.groupby(['月份','天气'], as_index=False)['日期'].count()
data_sz= data[(data['年份'] == 2021) & (data['城市'] == '深圳')]
data_sz = data_sz.groupby(['月份','天气'], as_index=False)['日期'].count()
data_sh= data[(data['年份'] == 2021) & (data['城市'] == '上海')]
data_sh = data_sh.groupby(['月份','天气'], as_index=False)['日期'].count()
data_pivot_sz = pd.pivot(data_sz,
values='日期',
index='月份',
columns='天气')
data_pivot_sz = data_pivot_sz.astype('float')
# 按照 索引年月倒序排序
data_pivot_sz.sort_index(ascending=False,inplace=True)
#设置全局默认字体 为 雅黑
plt.rcParams['font.family'] = ['Microsoft YaHei']
# 设置全局轴标签字典大小
plt.rcParams["axes.labelsize"] = 14
# 设置背景
sns.set_style("darkgrid",{"font.family":['Microsoft YaHei', 'SimHei']})
# 设置画布长宽 和 dpi
plt.figure(figsize=(18,8),dpi=100)
# 自定义色卡
cmap = mcolors.LinearSegmentedColormap.from_list("n",['#95B359','#D3CF63','#E0991D','#D96161','#A257D0','#7B1216'])
# 绘制热力图
ax_sz = sns.heatmap(data_pivot_sz, cmap=cmap, vmax=31,
annot=True, # 热力图上显示数值
linewidths=0.5,
)
# 将x轴刻度放在最上面
ax_sz.xaxis.set_ticks_position('top')
plt.title('深圳最近10个月天气分布',fontsize=16) #图片标题文本和字体大小
plt.show()
data_pivot_gz = pd.pivot(data_gz,
values='日期',
index='月份',
columns='天气')
data_pivot_gz = data_pivot_gz.astype('float')
# 按照 索引年月倒序排序
data_pivot_gz.sort_index(ascending=False,inplace=True)
#设置全局默认字体 为 雅黑
plt.rcParams['font.family'] = ['Microsoft YaHei']
# 设置全局轴标签字典大小
plt.rcParams["axes.labelsize"] = 14
# 设置背景
sns.set_style("darkgrid",{"font.family":['Microsoft YaHei', 'SimHei']})
# 设置画布长宽 和 dpi
plt.figure(figsize=(18,8),dpi=100)
# 自定义色卡
cmap = mcolors.LinearSegmentedColormap.from_list("n",['#95B359','#D3CF63','#E0991D','#D96161','#A257D0','#7B1216'])
# 绘制热力图
ax_sz = sns.heatmap(data_pivot_gz, cmap=cmap, vmax=31,
annot=True, # 热力图上显示数值
linewidths=0.5,
)
# 将x轴刻度放在最上面
ax_sz.xaxis.set_ticks_position('top')
plt.title('广州最近10个月天气分布',fontsize=16) #图片标题文本和字体大小
plt.show()
# 资料、解答、教程可加Q :261823976免费领
data_pivot_sh = pd.pivot(data_sh,
values='日期',
index='月份',
columns='天气')
data_pivot_sh = data_pivot_sh.astype('float')
# 按照 索引年月倒序排序
data_pivot_sh.sort_index(ascending=False,inplace=True)
#设置全局默认字体 为 雅黑
plt.rcParams['font.family'] = ['Microsoft YaHei']
# 设置全局轴标签字典大小
plt.rcParams["axes.labelsize"] = 14
# 设置背景
sns.set_style("darkgrid",{"font.family":['Microsoft YaHei', 'SimHei']})
# 设置画布长宽 和 dpi
plt.figure(figsize=(18,8),dpi=100)
# 自定义色卡
cmap = mcolors.LinearSegmentedColormap.from_list("n",['#95B359','#D3CF63','#E0991D','#D96161','#A257D0','#7B1216'])
# 绘制热力图
ax_sz = sns.heatmap(data_pivot_sh, cmap=cmap, vmax=31,
annot=True, # 热力图上显示数值
linewidths=0.5,
)
# 将x轴刻度放在最上面
ax_sz.xaxis.set_ticks_position('top')
plt.title('上海最近10个月天气分布',fontsize=16) #图片标题文本和字体大小
plt.show()
data_bj = data[(data['城市']=='北京') & (data['年份'] == 2021)]
data_bj['日期'] = pd.to_datetime(data_bj.日期,format="%Y年%m月%d日")
data_bj = data_bj.sort_values(by='日期',ascending=True)
北京2021年每日最高最低温度变化
color0 = ['#FF76A2','#24ACE6']
color_js0 = """new echarts.graphic.LinearGradient(0, 1, 0, 0,
[{offset: 0, color: '#FFC0CB'}, {offset: 1, color: '#ed1941'}], false)"""
color_js1 = """new echarts.graphic.LinearGradient(0, 1, 0, 0,
[{offset: 0, color: '#FFFFFF'}, {offset: 1, color: '#009ad6'}], false)"""
tl = Timeline()
for i in range(0,len(data_bj)):
coordy_high = list(data_bj['最高温度'])[i]
coordx = list(data_bj['日期'])[i]
coordy_low = list(data_bj['最低温度'])[i]
x_max = list(data_bj['日期'])[i]+datetime.timedelta(days=10)
y_max = int(max(list(data_bj['最高温度'])[0:i+1]))+3
y_min = int(min(list(data_bj['最低温度'])[0:i+1]))-3
title_date = list(data_bj['日期'])[i].strftime('%Y-%m-%d')
c = (
Line(
init_opts=opts.InitOpts(
theme='dark',
#设置动画
animation_opts=opts.AnimationOpts(animation_delay_update=800),#(animation_delay=1000, animation_easing="elasticOut"),
#设置宽度、高度
width='1500px',
height='900px', )
)
.add_xaxis(list(data_bj['日期'])[0:i])
.add_yaxis(
series_name="",
y_axis=list(data_bj['最高温度'])[0:i], is_smooth=True,is_symbol_show=False,
linestyle_opts={
'normal': {
'width': 3,
'shadowColor': 'rgba(0, 0, 0, 0.5)',
'shadowBlur': 5,
'shadowOffsetY': 10,
'shadowOffsetX': 10,
'curve': 0.5,
'color': JsCode(color_js0)
}
},
itemstyle_opts={
"normal": {
"color": JsCode(
"""new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
offset: 0,
color: '#ed1941'
}, {
offset: 1,
color: '#009ad6'
}], false)"""
),
"barBorderRadius": [45, 45, 45, 45],
"shadowColor": "rgb(0, 160, 221)",
}
},
)
.add_yaxis(
series_name="",
y_axis=list(data_bj['最低温度'])[0:i], is_smooth=True,is_symbol_show=False,
# linestyle_opts=opts.LineStyleOpts(color=color0[1],width=3),
itemstyle_opts=opts.ItemStyleOpts(color=JsCode(color_js1)),
linestyle_opts={
'normal': {
'width': 3,
'shadowColor': 'rgba(0, 0, 0, 0.5)',
'shadowBlur': 5,
'shadowOffsetY': 10,
'shadowOffsetX': 10,
'curve': 0.5,
'color': JsCode(color_js1)
}
},
)
.set_global_opts(
title_opts=opts.TitleOpts("北京2021年每日最高最低温度变化\n\n{}".format(title_date),pos_left=330,padding=[30,20]),
xaxis_opts=opts.AxisOpts(type_="time",max_=x_max),#, interval=10,min_=i-5,split_number=20,axistick_opts=opts.AxisTickOpts(length=2500),axisline_opts=opts.AxisLineOpts(linestyle_opts=opts.LineStyleOpts(color="grey"))
yaxis_opts=opts.AxisOpts(min_=y_min,max_=y_max),#坐标轴颜色,axisline_opts=opts.AxisLineOpts(linestyle_opts=opts.LineStyleOpts(color="grey"))
)
)
tl.add(c, "{}".format(list(data_bj['日期'])[i]))
tl.add_schema(
axis_type='time',
play_interval=100, # 表示播放的速度
pos_bottom="-29px",
is_loop_play=False, # 是否循环播放
width="780px",
pos_left='30px',
is_auto_play=True, # 是否自动播放。
is_timeline_show=False)
tl.render_notebook()
# 资料、解答、教程可加Q :261823976免费领
data_10 = data[(data['年份'] == 2021) & ( data['月份'] == 10)]
data_10.head()
尾语
来源:https://blog.csdn.net/python56123/article/details/125599827


猜你喜欢
- 介绍该数独可能只填充了部分数字,其中缺少的数字用 . 表示。注意事项一个合法的数独(仅部分填充)并不一定是可解的。我们仅需使填充的空格有效即
- 本文实例讲述了Python多重继承的方法解析执行顺序。分享给大家供大家参考,具体如下:任何实现多重继承的语言都要处理潜在的命名冲突, 这种冲
- 可以通过浏览器在访问者的硬盘上创建文件,因为我开始试了一下真的可以,不信你把下面这段代码COPY到一个HTML文件当中再运行一下! <
- 一:模板要了解jinja2,那么需要先理解模板的概念。模板在Python的web开发中广泛使用,它能够有效的将业务逻辑和页面逻辑分开,使代码
- python变量1. 定义变量 (创建变量)变量就是一种用来保存数据的容器,使用变量就是使用变量中保存的数据语法:变量名 = 数据1.变量名
- CAPTCHA,全称为“Completely Automated Public Turing test to tell Computers
- 1. 查询 除了单条记录的查询,这里我们来尝试查询一组记录。IUserMapper接口添加下面方法:List<User> get
- 分页显示是页面常用技术,可用下列代码来实现:<%page=Request.QueryString("page&q
- 1、搭载QT环境按win+R输入 pip install pyqt5 下载QT5 当然也可以去Qt的官网的下载 ,使用命令行更快捷方便 所以
- 安装Tornado省事点可以直接用grequests库,下面用的是tornado的异步client。 异步用到了tornado,根据官方文档
- 说明本实例能够监控聚划算的抢购按钮,在聚划算整点聚的时间到达时发出提醒(音频文件自己定义位置)并自动弹开页面(URL自己定义)。同时还可以通
- 引言书接上回 Gradio机器学习模型快速部署工具【quickstart】翻译,讲到多输入输出,其实很简单,就是把多个组件包装到列表,inp
- 网上商城数据库-用户信息数据操作项目描述在电子商务兴起的大环境下,建立利用互联网开拓销售渠道,帮助企业及时调整商品结构,协助经销商打开货源的
- 一、split()函数的简单应用1.join()函数Python join() 方法用于将序列中的元素以指定的字符连接生成一个新的字符串。j
- 实例如下:<?php /** * @name thumb 缩略图函数 * @param sting  
- 介绍文档解析涉及检查文档中的数据并提取有用的信息。它可以通过自动化减少了大量的手工工作。一种流行的解析策略是将文档转换为图像并使用计算机视觉
- 在代码中添加以下两行可以解决:torch.backends.cudnn.enabled = Truetorch.backends.cudnn
- pandas是什么?是它吗?。。。。很显然pandas没有这个家伙那么可爱。。。。我们来看看pandas的官网是怎么来定义自己的:panda
- 本文实例为大家分享了tensorflow实现线性回归的具体代码,供大家参考,具体内容如下一、随机生成1000个点,分布在y=0.1x+0.3
- 本文实例讲述了Python连接MongoDB数据库的方法。分享给大家供大家参考,具体如下:Python使用pymongo操作MongoDB数