龙空技术网

上海2023年第一场雪,用Python采集历史天气数据,带你赏一赏~

惊奇队长不惊奇 139

前言:

现时小伙伴们对“safari下雪特效”大概比较注意,姐妹们都需要知道一些“safari下雪特效”的相关文章。那么小编在网上汇集了一些对于“safari下雪特效””的相关知识,希望大家能喜欢,兄弟们一起来学习一下吧!

大家好,我是才哥。

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. 数据采集

数据来源:历史天气网

网页简单解析如下:

F12开发者模式

选定月份后,URL地址栏的URL会变化,比如2022年12月在URL地址栏里是 ,在URL最后的202212就是变化的规律所在。

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

完整代码

import requestsfrom lxml import etreeimport pandas as pdimport timedef get_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'{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 pddf = 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()

再看数据info

df.info()

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

数据类型转换

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

筛选出年月日信息

df['年份'] = df['日期'].dt.yeardf['月份'] = df['日期'].dt.monthdf['日'] = df['日期'].dt.day# 预览df.sample(5)

寻找每年的第一场雪

snowData = df[df['是否有雪']=='是']snowData[snowData['月份']>=1].groupby('年份').first().reset_index()

每年下雪天数

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

标签: #safari下雪特效