无障碍 关怀版

2021年的第一场雪,比以往时候来得更早一些!Python分析历史天气数据,带你赏雪~

当当网双十一优惠活动,需要囤书的朋友自取:

图书全场5折封顶

可再叠加:

Crossin的编程教室 读者专属优惠码

满150减30 2RTV5Q(全品类除考试教材)

满300减80 E5RABE(科技图书)

具体使用规则参见今日次条推送

大家好,欢迎来到 Crossin的编程教室 !

2021年11月6日晚,北京2021年的第一场冬雪降临,似乎比以往时候都要来得更早一些。

下雪了

今天我们用Python采集北京历史天气数据,来看看今年的冬雪是不是真的来得更早一些呢?

不过,在开始正文之前,咱们先赏一波雪景吧~

下雪

故宫雪景图1

故宫雪景图2

好了,我们开始正文部分吧~~

目录:

  • 1. 近11年北京第1场冬雪时间
  • 2. 2021年北京天气数据全览
    • 2.1. 整体天气分布
    • 2.2. 不同月份天气分布
    • 2.3. 不同月份气温走势
    • 2.4. 全年气温变化动态图
  • 3. 数据采集
  • 4. 数据处理
  • 2.1. 整体天气分布
  • 2.2. 不同月份天气分布
  • 2.3. 不同月份气温走势
  • 2.4. 全年气温变化动态图

1. 近11年北京第1场冬雪时间

其实,并不是每年北京的冬天都有下雪。比如去年也就是 2020 年的冬季就没有下雪。

今年( 2021年的冬雪是在11月6日),过去 10 年的 第1场冬雪时间表如下:

过去 10 年的第1场冬雪时间表如下

我们可以看到,过去 10 年里 有3个年头并没有冬雪,大部分年份的第1场冬雪都是在 11 月 下旬及之后才出现。相比之下, 2015 年和 2012 年的第 1 场冬雪来的时间相对更早一些(仅1日)是 11月5日 。不过吧, 今年的这个雪属于大雪了,要比往年的都要大很多,更有下雪的味道!

2. 2021年北京天气数据全览

截止2021年10月31日共有304天,基于这 304 天的天气数据,我们可以看到:

2.1. 整体天气分布

合计有223天多云和晴天,占比超过73%;阴天和雾霾天有55天,占比约为18%;下雨天有24天,占比约为8%。

(绘图来自Excel的 EasyShu 插件)

注:在该网站历史数据中很多天空气质量差的算在了阴天里哈

2.2. 不同月份天气分布

下雨天主要集中在 5-8月 份、 主要集中在 2、3 月份。

(绘图使用 Seaborn 库的 heatmap 方法)

热力图 2.3. 不同月份气温走势

从每日最高气温来看,基本上6-8 月属于高温月,很明显。

(绘图来自Excel的 EasyShu 插件)

最高气温

从每日 最低气温来看, 7月 的最低气温也属于全年度最高,而 1月的最低气温可低到-20摄氏度,简直了。。

最低气温 2.4. 全年气温变化动态图

3. 数据采集

数据来源

历史天气网 https://lishi.tianqi.com/

网页简单解析如下

F12开发者模式

确定的URL规律后,我们再看看怎么解析出数据,我这里直接采用的是 xpath 方法哈,整体完整代码大家参考如下即可(修改地址即可,北京是 beijing ,其他城市的大家打开网页自己看即可,很简单)。

完整代码

importrequests

fromlxml importetree

importpandas aspd

defget_html(month):

headers = {

"Accept-Encoding": "Gzip",

"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36",

}

url = f'https://lishi.tianqi.com/beijing/ {month}.html'

r = requests.get(url, headers=headers)

r_html = etree.HTML(r.text)

returnr_html

# 月份参数列表

month_list = pd.period_range( '201101', '202110',freq= 'M').strftime( '%Y%m')

df = pd.DataFrame(columns=[ '日期', '最高气温', '最低气温', '天气', '风向'])

fori ,month inenumerate(month_list):

r_html = get_html(month)

# 找到存放历史天气数据的div节点

div = r_html.xpath( './/div[@class="tian_three"]')[ 0]

# 每个日期的历史天气数据的li节点组成的列表

lis = div.xpath( './/li')

forli inlis:

item = {

'日期':li.xpath( './div[@class="th200"]/text')[ 0],

'最高气温':li.xpath( './div[@class="th140"]/text')[ 0],

'最低气温':li.xpath( './div[@class="th140"]/text')[ 1],

'天气':li.xpath( './div[@class="th140"]/text')[ 2],

'风向':li.xpath( './div[@class="th140"]/text')[ 3]

}

df = df.append(item, ignore_index= True)

print( f' {i+ 1} /130月数据已采集' )

df.to_excel( r'北京历史天气数据.xlsx',index= None)

最终,我们采集的数据结果预览如下:

结果预览

4. 数据处理

数据处理部分我们用到的也是 pandas ,以下将从处理思路和方法进行简单讲解,原始数据大家可以通过第三部分的数据采集爬虫代码运行获取。

引入库并读取数据预览

importpandas aspd

df = pd.read_excel( '北京历史天气数据.xlsx')

df.head

前几条数据 # 后几条数据

df.tail

后几条数据

