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 = 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 = pd.DataFrame()
for fpf in fpfas:
try:
data = pd.read_excel(fpf, index_col=0)
alldata = alldata.append(data)
except:
print('%s 缺失.'%fpf)
數據批量處理部分有很多的細節需要注意,關于選擇什么策略進行批處理,有時候需要考慮到數據的存儲方式以及數據文件的一些特點。方式二的處理沒有太多需要說的,主要注意一下方式一中的一些函數用法,后文不再貼入代碼,所有程序會上傳到github,后面會給出鏈接。
至此數據準備完成,下面開始進行數據預處理。由于數據是以站點為單位觀測,而且存在經緯度信息,首先看一下站點的分布。注意:
1)在查看站點分布之前首先要確定已有的站點的大概在什么范圍,這樣便于判斷是否有站點經緯度信息出現明顯錯誤
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
總結
以上是生活随笔為你收集整理的python气象数据分析_气象数据分析--数据预处理的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 双链表的基本操作---插入,删除,交,并
- 下一篇: debian jessie instal
