我有一些真实的降雨数据记录为日期和时间,以及倾翻式雨量计上的累积尖端数量。翻斗式水桶代表0.5毫米的降雨量。 我想在文件中循环并确定强度的变化(降雨/时间) 所以我需要在多个固定时间范围内滚动平均值: 所以我想累积降雨量,直到积累了5分钟的雨量,并以毫米/小时为单位确定强度。因此,如果在5分钟内记录3毫米,则等于3/5 * 60 = 36毫米/小时。 同样的降雨量超过10分钟将是18毫米/小时...
因此,如果我有几个小时的降雨量,我可能需要按照几个标准间隔进行检查:5,10,15,20,25,30,45,60分钟等... 此外,数据在原始文件中以相反的顺序记录,因此最早的时间位于文件的末尾,后一个和最后一个时间步骤首先出现在标题之后: 看起来......(这里975 - 961 = 14个提示= 7毫米降雨量)平均强度1.4毫米/小时 但是在16:27和16:34之间967-961 = 6个提示= 3毫米7分钟= 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
有什么建议吗?
答案 0 :(得分:1)
我不完全确定你有什么问题。
你知道怎么读出这个文件吗?你可以这样做:
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 )
答案 1 :(得分:0)
由于时间戳不是定期出现的,因此您应该使用插值来获得最准确的结果。这将使滚动平均值更容易。我在下面的代码中使用了this answer中的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
编辑:制作totime
返回一个int并创建rolling_avg
生成器。