Python爬取广州、深圳、河源、惠州四个城市天气数据,并作数据可视化

news2024/11/30 6:44:22

本文爬取的网站是天气,天气预报查询,24小时,今天,明天,未来一周7天,10天,15天,40天查询_2345天气王

 

1.爬取广惠河深2022-2024年的数据 

import requests     # 发送请求要用的模块 需要额外安装的
import parsel
import csv

f = open('广-惠-河-深天气.csv', mode='a', encoding='utf-8', newline='')
csv_writer = csv.writer(f)
csv_writer.writerow(['日期', '最高温度', '最低温度', '天气', '风向', '城市'])
city_list = [72049, 59287,59293,59493]
for city in city_list:
    city_name = ''
    if city == 72049:
        city_name = '惠州'
    elif city == 59287:
        city_name = '广州'
    elif city == 59293:
        city_name = '河源'
    elif city == 59493:
        city_name = '深圳'
    for year in range(2022, 2024):
        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)
            # 2. 获取数据
            html_data = response.json()['data']
            # 3. 解析数据
            select = parsel.Selector(html_data)
            trs = select.css('.history-table tr')   # 拿到31个tr
            for tr in trs[1:]:                      # 第一个表头不要
                tds = tr.css('td::text').getall()   # 针对每个tr进行提取 取出所有的td里面的内容
                tds.append(city_name)               # 把城市追加到列表里面
                print(tds)
                # 4. 保存数据
                csv_writer.writerow(tds)

爬取的数据如下图所示 

 

 

 2.读取csv文件

import pandas as pd
data = pd.read_csv('广-惠-河-深天气.csv')
data

 

3.去除多余字符

#去除多余字符
data[['最高温度','最低温度']] = data[['最高温度','最低温度']].apply(lambda x: x.str.replace('°','').replace('', '0'))
data.head()

 

 

4.分割星期和日期

#分割日期与星期
data[['日期','星期']] = data['日期'].str.split(' ',expand=True,n=1)
data

 

 

5.筛选出城市数据子集。其中包含了四个城市在不同天气下的天数统计结果。

# 按城市和天气分组,并计算每组的天数
grouped = data.groupby(['城市', '天气']).size().reset_index(name='天数')

# 将结果按城市分为4个DataFrame
gz_weather = grouped[grouped['城市'] == '广州']
hy_weather = grouped[grouped['城市'] == '河源']
hz_weather = grouped[grouped['城市'] == '惠州']
sz_weather = grouped[grouped['城市'] == '深圳']
gz_weather
hy_weather
hz_weather
sz_weather

 

 6.将原有的天气类型按照关键字划分

# 定义一个函数,将原有的天气类型按照关键字划分
def classify_weather(weather):
    if '多云' in weather:
        return '多云'
    elif '晴' in weather:
        return '晴'
    elif '阴' in weather:
        return '阴'
    elif '大雨' in weather:
        return '雨'
    elif '中雨' in weather:
        return '雨'
    elif '小雨' in weather:
        return '雨'
    elif '雷阵雨' in weather:
        return '雨'
    elif '雾' in weather:
        return '雾'
    else:
        return '其他'

# 将原有的天气类型按照关键字划分,并存进新的 DataFrame 中
new_data = data[['城市', '天气']].copy()
new_data['新天气'] = new_data['天气'].apply(classify_weather)
new_data

 

 

7.对城市的天气数据按照新天气列分组后,计算每一种天气的天数,然后将“天气”列名改为“天数”得到的数据框。

# 按照城市和新天气列进行分组,并计算每一种天气的天数
count_data = new_data.groupby(['城市', '新天气'])['天气'].count().reset_index()
# 根据条件筛选出符合要求的行
df1 = count_data.loc[count_data['城市'] == '广州']
df2 = count_data.loc[count_data['城市'] == '河源']
df3 = count_data.loc[count_data['城市'] == '惠州']
df4 = count_data.loc[count_data['城市'] == '深圳']
# 将“天气”列名改为“天数”
df5 = df1.rename(columns={'天气': '天数'})
df6 = df2.rename(columns={'天气': '天数'})
df7 = df3.rename(columns={'天气': '天数'})
df8 = df4.rename(columns={'天气': '天数'})
# 输出结果
df5.to_csv('df5.csv',index=False)

