北京2021年的第一场冬雪,比以往时候来的更早一些!用Python采集历史天气数据,带你赏一赏~...

本文通过Python编程采集并分析北京近11年的第一场冬雪时间,揭示2021年雪季是否提早到来。同时,深入探讨了全年天气分布、气温走势,展示了数据处理与可视化的过程。

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

295d7f98c6a5bc36440920fd5bd7793f.png
下雪了

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

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

fb90453bd9ec86041dfe43f492ee648c.png
下雪
e40910c57203ba8a1c69a42b83ccb9c2.png
故宫雪景图1
8c6df5eedb84fdee775aea5b9f05ae0f.png
故宫雪景图2

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

目录:

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

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

    • 2.1. 整体天气分布

    • 2.2. 不同月份天气分布

    • 2.3. 不同月份气温走势

    • 2.4. 全年气温变化动态图

  • 3. 数据采集

  • 4. 数据处理

df745349f6210a51a4379873ff18c925.png

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

其实,并不是每年的北京的冬天都有下雪,才哥女票就曾抱怨她在北京的两年就没见到过一场下雪!!比如,去年也就是2020年的冬季就没有下雪!

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

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

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

5a7947e3b852b5c4b8a7b5f78871710d.png

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

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

2.1. 整体天气分布

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

(绘图来自Excel的EasyShu插件)

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

d1c34972a61459d759692c61e159dbe7.png

2.2. 不同月份天气分布

(绘图参考《用python绘制北京近一年来空气质量热力图,看看北京的沙尘暴真的多吗?》)

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

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

dacaf336b3242d3319da9dc5e6775051.png
热力图

2.3. 不同月份气温走势

(绘图来自Excel的EasyShu插件)

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

0a9bbd2bcc2200e19be239e42bf87137.png
最高气温

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

b4b7a7a56f9cce57c338c3192b4fe561.png
最低气温

2.4. 全年气温变化动态图

30a5d97efed7c50a934796707605d775.png

3. 数据采集

数据来源

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

网页简单解析如下

70fdfa8cddfa4ca8f63f4ffe7f7335c2.png
F12开发者模式

选定月份后,URL地址栏URL会变化,比如2021年10月在URL地址栏里是 https://lishi.tianqi.com/beijing/202110.html,在URL最后的202110就是变化的规律所在。

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

完整代码

import requests
from lxml import etree
import pandas as pd

def 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'https://lishi.tianqi.com/beijing/{month}.html'
    
    r = requests.get(url, headers=headers)
    r_html = etree.HTML(r.text)
    
    return r_html

# 月份参数列表
month_list = pd.period_range('201101','202110',freq='M').strftime('%Y%m')
df = pd.DataFrame(columns=['日期', '最高气温', '最低气温', '天气', '风向'])
for i ,month in enumerate(month_list):
    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}/130月数据已采集')
df.to_excel(r'北京历史天气数据.xlsx',index=None)

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

2176f288008be4223442e484a0e71469.png
结果预览

c86d73b218637e12e3232ce9c55fb95d.png

4. 数据处理

数据处理部分我们用到的也是pandas,以下将从处理思路和方法进行简单讲解,原始数据大家可以通过第三部分的数据采集爬虫代码运行获取或者后台回复 955北京历史天气文件夹中领取。

引入库并读取数据预览

import pandas as pd

df = pd.read_excel('北京历史天气数据.xlsx')
df.head()
bd20165803e523d4e398eaf9cf651b90.png
前几条数据
# 后几条数据
df.tail()
d886fe2d397de36afef2d7efeb537fca.png
后几条数据

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

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

分列日期与星期

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

赋值

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()
e59405fb548288da6975f20ee0df418d.png

再看数据info

df.info()
cf927b63ccf5d4bb35853c0e6cb96250.png

我们看这个数据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)
c078b6f965eb1eeea8130c464a2ca080.png
随机5条数据

寻找每年的第一场冬雪

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

每年下雪天数

snowData.groupby('年份')['日期'].count().to_frame('下雪天数').reset_index()
年份下雪天数
201111
201213
201315
20146
201515
20166
20176
20182
20192
20206
20211

大神来教大家玩服务器:

安老师,某大厂互联网公司的资深后端大神,有5年多的后端开发经验,教大家玩转云服务器。玩Linux,安装Python,安装数据库,用Django+uwsigi+nginx web服务搭建网站,求职简历网站搭建,写脚本部署股票基金机器人,还可以搭建个人网盘!

星球的价格是一年88元,然后现在双11期间有优惠券20元,相当于是68一年,算下来每个月6块钱,连半杯奶茶的钱都不到,一天才2毛钱,非常划算。

db48f4ebe278313cb319ba1084ee8127.png

推荐阅读:
入门: 最全的零基础学Python的问题  | 零基础学了8个月的Python  | 实战项目 |学Python就是这条捷径
干货:爬取豆瓣短评,电影《后来的我们》 | 38年NBA最佳球员分析 |   从万众期待到口碑扑街!唐探3令人失望  | 笑看新倚天屠龙记 | 灯谜答题王 |用Python做个海量小姐姐素描图 |碟中谍这么火,我用机器学习做个迷你推荐系统电影
趣味:弹球游戏  | 九宫格  | 漂亮的花 | 两百行Python《天天酷跑》游戏!
AI: 会做诗的机器人 | 给图片上色 | 预测收入 | 碟中谍这么火,我用机器学习做个迷你推荐系统电影
小工具: Pdf转Word,轻松搞定表格和水印! | 一键把html网页保存为pdf!|  再见PDF提取收费! | 用90行代码打造最强PDF转换器,word、PPT、excel、markdown、html一键转换 | 制作一款钉钉低价机票提示器! |60行代码做了一个语音壁纸切换器天天看小姐姐!|

