您的位置:首页 > 其它

场次降雨数据划分

2017-12-16 20:26 113 查看
    降雨是有可能断断续续的。从水文的角度出发,若降雨的时间间隔较短,可以作为一次降雨过程;若时间间隔较长,则应划分为不同的降雨场次。通常可以采用时间间隔为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 rainRng


3.处理数据函数:由于数据缺失或者原始数据没有保存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为0
df_Zero = df_allZero.add(df ,fill_value=0)

return df_Zero


4.处理降雨数据,提取降雨特征值

#处理降雨数据,提取场次降雨特征值
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/duration
rf['Intensity'].append(Inten)
#数据转为为DataFrame
df = pd.DataFrame(rf)

return df


5.划分降雨,并计算场次降雨特征值

if __name__ == '__main__':
#划分场次降雨
rainRng = timeSpilt(df)
df_zero = zeroData(df)
df_info = rainInfo(rainRng, df_zero)
#保存数据
df_info.to_csv(r'jiegou.csv')
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: