历史天气网(历史天气网站数据)学会了吗
大家好,我是才哥。2023年1月15日星期天,坐标上海,天气雨夹雪,西北风4-5级,看漫天雪飘。“风刮得很紧,雪片像扯破了的棉絮一样在空中飞舞,
大家好,我是才哥2023年1月15日星期天,坐标上海,天气雨夹雪,西北风4-5级,看漫天雪飘“风刮得很紧,雪片像扯破了的棉絮一样在空中飞舞,没有目的地四处飘落”今天,我们用Python采集上海历史天气数据,来看看今年的雪是不是真的来的更早一些呢!?。
不过,在开始正文之前,咱们先赏一波雪景吧!!好了,我们开始正文部分吧~~目录:1. 最近10年来上海每年的第一场雪2. 2022年上海天气数据全览2.1. 整体天气分布2.2. 不同月份气温走势3. 数据采集
4. 数据处理1. 最近10年来上海每年的第一场雪其实,上海几乎每年都会下雪,只是下雪量和次数均不高,最近10年仅2021年没有下过雪今年(2023年的是在1月15日),最近10年的第1场雪时间表如下:。
我们可以看到,过去10年里,大部分年份的第1场雪都是在1月下旬及之后才出现相比之下,2013年和2023年的第1场冬雪来的时间相对更早一些在1月的中上旬不过吧,今年的这个雪下的很认真!2. 2022年上海天气数据全览。
我们爬取了全年365天的数据,可以看到:2.1. 整体天气分布全年365天,有281天多云和晴天,占比超过77%;阴天有41天,占比约为11%;下雨天有41天,占比约为11%(绘图来自Excel的EasyShu。
插件)
2.2. 不同月份气温走势(绘图来自Excel的EasyShu插件)从每日最高气温来看,基本上7-8月属于超高温月,大部分都在35度以上甚至40度,很明显。
从每日最低气温来看,8月的最低气温也属于全年度最高,而1月的最低气温可低到-8摄氏度...
3. 数据采集数据来源:历史天气网 https://lishi.tianqi.com/网页简单解析如下:
F12开发者模式选定月份后,URL地址栏的URL会变化,比如2022年12月在URL地址栏里是 http://lishi.tianqi.com/shanghai/202212.html,在URL最后的202212
就是变化的规律所在确定的URL规律后,我们再看看怎么解析出数据,我这里直接采用的是xpath方法哈,整体完整代码大家参考如下即可(修改地址即可,上海是shanghai,其他城市的大家打开网页自己看即可,很简单)。
完整代码:import requests from lxml import etree import pandas as pd import time 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 = fhttps://lishi.tianqi.com/shanghai/{month}.html r = requests.get(url, headers=headers) r_html = etree.HTML(r.text)
return r_html # 月份参数列表 month_list = pd.period_range(201301,202301,freq=M).strftime(%Y%m) df = pd.DataFrame(columns=[
日期, 最高气温, 最低气温, 天气, 风向]) for i ,month in enumerate(month_list): time.sleep(1) r_html = get_html(month)
# 找到存放历史天气数据的div节点 div = r_html.xpath(.//div[@class="tian_three"])[0] # 每个日期的历史天气数据的li节点组成的列表
lis = div.xpath(.//li) for li in lis: 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}月数据已采集) df.to_excel(
r上海历史天气数据.xlsx,index=None) 最终,我们采集的数据结果预览如下:
4. 数据处理数据处理部分我们用到的也是pandas,以下将从处理思路和方法进行简单讲解,原始数据大家可以通过第三部分的数据采集爬虫代码运行获取或者后台回复 955 在上海历史天气文件夹中领取引入库并读取数据预览。
import pandas as pd 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(lambda x: x.str.replace(
℃,)) 新增字段标记是否有雪df.loc[df[天气].str.contains(雪),是否有雪]=是 df.fillna(否,inplace=True) # 预览 df.head()
再看数据infodf.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)
寻找每年的第一场雪snowData = df[df[是否有雪]==是] snowData[snowData[月份]>=1].groupby(年份).first().reset_index()
每年下雪天数snowData.groupby(年份)[日期].count().to_frame(下雪天数).reset_index()
免责声明:本站所有信息均搜集自互联网,并不代表本站观点,本站不对其真实合法性负责。如有信息侵犯了您的权益,请告知,本站将立刻处理。联系QQ:1640731186