python气象数据分析_气象数据分析--数据预处理

气象数据处理流程通常的数据分析流程相似,但是气象数据有本身的一些特殊性存在,比如风向和风速,降水等数据,其中风向由0-360之间的值表示,而风速的变化通常是很小的,除非碰到一些极端情况。
数据分析通常包括以下几部分:明确分析目标
数据准备和数据预处理
数据分析和可视化
数据分析报告
以上是简单的数据分析任务涉及到的分析流程,对于一些比较复杂的数据分析任务可能需要花费大量的时间进行探索性数据分析(即数据挖掘中常说的EDA)以及数学建模,并且不断的对建模效果进行评估。
下面以气象风向和风速数据为例,讲一下气象数据分析流程。此次的数据分析的任务是对多个数据源进行数据准确度评估,因此不会涉及到太复杂的分析。在进行分析评估之前需要对数据进行预处理,而数据预处理对于后续的数据分析和建模来说是至关重要的,因为大部分原始数据是不完整的,而且通常会包含很多噪声,比如:重复数据,缺失值,离散值(异常值)等问题。
本文以观测的风场数据为例,重点说一下数据预处理部分:
数据介绍
150个站点的逐小时风场数据,其中包括日期,站点名称,经度,纬度,风速和风向六个要素。这些数据是原始数据处理后保留的部分,原始数据包含更多要素,而且原始数据是按照每小时一个文件保存的,文件名按照时间命名,这部分涉及到数据批量处理,后面会说。
数据预处理
相信很多人拿到原始数据的时候,面对逐小时的大量数据文件会感到非常头疼。当进行时间序列数据的批处理时,有两种方式可以处理这种问题:
1)逐文件读取,并存储每个文件名对应的时间
这种方式应该是比较好理解的,就是有多少文件就逐个读,只是需要记录每个文件的文件名来确定时间
2)确定起始时间和结束时间以及时间间隔,然后按照文件命名方式名称循环读取
这种方式不需要额外的处理时间,因为当你读取文件的时候就已经确定时间了
上述两种方式都需要注意一个问题:数据缺失。比如,对于逐小时存储的数据,如果某一个小时的数据缺失了,那很可能没有这个时刻的文件,如果不注意的话在进行时间序列分析的时候就会出现问题。
在程序中进行循环读取时,要注意处理数据缺失的情况,尤其是按照第二种方式读取时,因为一旦遇到数据缺失,而又没有进行处理,那么数据读取就会因为文件缺失而中断。
本文以python为例,给出以上两种方式的处理代码:
方式一:
import os
import glob
from datetime import datetime
import pandas as pd
files = glob.glob(os.path.join('../Desktop/201802/', '*.xlsx'))
datas = pd.DataFrame()
dates = []
for f in sorted(files):
data = https://www.it610.com/article/pd.read_excel(f, index_col=0)
date = datetime.strptime(os.path.splitext(os.path.split(f)[1])[0], '%Y%m%d%H')
dates.append([date]*data.shape[0])
datas = datas.append(data)
datas.index = np.ravel(np.array(dates))
方式二:
dates = pd.date_range(datetime(2018, 2, 1, 0), datetime(2018, 2, 28, 23), freq='1h')
fpfas = [os.path.join(fp, '%d%02d%02d%02d.xlsx'%(date.year, date.month, date.day, date.hour)) for date in dates] alldata = https://www.it610.com/article/pd.DataFrame()
for fpf in fpfas:
try:
data = https://www.it610.com/article/pd.read_excel(fpf, index_col=0)
alldata = https://www.it610.com/article/alldata.append(data)
except:
print('%s 缺失.'%fpf)
数据批量处理部分有很多的细节需要注意,关于选择什么策略进行批处理,有时候需要考虑到数据的存储方式以及数据文件的一些特点。方式二的处理没有太多需要说的,主要注意一下方式一中的一些函数用法,后文不再贴入代码,所有程序会上传到github,后面会给出链接。
至此数据准备完成,下面开始进行数据预处理。由于数据是以站点为单位观测,而且存在经纬度信息,首先看一下站点的分布。注意:
1)在查看站点分布之前首先要确定已有的站点的大概在什么范围,这样便于判断是否有站点经纬度信息出现明显错误
【python气象数据分析_气象数据分析--数据预处理】2)对于有需要确定站点是否迁移的情况时,要额外判断单个站点名称经纬度坐标的唯一性
图中可以看出大部分站点是非常集中的,而且由于事先已经确定原始数据的站点非常集中,因此可以确定有些站点的经纬度坐标出现问题,这部分就需要进行确定是什么问题(本例中经纬度坐标出错的站点原因是经纬度坐标颠倒了)。
修复了上述站点经纬度错误的问题之后,接着分析原始数据中的各个变量值的分布以及数据缺失情况:
比如上图中显示风速值的分布情况,可以看出大部分值分布在10 m/s以下,这说明大部分数据是正常的,而少量数据超过了 20 m/s,这部分数据是否异常需要做进一步的判断。在进一步判断之前先确定数据缺失的情况。
大部分站点的数据仅缺少5个时刻的数据,但是仍有10个站点的数据缺失比较严重。仅确定数据缺失多少还无法确定数据缺失是连续的还是某些单个时刻缺失,这需要画出缺失较多的站点的数据缺失情况时间序列图来确定(由于本例不需要关注这些,所以这部分没有做。当进行数据挖掘,构建算法时需要记进行更为繁琐的数据预处理)。
下一步就是进行异常值检测,对于陆面监测站来说,大多数情况下风速低于20 m/s,当出现雷雨大风等极端天气的时候风速值会更大,但是风速的变化是渐变的,因此除了判断风速是否出现异常大的值外,还需要判断相邻时刻风速差值是否出现比较大的变化;而风向的变化是比较难确定的,因此本例中仅检查风向是否出现小于0和大于360的情况。异常值检测的部分在代码中给出了。
下图是对数据缺失的站点进行了分级,分为缺失超过50个时刻的站点,缺失在5到50个时刻之间以及缺失少于5个时刻的站点的分布,填充等值线是地形分布。这部分仅在需要对站点地形分布进行分析的时候才做,一般情况下可以不做。
说明:由于种种原因,此次的数据无法公开,所以仅提供部分代码,在代码文件中给出了一部分的解释以及分析思路。
本例使用的工具有excel和python,使用excel进行简单的时间序列分析,大部分的数据预处理使用python进行处理。excel处理部分文中没有提及。希望下次的数据分析能够提供原始数据和完整代码。
代码链接:https://github.com/bugsuse/DataAnalysis/blob/master/%E6%B0%94%E8%B1%A1%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90--%E6%95%B0%E6%8D%AE%E9%A2%84%E5%A4%84%E7%90%86.ipynb

    推荐阅读