2013-11-29 2 views
0

У меня есть excel/(для преобразования в CSV a link) файл. Данные-, имеет 8 столбцов. Первые два являются днем ​​года и времени соответственно, а два перед последними - это минимальная температура и максимальная температура. Для каждого дня мне нужно найти максимум и минимум вычитания дня и сохранить значение для этого дня.Python, анализируя данные 24 часа в то время из 263 дней

Две проблемы, с которыми я столкнулся, как разобрать 24 строки за раз (нет пропущенных строк данных!) И в каждой партии найти максимум или минимум.

У меня есть 63126 строк = 24 часа в сутки * 263 дней

Так перебирать линий;

import numpy as np 

input_temps='/L7_HW_SASP_w1112.csv' 
up_air_min=np.genfromtxt(input_temps,skip_header=1, dtype=float, delimiter=',',usecols=(5)) 
up_air_max=np.genfromtxt(input_temps,skip_header=1, dtype=float, delimiter=',',usecols=(6)) 
day_year=np.genfromtxt(input_temps,skip_header=1, dtype=float, delimiter=',',usecols=(0)) 


dt_per_all_days=[] 
for i in range (0,63126,1): 

    # I get stuck here how to limit the iteration for 24 at a time. 
    # if I can do that I think I can get the rest done. 


    min_d=[] 
    max_d=[] 
    min_d.append(up_air_min[i]) 
    max_d.append(up_air_max[i]) 
    max_per_day=max(max_d) 
    min_per_day=min(min_d) 
    dt_d=max_per_day-min_per_day 
    dt_per_all_days.append(dt_d) 

    del(min_d) 
    del(max_d) 
    move to the next batch of 24 lines.... 

`

+0

(ненавижу говорить) в два раза для цикла? один для 24 и один для 263? – usethedeathstar

ответ

1

Разумно вещий способ сделать это будет иметь функцию, которая закругляется по рядам, собирая их и выплевывая собранные строки с помощью yield при изменении день. Это дает вам генератор, который генерирует 263 списка, каждый из которых содержит 24 значения, что немного легче обрабатывать.

Если у вас определенно отсутствуют какие-либо недостающие значения, вы можете использовать тривиальный двойной вложенный цикл без предварительной обработки элементов. Это немного более хрупко, но похоже, что вы, возможно, еще не планируете повторно использовать код.

+0

Лучше использовать numpy/scipy. –

+0

Я мог бы сделать это с помощью массивов numpy, но я зациклился на том, как итерации 24 часа за раз. Я могу видеть, куда вы идете, но не уверен, как применить его. – icypy

1

Вот несколько надуманный пример того, как вы могли бы обмениваться вещами по 24 строкам за раз.

from StringIO import StringIO 
from random import random as r 
import numpy as np 
import operator 

s = StringIO() 
for x in xrange(0,10000): 
     s.write('%f,%f,%f\n' % (r(),r()*10,r()*100)) 
s.seek(0) 

data = np.genfromtxt(s,dtype=None, names=['pitch','yaw','thrust'], delimiter=',') 

for x in range(0,len(data),24): 
     print('Acting on hours %d through %d' % (x, x+24)) 
     one_day = data[x:x+24] 
     minimum_yaw = min(one_day['yaw']) 
     max_yaw = max(one_day['yaw']) 
     print 'min',minimum_yaw,'max',max_yaw,'one_day',one_day['yaw'] 
3

Используйте Numpy, Luke, избегайте петель.

Затем у вас есть ap_air_min и ap_air_max массивов numpy, которые вы можете легко делать с помощью функций numpy element-wise.

Во-первых, создать 2d массив с 263 строками (один на один день) и 24 столбцов, как это:

min_matrix = up_air_min.reshape((263, 24)) 
max_matrix = up_air_max.reshape((263, 24)) 

Затем с помощью np.min и np.max функции вдоль оси 1 (good array tip sheet):

min_temperature = np.min(min_matrix, axis=1) 
max_temperature = mp.max(max_matrix, axis=1) 

И найти разницу:

dt = max_temperature - min_temperature 

dt - массив с необходимыми значениями. Давайте сохраним его foo.csv:

np.savetxt('foo.csv', np.swapaxes([day_year, dt], 0, 1), delimiter=',') 

И окончательный код выглядит следующим образом:

import numpy as np 

# This I got from your answer. 
input_temps='/L7_HW_SASP_w1112.csv' 
up_air_min=np.genfromtxt(input_temps,skip_header=1, dtype=float, delimiter=',',usecols=(5)) 
up_air_max=np.genfromtxt(input_temps,skip_header=1, dtype=float, delimiter=',',usecols=(6)) 
day_year=np.genfromtxt(input_temps,skip_header=1, dtype=float, delimiter=',',usecols=(0)) 

# Split arrays and create matrix with 263 lines-days and 24 values in every line. 
min_matrix = up_air_min.reshape((263, 24)) 
max_matrix = up_air_max.reshape((263, 24)) 

# Find min temperature for every day. min_temperature is an array with 263 values. 
min_temperature = np.min(min_matrix, axis=1) 
# The same for max temperature. 
max_temperature = mp.max(max_matrix, axis=1) 

# Subtract min temperature from max. 
dt = max_temperature - min_temperature 

# Save result in csv. 
np.savetxt('foo.csv', np.swapaxes([day_year, dt], 0, 1), delimiter=',') 
+0

Это очень здорово, не думал об этом так ... Но я не понимаю, как я изменил бы матрицу данных, которую я сейчас имею. Это решение не исключает возможности выбора 24 строк за раз.Или, может быть, я ошибался в этом? – icypy

+0

В моем сообщении есть ссылка на форму данных. – icypy

+0

Да, я сделал опечатку. См. Отредактированный пост. min_matrix - массив с 263 строками и 24 номерами в каждой строке. Когда вы используете np.min вдоль оси 1, вы применяете функцию min к каждой строке. Поскольку np.min является поэтапно, вы получаете массив с 263 значениями в качестве возвращаемого значения - одно значение за день. Так что это полное решение. Я ответил на ваш вопрос, или у меня его нет? –