第一次来到这里,希望我做得对。
我有一个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.
答案 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])