我正在编写Python脚本,这应该可以帮助我绘制一些结果。在其中一个脚本中,我在一个文本文件中读取臭氧测量的每小时数据。 由此我设法得到每日最大值,但当我尝试获得每月平均浓度时,我得到月度最大值。
如何从这些每日最大值中获得月平均臭氧浓度?
这是“范围内的j”等部分。
# Reading in the ASCII file with observations
f = open(sfile, 'r')
header1 = f.readline()
station = []
for line in f:
line = line.strip()
columns = line.split()
data = float(columns[4])
station.append(data)
# Getting daily maximum from observational data
# Momentarily it is still hourly data
xmax = np.zeros(366)
day=1
hh=0
for i in range(0, len(station)):
if station[i]>xmax[day]:
xmax[day]=station[i]
hh = hh+1
if (hh>23):
day = day+1
hh = 0
# Getting monthly mean from observational data
ymax = np.zeros(13)
month=1
day=0
for j in range(0, len(xmax)):
if xmax[j]>ymax[month]:
ymax[month]=xmax[j]
day = day+1
if (day>30):
month = month+1
day = 0
答案 0 :(得分:0)
如果您想获得月度数据的平均值,而不是整月的每日最高值的平均值,您可以这样做:
[1.0*sum(station[i:i+23*30])/23*30 for i in range(0,len(station),23*30)]
但如果你想要最大值的平均值:
ymax = np.zeros(13)
month=1
day=0
for j in range(0, len(xmax)):
ymax[month]+=xmax[j]
day = day+1
if (day>30):
ymax[month] /= 30.0
month = month+1
day = 0
答案 1 :(得分:0)
你已经重复了取max而不是计算均值的逻辑。
ymax = np.zeros(13)
month=1
day=0
for j in range(0, len(xmax)):
if xmax[j]>ymax[month]:
ymax[month]=xmax[j]
day = day+1
if (day>30):
month = month+1
day = 0
您必须将每日最大值相加,然后除以天数(30)才能获得平均值。你可以通过这样做来实现它,
ymax = np.zeros(13)
month=1
day=0
ymax[month] = 0
for j in range(0, len(xmax)):
if xmax[j]>ymax[month]:
ymax[month] += xmax[j]
day = day+1
if (day>30):
month = month+1
day = 0
ymax[month] = 0
# then divide it by number of days
ymax = ymax / 30.0
顺便说一句,python非常用户友好,只需执行max(array)即可完成数组的最大化。您不需要自己编写整个逻辑。同样适用于平均计算。
答案 2 :(得分:0)
嗯,您意识到计算最大值与计算平均值并不相同,但您对两者使用完全相同的算法(循环遍历列表并保存值,如果它大于存储值)。
您应该熟悉min()
,max()
和sum()
函数,这些函数可以让您以更少的代码编写相同的内容。
例如,您可以在每行中获取年度最大值和平均值:
>>> year_max = max(stations)
>>> year_av = sum(stations)/len(stations) #Be careful about divisions if you are using python 2 !
如果您想获得每月(=每24 * 30)或每天(=每24条记录),您可以尝试使用list indexing:
>>> jan_max = max(stations[:30]) # for the first 30 days
>>> jan_av = sum(stations[:30])/len(stations[:30])
把它放在一个循环中(例如在MIE的答案中),你应该好好去。
最后,如果您需要进行大量此类操作,我建议您学习使用pandas这样的库,这样可以简化这一过程。
答案 3 :(得分:0)
根据你的说法,我认为这对于Pandas库来说是一个很好的用例(你已经拥有了一个笨拙的依赖)。
在Pandas dataframe as a timeseries中加载数据后,您可以使用resample
method。
ts.resample('M', how='mean')
添加Pandas可能很重,但您也可以免费获得大量数据分析方法(绘图,数据描述,数据选择......)