每日最大值数据文本文件中的月平均值



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

添加熊猫可能很繁重,但您也可以免费获得很多数据分析方法(绘图、数据描述、数据选择......

最新更新