Python 计算降雨强度的滚动平均值

Python 计算降雨强度的滚动平均值,python,average,rolling-computation,Python,Average,Rolling Computation,我有一些真实的降雨数据记录为日期和时间,以及倾卸桶雨量计上累积的小费数量。翻斗代表0.5mm的降雨量。 我想循环浏览文件并确定强度(降雨量/时间)的变化 所以我需要在多个固定时间范围内的滚动平均值: 所以我想累积降雨,直到累积5分钟的降雨,并以毫米/小时为单位确定强度。因此,如果在5分钟内记录3毫米,则等于3/5*60=36毫米/小时。 10分钟内的相同降雨量为18毫米/小时 因此,如果我有超过几个小时的降雨,我可能需要以几个标准间隔进行检查,例如:5、10、15、20、25、30、45、60分

我有一些真实的降雨数据记录为日期和时间,以及倾卸桶雨量计上累积的小费数量。翻斗代表0.5mm的降雨量。 我想循环浏览文件并确定强度(降雨量/时间)的变化 所以我需要在多个固定时间范围内的滚动平均值: 所以我想累积降雨,直到累积5分钟的降雨,并以毫米/小时为单位确定强度。因此,如果在5分钟内记录3毫米,则等于3/5*60=36毫米/小时。 10分钟内的相同降雨量为18毫米/小时

因此,如果我有超过几个小时的降雨,我可能需要以几个标准间隔进行检查,例如:5、10、15、20、25、30、45、60分钟等等。。。 此外,数据以相反的顺序记录在原始文件中,因此最早的时间是在文件的末尾,后面和最后的时间步骤首先出现在标题之后: 看起来。。。(这里975-961=14个尖端=7mm降雨量)平均强度1.4mm/hr 但在16:27和16:34之间967-961=6个尖端=7分钟内3毫米=27.71毫米/小时

7424 Figtree (O'Briens Rd)
DATE     :hh:mm Accum Tips
8/11/2011 20:33     975
8/11/2011 20:14     974
8/11/2011 20:04     973
8/11/2011 20:00     972
8/11/2011 19:35     971
8/11/2011 18:29     969
8/11/2011 16:44     968
8/11/2011 16:34     967
8/11/2011 16:33     966
8/11/2011 16:32     965
8/11/2011 16:28     963
8/11/2011 16:27     962
8/11/2011 15:30     961

有什么建议吗?

我不完全确定你有什么问题

你知道如何读出文件吗?您可以执行以下操作:

data = [] # Empty list of counts

# Skip the header
lines = [line.strip() for line in open('data.txt')][2::]

for line in lines:
    print line
    date, hour, count = line.split()
    h,m = hour.split(':')
    t = int(h) * 60 + int(m)      # Compute total minutes
    data.append( (t, int(count) ) ) # Append as tuple

data.reverse()
因为您的数据是累积的,所以您需要减去每两个条目,这就是 python的列表理解非常好

data = [(t1, d2 - d1) for ((t1,d1), (t2, d2)) in zip(data, data[1:])]
print data
现在我们需要循环,看看在过去的x分钟内有多少个条目

timewindow = 10
for i, (t, count) in enumerate(data):
    # Find the entries that happened within the last [...] minutes
    withinwindow = filter( lambda x: x[0] > t - timewindow, data )
    # now you can print out any kind of stats about this "within window" entries
    print sum( count for (t, count) in withinwindow )

因为时间戳不是以固定的间隔出现的,所以应该使用插值来获得最精确的结果。这也将使滚动平均更容易。我在下面的代码中使用了
Interpolate

from time import strptime, mktime

totime = lambda x: int(mktime(strptime(x, "%d/%m/%Y %H:%M")))
with open("my_file.txt", "r") as myfile:
    # Skip header
    for line in myfile:
        if line.startswith("DATE"):
            break
    times = []
    values = []
    for line in myfile:
        date, time, value = line.split()
        times.append(totime(" ".join((date, time))))
        values.append(int(value))
times.reverse()
values.reverse()
i = Interpolate(times, values)
现在只需要选择间隔并计算每个间隔端点之间的差异。让我们为其创建一个生成器函数:

def rolling_avg(cumulative_lookup, start, stop, step_size, window_size):
    for t in range(start + window_size, stop, step_size):
        total = cumulative_lookup[t] - cumulative_lookup[t - window_size]
        yield total / window_size
下面,我以10分钟的间隔打印前一个小时内每小时的提示数:

start = totime("8/11/2011 15:30")
stop = totime("8/11/2011 20:33")
for avg in rolling_avg(i, start, stop, 600, 3600):
    print avg * 3600

EDIT:使
totime
返回一个int并创建
滚动平均值发生器。

在16:27和16:34之间,肯定是967-962=5个tips=2.5mm?
zip
匹配两个或更多列表中的项目。所以
zip([1,2],'a','b'])=[(1,'a'),(2,'b')]
。使用这种方式,返回的元组由连续项组成,因为数据[1:]从第二个条目开始。。。。如果我需要创建多个区间的滚动平均值呢?比如说每分钟1分钟到3600?恐怕我不太明白你在问什么。对于滚动平均值,只有四个参数:开始、停止、步长(在上例中为600)和窗口大小(在上例中为3600)。如果您希望查看许多不同的窗口大小或步长,您可以为每个窗口大小或步长创建一个
rolling_avg
生成器,并对每个窗口大小或步长进行迭代。这回答了你的问题吗?如果没有,你能举一个你想做的事情的具体例子吗?是的,我想是的。。。我会给它一个窗口列表。我想做的是创建一个标准持续时间为1分钟到72小时的降雨强度(mm/hr)列表,比如2011年昆士兰发生的持续一周左右的风暴事件…@Rudy在这种情况下,在标准持续时间列表(以秒为单位)中为每个窗口大小创建一个rolling_avg生成器,然后在每个生成器上迭代听起来是正确的。