通过观察采集下来的数据,我们可以发现 日期字段中带有星期信息最高的最低气温中带有摄氏度符号天气中存在雨夹雪等字眼

为了进行数据的统计分析,我们需要对原始数据做简单的处理,操作如下:

分列日期与星期

df[ '日期'].str.split( ' ',expand= True,n= 1)

赋值

df[[ '日期', '星期']] = df[ '日期'].str.split( ' ',expand= True,n= 1)

去掉气温的单位符号

df[[ '最高气温', '最低气温']] = df[[ '最高气温', '最低气温']].apply( lambdax: x.str.replace( '℃', ''))

新增字段标记是否有雪

df.loc[df[ '天气'].str.contains( '雪'), '是否有雪']= '是'

df.fillna( '否',inplace= True)

# 预览

df.head

再看数据info

df.info

我们看这个数据 info 发现各字段基本都不是我们想要的类型,比如日期字段、最高最低气温期望是 int 类型等等。于是,我们需要进行相关数据类型转换啦。

数据类型转换

df[ '日期'] = pd.to_datetime(df[ '日期'])

df[[ '最高气温', '最低气温']] = df[[ '最高气温', '最低气温']].astype( 'int')

筛选出年月日信息

df[ '年份'] = df[ '日期'].dt.year

df[ '月份'] = df[ '日期'].dt.month

df[ '日'] = df[ '日期'].dt.day

# 预览

df.sample( 5)

随机5条数据

寻找每年的第一场冬雪

snowData = df[df[ '是否有雪']== '是']

snowData[snowData[ '月份']>= 9].groupby( '年份').first.reset_index

每年下雪天数

snowData.groupby( '年份')[ '日期'].count.to_frame( '下雪天数').reset_index

年份 下雪天数
2011 11
2012 13
2013 15
2014 6
2015 15
2016 6
2017 6
2018 2
2019 2
2020 6
2021 1

以上就是我们对北京历史天气的一些数据分析。

在公众号 Crossin的编程教室 后台回复关键字 天气,还有另外几篇天气数据相关的教程案例可查看。

如果文章对你有帮助,欢迎转发/点赞/收藏~

作者: 道才

来源:可以叫我才哥

__

北京全年天气状况分析

如需了解 付费精品课程教学 答疑服务

请在 Crossin的编程教室内回复: 666 返回搜狐,查看更多

责任编辑:

平台声明:该文观点仅代表作者本人,搜狐号系信息发布平台,搜狐仅提供信息存储空间服务。
阅读 ()
推荐阅读

代做工资流水公司温州转账流水查询曲靖银行流水PS样本嘉兴开工作收入证明保定工资流水账单办理西安银行流水PS图片郑州流水账单图片福州做车贷流水荆州做购房银行流水衡阳打印个人流水宜春办企业对公流水温州公司流水代开上海工资流水单模板西安入职工资流水代做曲靖查询对公账户流水临沂入职银行流水开具孝感贷款工资流水 价格常德查询签证工资流水潍坊薪资银行流水办理郑州办签证工资流水宁德工作收入证明多少钱中山自存银行流水样本金华薪资流水徐州车贷工资流水 办理洛阳打印公司银行流水福州查银行流水PS成都开个人流水青岛车贷工资流水 代做漳州在职证明代办德阳银行流水修改报价泰州办房贷工资流水香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声卫健委通报少年有偿捐血浆16次猝死汪小菲曝离婚始末何赛飞追着代拍打雅江山火三名扑火人员牺牲系谣言男子被猫抓伤后确诊“猫抓病”周杰伦一审败诉网易中国拥有亿元资产的家庭达13.3万户315晚会后胖东来又人满为患了高校汽车撞人致3死16伤 司机系学生张家界的山上“长”满了韩国人?张立群任西安交通大学校长手机成瘾是影响睡眠质量重要因素网友洛杉矶偶遇贾玲“重生之我在北大当嫡校长”单亲妈妈陷入热恋 14岁儿子报警倪萍分享减重40斤方法杨倩无缘巴黎奥运考生莫言也上北大硕士复试名单了许家印被限制高消费奥巴马现身唐宁街 黑色着装引猜测专访95后高颜值猪保姆男孩8年未见母亲被告知被遗忘七年后宇文玥被薅头发捞上岸郑州一火锅店爆改成麻辣烫店西双版纳热带植物园回应蜉蝣大爆发沉迷短剧的人就像掉进了杀猪盘当地回应沈阳致3死车祸车主疑毒驾开除党籍5年后 原水城县长再被查凯特王妃现身!外出购物视频曝光初中生遭15人围殴自卫刺伤3人判无罪事业单位女子向同事水杯投不明物质男子被流浪猫绊倒 投喂者赔24万外国人感慨凌晨的中国很安全路边卖淀粉肠阿姨主动出示声明书胖东来员工每周单休无小长假王树国卸任西安交大校长 师生送别小米汽车超级工厂正式揭幕黑马情侣提车了妈妈回应孩子在校撞护栏坠楼校方回应护栏损坏小学生课间坠楼房客欠租失踪 房东直发愁专家建议不必谈骨泥色变老人退休金被冒领16年 金额超20万西藏招商引资投资者子女可当地高考特朗普无法缴纳4.54亿美元罚金浙江一高校内汽车冲撞行人 多人受伤

代做工资流水公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化