场次降雨数据划分
????降雨是有可能斷斷續續的。從水文的角度出發,若降雨的時間間隔較短,可以作為一次降雨過程;若時間間隔較長,則應劃分為不同的降雨場次。通常可以采用時間間隔為n h以劃分場次降雨的標準(如n取值為6h),即在連續6h以上內均未監測到降雨數值,則視為兩次降雨過程,出現的降雨間隔不足6h的,為同一場降雨。 根據雨量計監測獲取的分鐘級或5分鐘級數據,按照上述思路,通過pandas做場次降雨數據劃分和降雨相關特征分析。
1.導入庫,獲取數據
import os import datetime import numpy as np import pandas as pd#設置數據所在路徑 path = r'rain' raindatas = os.listdir(path) #假設原始降雨數據以csv格式存儲 raindata = [f for f in raindatas if '.csv' in f] #用pandas讀取數據 df = pd.read_csv(raindata[0], parse_dates=[0], index_col=0)2.場次降雨劃分函數:去掉0值后,找出連續兩個值之間的時間差是否大于設置的劃分標準
#按n小時劃分場次降雨 def timeSpilt(df, n=6):#去掉0值df_noZero = df[df != 0]df = df_noZero.dropna()#獲取時間索引timeStamp = df.index#初始化列表,用于保存生成的降雨開始和結束時間點rainRng = []#設置開始時間節點列表(第一個數即為第一場降雨的開始時間節點)timeNode = [timeStamp[0], ]for i in xrange(1, len(timeStamp)):#計算連續兩個時間點的時間差(下一場開始-上一場結束)diff = (timeStamp[i] - timeStamp[i-1])/np.timedelta64(1, 's')if diff >= n*60*60:#添加開始時間節點(即開始時間節點列表timeNode的最后一項)和結束時間節點rainRng.append([timeNode[-1], timeStamp[i-1]])#添加下一場開始降雨時間節點timeNode.append(timeStamp[i])return rainRng3.處理數據函數:由于數據缺失或者原始數據沒有保存0值數據,故加上0值,為以后求取總降雨量和其他降雨特征做準備
#生成連續時間的降雨數據;未監測的時間點填充0 def zeroData(df): index = df.index#得到開始和結束時間start, end = index[0], index[-1]#原始數據為分鐘級數據 rng = pd.date_range(start, end, freq='T')#生成0值zeroList = [0 for i in xrange(len(rng))]df_allZero = pd.Series(zeroList, index=rng)#填充nan為0df_Zero = df_allZero.add(df ,fill_value=0)return df_Zero4.處理降雨數據,提取降雨特征值
#處理降雨數據,提取場次降雨特征值 def rainInfo(rainRng, df_Zero):#初始化字典,用于保存生成的場次降雨特征值rf = {}#場次降雨特征值的字段名(開始時間,結束時間,總降雨量,持續時間、最大值,最大5分鐘累積值,最大10分鐘累積值,平均強度)names = ['start','end','sum','duration','max','max5','max10','Intensity']#字典keys缺省處理for name in names:rf.setdefault(name, [])#對各場次降雨進行遍歷for i in xrange(len(rainRng)):start, end = rainRng[i]df_need =df_Zero[start:end]#總降雨量rainsum = float(df_need.sum())#選取降雨量大于10mm的降雨量if rainsum > 10:#降雨歷時duration = (end - start)/(np.timedelta64(1, 's')*60)rf['duration'].append(duration) rf['start'].append(start)rf['end'].append(end)#場次降雨總量rf['sum'].append(rainsum)#最大值rf['max'].append(df_need.max())#5分鐘累積最大值rf['max5'].append(pd.rolling_sum(df_need,5).max())rf['max10'].append(pd.rolling_sum(df_need,10).max())Inten = rainsum*60/durationrf['Intensity'].append(Inten)#數據轉為為DataFrame df = pd.DataFrame(rf)return df5.劃分降雨,并計算場次降雨特征值
if __name__ == '__main__':#劃分場次降雨rainRng = timeSpilt(df)df_zero = zeroData(df)df_info = rainInfo(rainRng, df_zero)#保存數據df_info.to_csv(r'jiegou.csv')總結
- 上一篇: 【英语单词听写】英语单词背诵辅助
- 下一篇: C#开发BIMFACE系列9 服务端AP