资讯专栏INFORMATION COLUMN

python如何采集天气数据并做数据可视化操作呢?

89542767 / 507人阅读

  小编写这篇文章的主要目的,主要是给大家去做出一个解答,解答的是关于python的一些事情,解答的内容包括如何使用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年每日最高最低温度变化nn{}".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()

  01.png

02.png

03.png

04.png

05.png

06.png

        综上所述,这篇文章就给大家介绍到这里了,希望可以给大家带来更多帮助。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/128311.html

相关文章

  • python综合程序设计——做一个视化大屏

    摘要:完成可视化热搜榜和国内疫情新增图,提高学生的编程能力和分析问题解决问题的能力。下图为百度微博知乎三大平台的热搜词频统计图。后续我会补上薄弱项,为争取做一名全栈技术人员而奋斗。 ...

    _Dreams 评论0 收藏0
  • Python学习之路15-下载数据

    摘要:本节中将绘制幅图像收盘折线图,收盘价对数变换,收盘价月日均值,收盘价周日均值,收盘价星期均值。对数变换是常用的处理方法之一。 《Python编程:从入门到实践》笔记。本篇是Python数据处理的第二篇,本篇将使用网上下载的数据,对这些数据进行可视化。 1. 前言 本篇将访问并可视化以两种常见格式存储的数据:CSV和JSON: 使用Python的csv模块来处理以CSV(逗号分隔的值)...

    张春雷 评论0 收藏0
  • 北京全年天气状况分析

    摘要:对个月份进行抓取后再汇总,就得到了北京年全年的天气数据,包括最高温度最低温度天气状况风向等信息。按月查看温度走势日期天气状况分布天气状况晴天和多云是北京一年中主要的天气。北京的降水天数不多,主要在月份。 本文来自 @范洺源 投稿,在其基础上做了点修改 最近在学爬虫和数据分析,看到 天气网 上有国内城市一年的天气历史数据,想以此为数据源练习一下,于是就有了这个项目。今天在此简单介绍一下实...

    wupengyu 评论0 收藏0
  • 2019国家拟发布“15项新职业” AI、云计算工作榜上有名

    摘要:物联网工程技术人员定义从事物联网架构平台芯片传感器智能标签等技术的研究和开发,以及物联网工程的设计测试维护管理和服务的工程技术人员。近日,人力资源和社会保障部组织专家严格按照新职业评审标准对征集的新职业有关材料进行了评审论证,初步确定人工智能工程技术人员等15个拟发布新职业,现予公示。15个拟发布新职业1.人工智能工程技术人员2.物联网工程技术人员3.大数据工程技术人员4.云计算工程技术人员...

    marser 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<