当当网双十一优惠活动,需要囤书的朋友自取:
图书全场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. 数据处理
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( 'http://www.sohu.com/na//div[@class="tian_three"]')[ 0]
# 每个日期的历史天气数据的li节点组成的列表
lis = div.xpath( 'http://www.sohu.com/na//li')
forli inlis:
item = {
'日期':li.xpath( 'http://www.sohu.com/na/div[@class="th200"]/text')[ 0],
'最高气温':li.xpath( 'http://www.sohu.com/na/div[@class="th140"]/text')[ 0],
'最低气温':li.xpath( 'http://www.sohu.com/na/div[@class="th140"]/text')[ 1],
'天气':li.xpath( 'http://www.sohu.com/na/div[@class="th140"]/text')[ 2],
'风向':li.xpath( 'http://www.sohu.com/na/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
以上就是我们对北京历史天气的一些数据分析。
在公众号 Crossin的编程教室 后台回复关键字 天气,还有另外几篇天气数据相关的教程案例可查看。
如果文章对你有帮助,欢迎转发/点赞/收藏~
作者: 道才
来源:可以叫我才哥
__
北京全年天气状况分析
如需了解 付费精品课程及 教学 答疑服务
请在 Crossin的编程教室内回复: 666