Python实战系列<三> | 不规则txt空气质量数据处理并绘图

简介: Python实战系列<三> | 不规则txt空气质量数据处理并绘图

大家好,我是欧K~

本期给大家分享《Python实战系列》的第三篇文章:不规则数据统计分析,该系列主要来自粉丝的实际问题,后期会不断更新,希望对你有所帮助,如有疑问或者需要改进的地方可以私信小编。

一期:【Python实战系列<一> | 正则提取数据并绘图

第二期:【Python实战系列<二> | 70万+条表格信息标记 任务描述: 数据处理并完成绘图:12 个站点平均的逐月 PM2.5浓度变化曲线。

注意事项:这些数据里-999 表示缺测。一个月 30 天的数据里至少要有 20 天有有效数据,如果有效数据小于 20 天,那这个月的平均也就设置为缺测。

文件结构

文件内容

🏳️‍🌈 1. 读取数据

df = pd.read_csv('./datas/Y2014/1001A.txt')

数据格式乍一看很规则,实际第一行和后面是不一样的:

第一行:

YYYY-MM-DD , PM25(ug/m3) , PM10(ug/m3) , SO2(ug/m3) , NO2(ug/m3) , O3(ug/m3) , DailyO8h(ug/m3) , CO(ug/m3) , MDA8(ug/m3)

第n行:

Y2014-01-01     60.611    150.381     44.375     75.000     14.667     16.696   2679.167     45.201

我们先按正常格式读取,然后再单独处理后面的数据,至少表头是正常的,后面可以用上 🏳️‍🌈 2. 取数据表的第一列读取后我们看到数据都集中在了第一列,我们将这一列取出来处理:

datas = df['YYYY-MM-DD '].tolist()

这样看起来就好处理多了。

🏳️‍🌈 3. 正则拆分数据

第2步后我们把数据转换成列表,每一行数中间的空格数量不一定,直接用split分割的话会导致长度不一致,所以这里我们用正则表达式分割:

pd.DataFrame(df['YYYY-MM-DD '].map(lambda x: re.split('\s+', x)).tolist())


这样数据就正常了,然后我们再把原来的表头加上去,就是正常的数据格式了:

🏳️‍🌈 4. 提取月份数据

我们要统计每年每月平均值,所以这里我们把月份提取出来:

# 第一列数据切割
df_tmp['YYYY-MM-DD '] = df_tmp['YYYY-MM-DD '].str[1:]
# 转换成时间类型,提取月份
df_tmp['MM'] = pd.to_datetime(df_tmp['YYYY-MM-DD ']).dt.month
# 数据类型转换
df_tmp[' PM25(ug/m3) '] = df_tmp[' PM25(ug/m3) '].astype('float')


🏳️‍🌈 5. 按月统计这里需要注意一点,正常情况下我们按年、月分组求平均值就可以了,但是这里不可以!我们再看一眼任务要求:这些数据里-999 表示缺测。一个月 30 天的数据里至少要有 20 天有有效数据,如果有效数据小于 20 天,那这个月的平均也就设置为缺测。我们还需要统计缺失数据-999的情况!我们看一下是否有缺失超过10天的情况:

for i in range(1,13):
    df_mon = df_tmp[df_tmp['MM'] == i]
    print(i,df_mon[df_mon[' PM25(ug/m3) '] == -999].shape[0])
# 1 4
# 2 6
# 3 0
# 4 0
# 5 2
# 6 0
# 7 11
# 8 0
# 9 0
# 10 3
# 11 0
# 12 3

7月份有11天缺失。。。那么我们只能遍历去统计了:

for i in range(1,13):
    mean_val = 0
    df_mon = df_tmp[df_tmp['MM'] == i]
    if df_mon[df_mon[' PM25(ug/m3) '] == -999].shape[0]<=10:
        df_mon = df_mon[df_mon[' PM25(ug/m3) '] != -999]
        mean_val = df_mon[' PM25(ug/m3) '].mean()
    mean_vals.append(mean_val)

最后结果:

然后再mean()一下就可以了。

🏳️‍🌈 6. 绘图

绘图部分比较简单,我们还用比较熟悉的pyecharts绘图,之前的文章介绍的比较多,这里就不详细介绍了,代码如下:

line = (
    Line()
    .add_xaxis(x_data1)
    .add_yaxis("", y_data1, is_smooth=True,label_opts=opts.LabelOpts(is_show=False))
    .set_global_opts(
        xaxis_opts=opts.AxisOpts(
            name='date',
            axislabel_opts=opts.LabelOpts(rotate=30)
        ),
        yaxis_opts=opts.AxisOpts(name='ug/m3'),
        title_opts=opts.TitleOpts(title="AVG_PM25")
    )
)

效果:


END


以上就是本期为大家整理的全部内容了,喜欢的朋友可以点赞、点在看也可以分享让更多人知道。

相关文章
|
11天前
|
存储 数据采集 人工智能
Python编程入门:从零基础到实战应用
本文是一篇面向初学者的Python编程教程,旨在帮助读者从零开始学习Python编程语言。文章首先介绍了Python的基本概念和特点,然后通过一个简单的例子展示了如何编写Python代码。接下来,文章详细介绍了Python的数据类型、变量、运算符、控制结构、函数等基本语法知识。最后,文章通过一个实战项目——制作一个简单的计算器程序,帮助读者巩固所学知识并提高编程技能。
|
3天前
|
数据可视化 DataX Python
Seaborn 教程-绘图函数
Seaborn 教程-绘图函数
30 8
|
12天前
|
小程序 开发者 Python
探索Python编程:从基础到实战
本文将引导你走进Python编程的世界,从基础语法开始,逐步深入到实战项目。我们将一起探讨如何在编程中发挥创意,解决问题,并分享一些实用的技巧和心得。无论你是编程新手还是有一定经验的开发者,这篇文章都将为你提供有价值的参考。让我们一起开启Python编程的探索之旅吧!
36 10
|
21天前
|
数据采集 存储 数据处理
Python中的多线程编程及其在数据处理中的应用
本文深入探讨了Python中多线程编程的概念、原理和实现方法,并详细介绍了其在数据处理领域的应用。通过对比单线程与多线程的性能差异,展示了多线程编程在提升程序运行效率方面的显著优势。文章还提供了实际案例,帮助读者更好地理解和掌握多线程编程技术。
|
24天前
|
算法 Unix 数据库
Python编程入门:从基础到实战
本篇文章将带你进入Python编程的奇妙世界。我们将从最基础的概念开始,逐步深入,最后通过一个实际的项目案例,让你真正体验到Python编程的乐趣和实用性。无论你是编程新手,还是有一定基础的开发者,这篇文章都将为你提供有价值的信息和知识。让我们一起探索Python的世界吧!
|
25天前
|
数据处理 开发者 Python
Python中的列表推导式:简洁高效的数据处理
在编程世界中,效率和可读性是代码的两大支柱。Python语言以其独特的简洁性和强大的表达力,为开发者提供了众多优雅的解决方案,其中列表推导式便是一个闪耀的例子。本文将深入探讨列表推导式的使用场景、语法结构及其背后的执行逻辑,带你领略这一特性的魅力所在。
|
25天前
|
并行计算 调度 开发者
探索Python中的异步编程:从基础到实战
在Python的世界里,异步编程是一种让程序运行更加高效、响应更快的技术。本文不仅会介绍异步编程的基本概念和原理,还将通过具体代码示例展示如何在Python中实现异步操作。无论你是初学者还是有经验的开发者,都能从中获益,了解如何运用这一技术优化你的项目。
|
25天前
|
数据处理 Python
探索Python中的异步编程:从基础到实战
在Python的世界中,“速度”不仅是赛车手的追求。本文将带你领略Python异步编程的魅力,从原理到实践,我们不单单是看代码,更通过实例感受它的威力。你将学会如何用更少的服务器资源做更多的事,就像是在厨房里同时烹饪多道菜而不让任何一道烧焦。准备好了吗?让我们开始这场技术烹饪之旅。
|
28天前
|
机器学习/深度学习 数据采集 数据可视化
Python数据科学实战:从Pandas到机器学习
Python数据科学实战:从Pandas到机器学习
|
1月前
|
数据采集 机器学习/深度学习 人工智能
Python编程入门:从基础到实战
【10月更文挑战第36天】本文将带你走进Python的世界,从基础语法出发,逐步深入到实际项目应用。我们将一起探索Python的简洁与强大,通过实例学习如何运用Python解决问题。无论你是编程新手还是希望扩展技能的老手,这篇文章都将为你提供有价值的指导和灵感。让我们一起开启Python编程之旅,用代码书写想法,创造可能。