上面输出结果保存到csv文件中,如果要查看可以输出df5 查看数据

 

 

8.筛选出每个城市平均温度等于最高温度和最低温度平均值的数据

# 筛选出平均温度等于最高温度和最低温度平均值的数据
data1 = data[(data['平均温度'] == (data['最高温度'] + data['最低温度']) / 2)]

data_AB = data1[(data1['城市'] == '广州') | (data1['城市'] == '深圳') | (data1['城市'] == '河源') | (data1['城市'] == '惠州')]

#将日期转换为月份并赋值给新的列
data_AB['月份'] = pd.to_datetime(data_AB['日期']).dt.month

#按照城市和月份分组,计算每组的平均气温
grouped_AB = data_AB.groupby(['城市', '月份'])['平均温度'].mean().reset_index()

#按照城市和月份排序
grouped_AB = grouped_AB.sort_values(['城市', '月份'])

#打印结果
grouped_AB

 

 

9.绘制广州、河源、惠州和深圳每日平均温度的折线图

import matplotlib as mpl
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
# 筛选出广州和湛江的数据
gz_data = data[data['城市'] == '广州']
hy_data = data[data['城市'] == '河源']
hz_data = data[data['城市'] == '惠州']
sz_data = data[data['城市'] == '深圳']

# 提取日期和平均温度数据
x = gz_data['日期']
y1 = gz_data['平均温度']
y2 = hy_data['平均温度']
y3 = hz_data['平均温度']
y4 = sz_data['平均温度']

# 绘制折线图
plt.figure(dpi=500, figsize=(10, 5))
plt.title("广河惠深每日平均温度折线图")
plt.plot(x, y1, color='red', label='广州')
plt.plot(x, y2, color='blue', label='河源')
plt.plot(x,y3,color='green',label='惠州')
plt.plot(x,y4,color='yellow',label='深圳')
# 获取图的坐标信息
coordinates = plt.gca()
# 设置x轴每个刻度的间隔天数
xLocator = mpl.ticker.MultipleLocator(30)
coordinates.xaxis.set_major_locator(xLocator)
# 将日期旋转30°
plt.xticks(rotation=30)
plt.xticks(fontsize=8)
plt.ylabel("温度(℃)")
plt.xlabel("日期")
plt.legend()
plt.savefig("广河惠深每日平均温度折线图.png")
plt.show()

 

 

10.绘制城市为广州、惠州、深圳、河源的月平均气温数据

data_GZ_HZ_SZ_HY = grouped_AB[(grouped_AB['城市'] == '广州') | (grouped_AB['城市'] == '惠州') | (grouped_AB['城市'] == '深圳') | (grouped_AB['城市'] == '河源')]

#绘制折线图
fig, ax = plt.subplots()
for city in ['广州', '惠州', '深圳', '河源']:
    ax.plot(data_GZ_HZ_SZ_HY[data_GZ_HZ_SZ_HY['城市'] == city]['月份'], data_GZ_HZ_SZ_HY[data_GZ_HZ_SZ_HY['城市'] == city]['平均温度'], label=city)

#设置图例和标题
ax.legend()
ax.set_title('广州、惠州、深圳、河源每月气温折线图')

#显示图形
plt.show()

 

 

11.绘制四个城市数据对比


import matplotlib.pyplot as plt

#创建一个画布
fig, ax = plt.subplots(figsize=(10, 5))

#绘制广州各类天气条形图
ax.bar(df5['新天气'], df5['天数'], width=0.2, label='广州')

#绘制惠州各类天气条形图
ax.bar(df7['新天气'], df7['天数'], width=0.2, label='惠州', alpha=0.7)

#绘制河源各类天气条形图
ax.bar(df6['新天气'], df6['天数'], width=0.2, label='河源', alpha=0.7)

#绘制深圳各类天气条形图
ax.bar(df8['新天气'], df8['天数'], width=0.2, label='深圳', alpha=0.7)

#设置图例
ax.legend()

#设置 x 轴标签和标题
ax.set_xlabel('天气类型')
ax.set_ylabel('天数')
ax.set_title('广州、惠州、河源、深圳各类天气天数对比')

#显示图表
plt.show()

 

 

12.各个城市天气占比

import pandas as pd
from pyecharts.charts import Pie
from pyecharts import options as opts

# 读取csv文件并转换为列表格式
df = pd.read_csv('df5.csv')
data_list = df[['新天气', '天数']].values.tolist()

# 生成饼图
pie = Pie()
pie.add("", data_list)
pie.set_global_opts(title_opts=opts.TitleOpts(title="广州各类天气天数占比"))
pie.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}"))
pie.render_notebook()

 

 

import pandas as pd
from pyecharts.charts import Pie
from pyecharts import options as opts

# 读取csv文件并转换为列表格式
df = pd.read_csv('df6.csv')
data_list = df[['新天气', '天数']].values.tolist()

# 生成饼图
pie = Pie()
pie.add("", data_list)
pie.set_global_opts(title_opts=opts.TitleOpts(title="河源各类天气天数占比"))
pie.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}"))
pie.render_notebook()

 

 

import pandas as pd
from pyecharts.charts import Pie
from pyecharts import options as opts

# 读取csv文件并转换为列表格式
df = pd.read_csv('df7.csv')
data_list = df[['新天气', '天数']].values.tolist()

# 生成饼图
pie = Pie()
pie.add("", data_list)
pie.set_global_opts(title_opts=opts.TitleOpts(title="惠州各类天气天数占比"))
pie.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}"))
pie.render_notebook()

 

 

import pandas as pd
from pyecharts.charts import Pie
from pyecharts import options as opts

# 读取csv文件并转换为列表格式
df = pd.read_csv('df8.csv')
data_list = df[['新天气', '天数']].values.tolist()

# 生成饼图
pie = Pie()
pie.add("", data_list)
pie.set_global_opts(title_opts=opts.TitleOpts(title="深圳各类天气天数占比"))
pie.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}"))
pie.render_notebook()

13.统计四个城市每日气温折线图

import matplotlib.pyplot as plt
import matplotlib as mpl
import pandas as pd
# 筛选出广州和湛江的数据
gz_data = data[data['城市'] == '广州']
hy_data = data[data['城市'] == '河源']
hz_data = data[data['城市'] == '惠州']
sz_data = data[data['城市'] == '深圳']

# 提取日期和平均温度数据
x = gz_data['日期']
y1 = gz_data['平均温度']
y2 = hy_data['平均温度']
y3 = hz_data['平均温度']
y4 = sz_data['平均温度']

# 绘制面积图
plt.figure(dpi=500, figsize=(10, 5))
plt.title("广州惠州河源深圳折线图")
plt.fill_between(x, y1, color='red', alpha=0.5, label='广州')
plt.fill_between(x, y2, color='blue', alpha=0.5, label='河源')
plt.fill_between(x, y3, color='blue', alpha=0.5, label='惠州')
plt.fill_between(x, y4, color='blue', alpha=0.5, label='深圳')
# 获取图的坐标信息
coordinates = plt.gca()
# 设置x轴每个刻度的间隔天数
xLocator = mpl.ticker.MultipleLocator(30)
coordinates.xaxis.set_major_locator(xLocator)
# 将日期旋转30°
plt.xticks(rotation=30)
plt.xticks(fontsize=8)
plt.ylabel("温度(℃)")
plt.xlabel("日期")
plt.legend()
plt.savefig("广-惠-河-深折线图")
plt.show()

14.读取四个城市各类天气天数对比图

import matplotlib.pyplot as plt
from pyecharts.charts import Bar
# 读取广州数据并生成柱状图
df1 = pd.read_csv('df5.csv')
data_list1 = df1[['新天气', '天数']].values.tolist()

# 读取河源数据并生成柱状图
df2 = pd.read_csv('df6.csv')
data_list2 = df2[['新天气', '天数']].values.tolist()

# 读取惠州数据并生成柱状图
df3 = pd.read_csv('df7.csv')
data_list3 = df3[['新天气', '天数']].values.tolist()

# 读取深圳数据并生成柱状图
df4 = pd.read_csv('df8.csv')
data_list4 = df4[['新天气', '天数']].values.tolist()
# 合并 x 轴数据
x_data = list(set([i[0] for i in data_list1] + [i[0] for i in data_list2] + [i[0] for i in data_list3] + [i[0] for i in data_list4]))

