每日最大值数据文本文件

时间:2016-01-21 12:38:15

标签: python

我正在编写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

4 个答案:

答案 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可能很重,但您也可以免费获得大量数据分析方法(绘图,数据描述,数据选择......)