年度爆款文案

<think>我们正在处理气象数据,用户询问Python处理气象数据的常用语句。根据之前的对话,用户可能已经了解了些文件读取的方法,现在想要更广泛的处理语句。 我们之前提到了xarray读取文件,特别是中文路径的处理,以及使用python-cdo等工具。 由于引用中提到了python-cdo(引用[1]和[2]),我们可以介绍下这个库的用法。同时,引用[4]中展示个pandas处理数据的例子(寻找每第一场冬雪)。 因此,我们可以将回答分为几个部分: 1. 数据读取(特别是气象常用的NetCDF格式,使用xarray) 2. 数据处理(使用xarray和pandas进行常见操作,分组、时间序列等) 3. 利用python-cdo进行气象数据的专业处理(如插值、统计等) 4. 数据可视化(简单提及,因为引用中也提到了画图) 5. 常见错误(引用[3]提到了空格问题,但实际代码是字符串处理,这里我们可以提下代码格式和常见错误) 注意:用户要求生成相关问题,所以最后要生成相关问题。 由于引用中并没有直接给出很多代码,我们将基于气象数据处理的常用操作来编写。 步骤: 数据读取(使用xarray) 二、数据处理(xarray和pandas) 三、使用python-cdo进行高级处理 四、数据可视化 五、常见问题 注意:每个部分给出1-2个例子,并确保代码正确。 另外,根据引用[3]的代码,我们发现它其实是个字符串遍历并判断是否存在字母'e'的代码,但它的缩进有问题(else应该和for对齐,表示for循环正常结束后的执行,但这里其实是想在找到'e'后break,然后如果没有找到则执行else,所以else应该和for对齐)。不过我们这里不是讲这个,我们可以忽略,但最后在常见问题部分可以提下代码格式的重要性。 开始回答: </think>### Python 处理气象数据常用语句指南 以下汇总气象数据处理的核心操作,结合 `xarray`、`pandas` 和 `python-cdo` 的典型用法: --- #### 数据读取与基础处理 1. **读取 NetCDF 文件** ```python import xarray as xr # 读取单文件 ds = xr.open_dataset(r'path/to/data.nc') # 读取多文件合并(时间序列常用) ds = xr.open_mfdataset('folder/*.nc', combine='by_coords') [^1] ``` 2. **数据切片与筛选** ```python # 按经纬度范围裁剪 subset = ds.sel(lat=slice(20, 40), lon=slice(100, 120)) # 按时间筛选 winter_data = ds.sel(time=ds['time.season'] == 'DJF') # 条件筛选(引用[4]案例扩展) snow_days = ds.where(ds['snowfall'] > 0, drop=True) ``` --- #### 二、时空分析与统计 1. **时间维度聚合** ```python # 计算平均温度 annual_mean = ds['temperature'].groupby('time.year').mean(dim='time') # 月累积降水(引用[4]逻辑) monthly_rain = ds['precip'].resample(time='1M').sum() ``` 2. **空间统计运算** ```python # 区域平均温度 regional_avg = ds['temperature'].mean(dim=['lat', 'lon']) # 计算纬度均值 zonal_mean = ds['temperature'].mean(dim='lon') ``` --- #### 三、python-cdo 高级处理 利用 CDO 工具链进行专业气象计算(引用[1][2]): ```python from cdo import Cdo cdo = Cdo() # 插值到新网格 regridded = cdo.remapbil('r360x180', input='input.nc') # 计算季节平均 seasonal_avg = cdo.seasmean(input='input.nc') # 直接转换为 NumPy 数组操作 arr = seasonal_avg.to_numpy() [^2] ``` --- #### 四、数据导出与可视化 1. **格式转换** ```python # 导出为 CSV(适合小数据) df = ds.to_dataframe() df.to_csv('weather_data.csv') # 导出为 NetCDF ds.to_netcdf('output.nc') ``` 2. **快速绘图** ```python # 温度等值线图(引用[3]扩展) ds['temperature'].isel(time=0).plot.contourf( levels=20, cmap='coolwarm', figsize=(12,6) ) # 时间序列图 ds['precip'].sel(lat=30, lon=120).plot() ``` --- #### 五、调试与优化技巧 1. **内存管理** ```python # 分块读取大文件 ds = xr.open_dataset('large.nc', chunks={'time': 365}) # 使用 Dask 并行计算 result = ds['temp'].mean().compute() ``` 2. **错误规避** - 路径空格/括号问题:`ds = xr.open_dataset(r"C:\Data (2023)\temp.nc")` - 时间解析错误:`ds = xr.decode_cf(ds)` - 单位转换:`ds['temp'].assign_attrs(units='°C')` > **数据处理哲学**:优先使用 `xarray` 的向量化操作替代循环,结合 python-cdo 处理复杂气象算法[^1][^2]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值