场次降雨数据划分
2017-12-16 20:26
113 查看
降雨是有可能断断续续的。从水文的角度出发,若降雨的时间间隔较短,可以作为一次降雨过程;若时间间隔较长,则应划分为不同的降雨场次。通常可以采用时间间隔为n h以划分场次降雨的标准(如n取值为6h),即在连续6h以上内均未监测到降雨数值,则视为两次降雨过程,出现的降雨间隔不足6h的,为同一场降雨。 根据雨量计监测获取的分钟级或5分钟级数据,按照上述思路,通过pandas做场次降雨数据划分和降雨相关特征分析。
1.导入库,获取数据
2.场次降雨划分函数:去掉0值后,找出连续两个值之间的时间差是否大于设置的划分标准
3.处理数据函数:由于数据缺失或者原始数据没有保存0值数据,故加上0值,为以后求取总降雨量和其他降雨特征做准备
4.处理降雨数据,提取降雨特征值
5.划分降雨,并计算场次降雨特征值
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')
相关文章推荐
- java学习路线__基础入门向__java数据类型划分__4
- jvm 数据区划分学习
- Java数据类型的划分
- 多路技术计算挖掘中的隐私保护协作文件传输的共享安全数据划分
- Hadoop中InputFormat分析——数据划分、调度、读取
- Oracle12C--数据类型划分(二十七)
- 怎么在不破坏数据的前提下重新划分分区?
- 自定义星期几做为划分依据批量生成每个月的周信息(一):基础数据构建
- 一种按点划分,对于随机数据表现良好的非常规二维数据结构(二维KD树)
- Java虚拟机进阶之二:运行时数据区内存划分
- 转:『Sklearn』数据划分方法及python代码
- 使用Vista/windows 7自带分区工具 实现磁盘大小重新划分(无损数据)
- 时间按季、月、日、时、分划分数据
- Oracle12C--数据类型划分(二十七)
- java 数据类型的划分
- 用sklearn.model_selection.train_test_split进行机器学习数据及划分
- Java基础2:Java数据类型的划分及其注意事项
- java数据类型划分和常量与变量定义
- 数据仓库的模型设计 A. 数据建模方法论 数据仓库模型设计遵循“自顶向下、逐步求精”的设计原则。 模型设计分为三个阶段: 1,概念模型 对业务的范围和使用,从高度上进行抽象概括,也就是划分主题域。 一
- 数据结构(c++)--map划分词典的相似单词