前言

最近天气好像有了点小脾气,总是在万分晴朗得时候耍点小性子~

阴会天,下上一会的雨~提醒我们时刻记得带伞哦,不然会被雨淋或者被太阳公公晒到 😜

那么今天我就来分享一下采集天气数据 并做数据可视化的代码吧~

知识点:

动态数据抓包

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[areaId]={city}&areaInfo[areaType]=2&date[year]={year}&date[month]={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()

尾语

到此这篇关于python采集天气数据并做数据可视化的文章就介绍到这了,更多相关python采集天气可视化内容请搜索Devmax以前的文章或继续浏览下面的相关文章希望大家以后多多支持Devmax!

python采集天气数据并做数据可视化的更多相关文章

  1. XCode 3.2 Ruby和Python模板

    在xcode3.2下,我的ObjectiveCPython/Ruby项目仍然可以打开更新和编译,但是你无法创建新项目.鉴于xcode3.2中缺少ruby和python的所有痕迹(即创建项目并添加新的ruby/python文件),是否有一种简单的方法可以再次安装模板?我发现了一些关于将它们复制到某个文件夹的信息,但我似乎无法让它工作,我怀疑文件夹的位置已经改变为3.2.解决方法3.2中的应用程序模板

  2. 如何在Xcode 8中启用Visual Memory Debugger?

    我将项目从以前版本的Xcode迁移到Xcode8.我想要的是使用新的可视化内存调试器.它可用于新项目,但在我导入的项目中完全缺少.为什么是这样?

  3. 免费的实战课程,用 Swift 写一个天气应用

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  4. Swift基本使用-函数和闭包(三)

    声明函数和其他脚本语言有相似的地方,比较明显的地方是声明函数的关键字swift也出现了Python中的组元,可以通过一个组元返回多个值。传递可变参数,函数以数组的形式获取参数swift中函数可以嵌套,被嵌套的函数可以访问外部函数的变量。可以通过函数的潜逃来重构过长或者太复杂的函数。

  5. 10 个Python中Pip的使用技巧分享

    众所周知,pip 可以安装、更新、卸载 Python 的第三方库,非常方便。本文小编为大家总结了Python中Pip的使用技巧,需要的可以参考一下

  6. SwiftWeather-Swift2实现的天气应用

    https://github.com/JakeLin/SwiftWeather

  7. Swift - 继承UIView实现自定义可视化组件附记分牌样例

    在iOS开发中,如果创建一个自定义的组件通常可以通过继承UIView来实现。下面以一个记分牌组件为例,演示了组件的创建和使用,以及枚举、协议等相关知识的学习。效果图如下:组件代码:scoreView.swift123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051importUIKitenumscoreType{caseCommon//普通分数面板Best//最高分面板}pr

  8. Swift、Go、Julia与R能否挑战 Python 的王者地位

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  9. 红薯因 Swift 重写开源中国失败,貌似欲改用 Python

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  10. 你没看错:Swift可以直接调用Python函数库

    上周Perfect又推出了新一轮服务器端Swift增强函数库:Perfect-Python。对,你没看错,在服务器端Swift其实可以轻松从其他语种的函数库中直接拿来调用,不需要修改任何内容。以如下python脚本为例:Perfect-Python可以用下列方法封装并调用以上函数,您所需要注意的仅仅是其函数名称以及参数。

随机推荐

  1. 10 个Python中Pip的使用技巧分享

    众所周知,pip 可以安装、更新、卸载 Python 的第三方库,非常方便。本文小编为大家总结了Python中Pip的使用技巧,需要的可以参考一下

  2. python数学建模之三大模型与十大常用算法详情

    这篇文章主要介绍了python数学建模之三大模型与十大常用算法详情,文章围绕主题展开详细的内容介绍,具有一定的参考价值,感想取得小伙伴可以参考一下

  3. Python爬取奶茶店数据分析哪家最好喝以及性价比

    这篇文章主要介绍了用Python告诉你奶茶哪家最好喝性价比最高,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧

  4. 使用pyinstaller打包.exe文件的详细教程

    PyInstaller是一个跨平台的Python应用打包工具,能够把 Python 脚本及其所在的 Python 解释器打包成可执行文件,下面这篇文章主要给大家介绍了关于使用pyinstaller打包.exe文件的相关资料,需要的朋友可以参考下

  5. 基于Python实现射击小游戏的制作

    这篇文章主要介绍了如何利用Python制作一个自己专属的第一人称射击小游戏,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起动手试一试

  6. Python list append方法之给列表追加元素

    这篇文章主要介绍了Python list append方法如何给列表追加元素,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  7. Pytest+Request+Allure+Jenkins实现接口自动化

    这篇文章介绍了Pytest+Request+Allure+Jenkins实现接口自动化的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  8. 利用python实现简单的情感分析实例教程

    商品评论挖掘、电影推荐、股市预测……情感分析大有用武之地,下面这篇文章主要给大家介绍了关于利用python实现简单的情感分析的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下

  9. 利用Python上传日志并监控告警的方法详解

    这篇文章将详细为大家介绍如何通过阿里云日志服务搭建一套通过Python上传日志、配置日志告警的监控服务,感兴趣的小伙伴可以了解一下

  10. Pycharm中运行程序在Python console中执行,不是直接Run问题

    这篇文章主要介绍了Pycharm中运行程序在Python console中执行,不是直接Run问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

返回
顶部