2014-07-05 56 views
1

我有一个带有DateTime索引的熊猫数据框。数据间隔为5分钟。对于每个我有来自hellmann precipitation gauge降水数据。我所掌握的数据并没有显示实际的降水量,而是以毫米为单位显示的,但是仪表中的水的高度。因此,如果我想获得小时降水数据,那么如果当前测量值与之前测量值之间存在差异,则需要检查该小时内的所有行。如果这样总结起来。但还有一点需要注意,如果仪表内的水达到100毫米,仪表将自动清空,整个过程从头开始。大熊猫的每个时间帧的降水量总和DataFrame

如果tprep - (tprep-1)> 0取增量

如果tprep <(tprep-1)取100 - (tprep-1)+ tprep

如果tprep =(tprep- 1)什么也不做

数据:

8:00 78 
8:05 78 
8:10 82 
8:15 82 
8:20 82 
8:25 90 
8:30 91 
8:35 91 
8:40 98 
8:45 3 
8:50 3 
8:55 5 

这应该使27毫米预在这个小时内沉淀。当然,在时间范围内,它可能会跳过几次超过100次,特别是如果时间表较长的话。有谁知道从这样的数据集中获得降水总和的有效方法吗?

+0

所有条件都可以被描述为',δ=(100 + tprep - (tprep-1))模100' – furas

回答

1

你所有的三个条件可以被描述为一个delta = (100 + tprep - (tprep-1)) mod 100
甚至为delta = (tprep - (tprep-1)) mod 100

import pandas as pd 
from StringIO import StringIO 

data = """8:00 78 
8:05 78 
8:10 82 
8:15 82 
8:20 82 
8:25 90 
8:30 91 
8:35 91 
8:40 98 
8:45 3 
8:50 3 
8:55 5""" 

df = pd.read_csv(StringIO(data), sep=' ' , header=None) 

df[1] = df[1].apply(int) 

现在我有数据框中工作

df['diff'] = df[1].diff() 
df['diff_modulo'] = df['diff'].mod(100) 

print df 

 0 1 diff diff_modulo 
0 8:00 78 NaN   NaN 
1 8:05 78  0   0 
2 8:10 82  4   4 
3 8:15 82  0   0 
4 8:20 82  0   0 
5 8:25 90  8   8 
6 8:30 91  1   1 
7 8:35 91  0   0 
8 8:40 98  7   7 
9 8:45 3 -95   5 
10 8:50 3  0   0 
11 8:55 5  2   2 

print df['diff_modulo'].sum() 

27.0 

当然,你可以得到它在一个移动

print df[1].diff().mod(100).sum() 
+0

这样的简单的解决方案。太好了谢谢!还有一个问题。我有四个星期的数据和目前按小时计算的降水量。这给了我很多小时,0降水。问题是当我尝试绘制一个大型数据框作为条形图时,pandas/matplotlib试图绘制0值并且绘图是无用的。你有一个想法如何解决这个问题?我应该用np.nan替换所有的0值吗?谢谢 –

+1

关于我最后一个问题,用nan作品取代所有0值。 df ['diff_modulo'] [df ['diff_modulo'] == 0] = np.nan当然,我在重新采样数据帧后 –