# 生成柱状图
bar = Bar()
bar.add_xaxis(x_data)
bar.add_yaxis("广州", [df1.loc[df1['新天气']==x, '天数'].tolist()[0] if x in df1['新天气'].tolist() else 0 for x in x_data])
bar.add_yaxis("河源", [df2.loc[df2['新天气']==x, '天数'].tolist()[0] if x in df2['新天气'].tolist() else 0 for x in x_data])
bar.add_yaxis("惠州", [df3.loc[df3['新天气']==x, '天数'].tolist()[0] if x in df3['新天气'].tolist() else 0 for x in x_data])
bar.add_yaxis("深圳", [df4.loc[df4['新天气']==x, '天数'].tolist()[0] if x in df4['新天气'].tolist() else 0 for x in x_data])
bar.set_global_opts(title_opts=opts.TitleOpts(title="广州惠州河源深圳各类天气天数对比图"),
                     xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=-45)),
                     legend_opts=opts.LegendOpts(pos_left="center"))
bar.render_notebook()

 15.读取四个城市当中一个城市的天气天数对比图

import matplotlib.pyplot as plt
from pyecharts.charts import Bar
# 读取惠州数据并生成柱状图
df3 = pd.read_csv('df7.csv')
data_list3 = df3[['新天气', '天数']].values.tolist()
# 生成柱状图
bar = Bar()
bar.add_xaxis(x_data)
bar.add_yaxis("惠州", [df3.loc[df3['新天气']==x, '天数'].tolist()[0] if x in df3['新天气'].tolist() else 0 for x in x_data])
bar.set_global_opts(title_opts=opts.TitleOpts(title="广州惠州河源深圳各类天气天数对比图"),
                     xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=-45)),
                     legend_opts=opts.LegendOpts(pos_left="center"))
bar.render_notebook()

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/619816.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【自学网安必看】自学网络安全遇到的问题及解决方法!

自学网络安全很容易学着学着就迷茫了,找到源头问题,解决它就可以了,所以首先咱们聊聊,学习网络安全方向通常会有哪些问题,看到后面有惊喜哦 1、打基础时间太长 学基础花费很长时间,光语言都有几门&#x…

STM32 HAL库开发——入门篇(1)

目录 一、GPIO 1.1 什么是GPIO 1.2 GPIO简介 1.2.1 GPIO特点 1.2.2 GPIO电气特性 1.2.3 GPIO引脚分布 1.3 IO端口基本结构介绍 1.4 GPIO的八种模式 1.5 GPIO的寄存器介绍 1.6 通用外设驱动模型(四步法) 1.7 GPIO配置步骤 1.8 编程实战…

用Notes打造一个资讯中心

大家好,才是真的好。 有一段时间,我介绍过,从Domino 10版本开始,LotusScript增强了网络数据访问和JSON解析功能等,从而可以从网上获取很多资讯,例如即时新闻、股市资讯等等。 例如我们采用Notes内置的讨论…

多线程-线程安全的懒汉式_死锁-ReentrantLock的使用

