我正在编写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
您重复了取最大值而不是计算平均值的逻辑。
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)来做一个数组的最大。您不需要自己编写整个逻辑。这同样适用于均值计算。
好吧,您意识到计算最大值与计算平均值不同,但是您对两者使用完全相同的算法(遍历列表并在值大于存储值时保存该值)。
您应该熟悉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条记录),你可以尝试使用列表索引:
>>> jan_max = max(stations[:30]) # for the first 30 days
>>> jan_av = sum(stations[:30])/len(stations[:30])
把它放在一个循环中(比如在MIE的答案中),你应该很高兴。
最后,如果你需要做很多这样的操作,我建议你学习使用像熊猫这样的库,它大大简化了这个过程。
如果要获取每月数据的平均值,而不是整个月每日最大值的平均值,则可以执行以下操作:
[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
根据你的说法,我认为这将是 Pandas 库的一个很好的用例(而且你已经有一个 numpy 依赖)。
将数据作为时间序列加载到 Pandas 数据帧中后,可以使用 resample
方法。
ts.resample('M', how='mean')
添加熊猫可能很繁重,但您也可以免费获得很多数据分析方法(绘图、数据描述、数据选择......