2014-02-12 4 views
1

Впервые здесь, надеюсь, я делаю это правильно.Усреднение частей массива в Python

У меня есть массив ежедневных температур за 1960-2013 годы, которые я читал из .txt-файла, используя np.genfromtxt. Я хочу получать годовые средства данных (т. Е. Среднее значение для 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. 
+3

Можете ли вы показать нам код, который вы имеете до сих пор? –

+0

Вы можете получить часть массива в python, используя 'array [start: end]' –

+0

Просто обновил его, чтобы показать вам, что у меня есть. – DJV

ответ

1

Я рад видеть, что вы используете Панды. Это делает работу очень простой. Вы можете прочитать свои данные в DataFrame, используя pd.read_table, и вычислить средние значения, используя 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 

Затем с помощью панд,

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 

Edit: Использование предложения @ 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') 
+0

На самом деле вам не нужна 'groupby' - вы можете просто использовать' .resample ('A', how = 'mean') ' – chthonicdaemon

+0

Я только что нашел эту функцию в пандах сегодня, но я не слишком хорошо знаком с пакет до этого момента. Я уверен, это тоже поможет. Благодаря! – DJV

+0

@chthonicdaemon: Спасибо; это даже лучше. – unutbu

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]) 
+0

Это сработало! Огромное спасибо. – DJV

Смежные вопросы