线程安全的懒汉式_死锁-ReentrantLock的使用 解决单例模式中的懒汉式的线程安全问题 解决单例模式中的懒汉式的线程安全问题> 饿汉式:不存在线程安全问题。 > 懒汉式:存在线程安全问题,(需要使用同步机制来处理&#xff0…

案例39:基于Java办公自动化管理系统开题报告设计

博主介绍:✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专…

Spring架构篇--2.7.3 远程通信基础--Netty原理--bind实现端口的绑定

前言:在对ServerBootstrap 进行属性赋值之后,通过bind 方法完成端口的绑定,并开始在NioEventLoop中进行轮询进行事件的处理;本文主要探究ServersocketChannel 在netty 中是如何完成注册,以及端口的绑定 1 Nio selecto…

两个月涨粉90万,B站内容风向又有新指示?

6月1日,B站公布了2023年第一季度财报。 财报中显示第一季度,B站日均活跃用户达9370万,同比增长18%。用户日均使用时长96分钟,日均视频播放量达41亿,其中,本季度B站Story-Mode竖屏视频日均播放量同比增长82…

网络安全怎么学?才不会成为脚本小子?

一,怎么入门? 1、Web 安全相关概念(2 周) 了解网络安全相关法律法规 熟悉基本概念(SQL 注入、上传、XSS、CSRF、一句话木马等)。 通过关键字(SQL 注入、上传、XSS、CSRF、一句话木马等&#…

Python使用WMI模块获取Windows系统的硬件信息,并使用pyinstaller库编译打包成exe的可执行文件

引言 今天给大家分享一篇有关Python和Windows系统的文章。你有没有想过如何获取Windows系统的硬件信息?或者你是否曾经尝试过将Python脚本编译打包成可执行文件?如果你对这些问题感兴趣,那么这篇文章一定适合你。 背景 由于公司现阶段大多…

软件兼容性测试怎么进行?兼容性测试有什么作用?

随着软件的不断更新和升级,兼容性测试也逐渐成为了软件测试的一项重要内容。那么,软件兼容性测试到底是什么?怎么进行?又有什么作用呢? 一、什么是软件兼容性测试? 软件兼容性测试是指在不同的操作系统、硬件设备、浏览器等多个环境下测试软件的可…

VulnHub项目:Hogwarts:Bellatrix

靶机地址:Hogwarts: Bellatrix ~ VulnHub 哈利波特系列~有趣~~~ 渗透过程: 首先获取靶机ip地址 对其端口探测 访问web端口,发现了小天狼星的堂姐Bellatrix Lestrange贝拉特里克斯莱斯特兰奇那个疯狂的女人!!&#x…

天涯直播筹资300万,七天仅赚14.99万,重启计划岌岌可危

我是卢松松,点点上面的头像,欢迎关注我哦! 天涯前天涯社区总编直播卖货欲筹300万,重启天涯。直播七天七夜只赚了14.99万。对于普通人来说,这收入真的是望尘莫及了,但对于天涯来说杯水车薪。 也许天涯部分…

前端工程化初体验

最近在尝试着完整地体验一下前端工程化需要的那些流程,于是自己尝试一套属于自己的前端工程化流程。 前端工程化需要做什么: 1、创建项目需要有项目模板资源,所以这里我创建了一个前端脚手架CLI工具,mfex-project,主…

Win10系统蓝屏如何使用U盘重装系统?

Win10系统蓝屏如何使用U盘重装系统?很多用户遇到了电脑系统蓝屏问题之后,都不知道怎么去进行系统重装的方法。其实系统重装没有大家想象的那么困难,以下为大家带来详细的图文教程分享。 准备工作: 1、U盘一个(尽量使用…

2023年5月CSDN客服月报|解决5个重大问题和18个次要问题,采纳1个用户建议,处理2个用户需求

听用户心声,解用户之需。hello,大家好,这里是《CSDN客诉报告》第20期,接下来就请大家一同回顾我们5月份解决的bug~ 一、重大问题 1、【商城】已支付订单权益未正常下发 反馈量:23 2、【UC】收藏/评论/账…

2023年湖北高考作文AI写

本文由 大侠(AhcaoZhu)原创,转载请声明。 链接: https://blog.csdn.net/Ahcao2008 2023年湖北高考作文AI写 🧊摘要🧊原题🧊解析🧊AIGCInsCode AI 创作助手文心一言讯飞星火 SparkDeskChatGPT3.5 🧊摘要 本文…

CANoe学习笔记一

目录 摘要 1、CANoe工程的新建 2、通过Trace工具查看交互的报文内容 3、通过Logging保存日志文件 4、创建IG发送报文 5、通过Graphics界面抓取信号波形 6、加载cdd文件 7、过滤报文ID的接收 8、其他 摘要 CANoe是德国Vector公司为汽车总线的开发而设计的一款总线开发环…

nuxt3.0学习-四、nuxt3.0的middleware(中间键)、composables(可组合物)以及Plugins(插件目录)

Nuxt3.0中间键了解地址 Nuxt提供了一个可定制的路由中间件框架,您可以在整个应用程序中使用它,非常适合在导航到特定路由之前提取要运行的代码; 路由中间件有三种: 匿名(或内联)路由中间件,直…

最佳 AI 生产力工具:更聪明地工作,而不是更努力地工作

在20世纪50年代,AI 在内存耗尽之前几乎无法完成跳棋游戏。 快进七个激动人心的十年,可以理解自然语言的人工智能系统——大型语言模型 (LLM)——正在成为我们数字工具箱中的重要工具。 在今天的文章中,我们梳理了一些提高生产力的最佳人工智…

【SpringBoot】 设置随机数据 用于测试用例

个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~ 个人主页:.29.的博客 学习社区:进去逛一逛~ 设置随机数据——常用于测试用例 SpringBoot设…