在Python中平均数组的部分

时间:2014-02-12 19:13:14

标签: python arrays numpy average

第一次来到这里,希望我做得对。

我有一个1960 - 2013年的日常温度数组,我使用np.genfromtxt从.txt文件中读取。我想采用年度数据方法(即1960年的平均值,1961年的平均值...... 2012年的平均值,2013年的平均值),我不确定如何仅取出我需要的数组子集的平均值。我的年份也与我的温度数据大小相同。

关于如何解决这个问题的最佳做法?

这是我到目前为止所拥有的。它只是读入了我的所有数据。

import numpy as np
import pandas as pd

city = ['Lubbock.txt','Erie.txt']

for x in range(0,len(city),1):

   data = np.genfromtxt(city[x], usecols=(6), dtype=('S8'))
   data2 = np.genfromtxt(city[x], usecols=(7,8,9))

   dates  = pd.DatetimeIndex(data[:])
   year   = dates.year
   month  = dates.month
   day    = dates.day
   precip = data2[:,0]/10.
   tmax   = data2[:,1]/10.
   tmin   = data2[:,2]/10.

2 个答案:

答案 0 :(得分:1)

我很高兴看到你正在使用熊猫。它使工作变得非常容易。您可以使用pd.read_table将数据读入DataFrame,并使用groupby计算平均值。

具体而言,假设您的数据文件如下所示:

Lubbock.txt

foo bar baz quux corge grault date precip tmax tmin
0 0 0 0 0 0 2012-1-1 10 20 30
0 0 0 0 0 0 2012-1-2 11 21 31
0 0 0 0 0 0 2012-1-3 12 22 32
0 0 0 0 0 0 2013-1-1 13 23 33
0 0 0 0 0 0 2013-1-2 14 24 34

然后使用Pandas,

import numpy as np
import pandas as pd

city = ['Lubbock.txt','Erie.txt']

for filename in city:
    data = pd.read_table(filename, sep='\s+', usecols=(6,7,8,9), parse_dates=[0])
    data[['precip', 'tmax', 'tmin']] /= 10.0

    years = pd.DatetimeIndex(data['date']).year
    avg = data.groupby(years)['precip', 'tmax', 'tmin'].mean()
    print(avg)

产量

      precip  tmax  tmin
2012    1.10  2.10  3.10
2013    1.35  2.35  3.35

编辑:使用@ chthonicdaemon的建议,你可以更简单地说:

for filename in city:
    data = pd.read_table(filename, sep='\s+', usecols=(6,7,8,9), parse_dates=[0],
                         index_col=[0])
    data[['precip', 'tmax', 'tmin']] /= 10.0
    avg = data.resample('A', how='mean')

答案 1 :(得分:0)

由于您的数据似乎已经排序,您应该能够使用np.where(),它将为您提供符合某些条件的数组索引。例如,

years = range(1960,2014)
tmax_avg, tmin_avg, precip_avg = ([],[],[])

for yr in years:
    toavg = np.where(year == yr)
    tmax_avg.append(np.average(tmax[toavg])
    tmin_avg.append(np.average(tmax[toavg])
    precip_avg.append(np.average(tmax[toavg])