2014-09-19 3 views
0

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

3.13 
3.51 
3.51 
4.01 
2.13 
1.13 
1.13 
1.13 
1.63 
1.88 

То, что я хотел бы сделать сейчас, чтобы COUNT значения в пределах этих интервалов: 0-1 , 1-2, 2-3,> 3

Так что результат будет

0-1: 0 
1-2: 5 
2-3: 1 
>3: 4 

Помимо этой основной задачи я хотел бы вычислить результат в процентах от общего числа (например, 0-1: 0%, 1-2: 50%, ...)

Я совершенно новый для Python, поэтому я застрял в своих attemps, решая эту вещь. Может быть, есть предопределенная функция для решения этого, о котором я не знаю?

Большое спасибо за вашу помощь !!!

+++ UPDATE: +++

Спасибо за все ответы. У меня есть семечки из них, но я вроде делаю что-то неправильно с чтением CSV-файла, я думаю. Ссылаясь на фрагменты кода, используя a, b, c, d для разных intervalls, эти переменные всегда остаются «0» для меня.

Вот мой фактический код:

import csv 

a=b=c=0 
with open('winter.csv', 'rb') as csvfile: 
    spamreader = csv.reader(csvfile, delimiter=',') 
    for row in spamreader: 
     if row in range(0,1): 
      a += 1 
     elif row in range (1,2): 
      b += 1 

print a,b 

Я также конвертируются все значения в CSV для Целые без успеха. В CSV имеется только один столбец. Любые идеи, что я делаю неправильно ???

+1

Каковы ваши попытки? – ssm

+0

Я немного смущен тем, что вы ищете ... Итак, вы хотите пройти через каждое число и дать ему значение, основанное на том, на каком диапазоне он падает? Если да, то что вы делаете с этими ценностями? –

+0

Существует функция под названием 'filter', а другая -' len', которую вы должны искать. Попробуйте их и посмотрите, сможете ли вы найти решение. https://docs.python.org/2/library/functions.html – ssm

ответ

0
import csv 
a=b=c=d=0 
with open('cf.csv', 'r') as csvfile: 
    spamreader = csv.reader(csvfile) 
    for row in spamreader: 
      if 0<float(row[0])<1: 
       a+=1 
      elif 1<float(row[0])<2: 
       b+=1 
      elif 2<float(row[0])<3: 
       c+=1 
      if 3<float(row[0]): 
       d+=1 

    print "0-1:{} \n 1-2:{} \n 2-3:{} \n <3:{}".format(a,b,c,d) 

вне положенный:

0-1:0 
1-2:5 
2-3:1 
<3:4 

Из-за ваши строки являются типом списка мы используем [0] индекс для доступа к нашим данным и преобразовать строку в плывет float() функции.

+0

Используя этот метод, я всегда получаю эту ошибку: print: "0-1: {} \ n 1-2: {} \ n 2-3: {} \ n <3: {}". Format (a , b, c, d) ^ СинтаксисError: недействительный синтаксис Когда я меняю это на «print a», он всегда «0» - то же самое с b, c, d – ranzbert

+0

да извините, его синтаксическая ошибка вы должны удалите ':' после 'print' отредактируйте ответ! – Kasramvd

+0

Кажется, что он не распознает значение из CSV. Если значение CSV равно «1», и я только один одиночный if-loop, как это, «если строка> 2: a + = 1», он увеличивает его на 1 EVEN THOUGH 1 <2, и поэтому его не следует считать. Этот код действительно работает для u ?? – ranzbert

0

Это следует сделать, если данные из CSV в values:

from collections import defaultdict 

# compute a histogram 
histogram = defaultdict(lambda: 0) 
interval = 1. 
max = 3 
for v in values: 
    bin = int(v/interval) 
    bin = max if bin >= max else bin 
    histogram[bin] += 1 

# output 
sum = sum(histogram.values()) 
for k, v in sorted(histogram.items()): 
    share = 100. * v/sum 
    if k >= max: 
     print "{}+ : {}, {}%".format(k, v, share) 
    else: 
     print "{}-{}: {}, {}%".format(k, k+interval, v, share) 
0

После того, как вы получите записи в списке:

0_to_1 = 0 
1_to_2 = 0 
2_to_3 = 0 
ovr_3 = 0 

for i in list: 
    if i in range(0,1): 
      0_to_1 += 1 
    elif i in range (1,2): 
      1_to_2 += 1 

так далее и так далее ...

И найти разбивку:

total_values = 0_to_1 + 1_to_2 + 2_to_3 + Ovr_3 

perc_0_to_1 = (total_values/0_to_1)*100 
perc_1_to_2 = (total_values/1_to_2)*100 
perc_2_to_3 = (total_values/2_to_3)*100 
perc_ovr_3 = (total_values/ovr_3)*100 

+++++ Ответ Обновление +++++++

import csv 

a=b=c=0 
with open('winter.csv', 'rb') as csvfile: 
    spamreader = csv.reader(csvfile, delimiter=',') 
    for row in spamreader: 
     for i in row: 
      i = float(i.strip()) # .strip() removes blank spaces before converting it to float 
      if row in range(0,1): 
       a += 1 
      elif row in range(1,2): 
       b += 1 
      # add more elif statements here as desired. 

Надежда, которая работает. Боковое примечание, мне нравится, что a = b = c = o вещь. Не понимал, что ты можешь это сделать после всего этого хаха.

+0

Я реализовал части вашего кода в мой (как это легче всего понять для меня). Но почему-то я не могу заставить его работать - см. Мое обновление выше. спасибо! – ranzbert

+0

Смотрите мое обновление. (Мне нравится держать вещи простыми. Ни один из них не импортирует 4 вещи для сортировки чисел, LOL) –

2

Вот как сделать это в очень сжатой форме с numpy:

import sys 
import csv 
import numpy as np 

with open('winter.csv') as csvfile: 
    field = 0 # (zero-based) field/column number containing the required values 
    float_list = [float(row[field]) for row in csv.reader(csvfile)] 

#float_list = [3.13, 3.51, 3.51, 4.01, 2.13, 1.13, 1.13, 1.13, 1.63, 1.88] 

hist, bins = np.histogram(float_list, bins=[0,1,2,3,sys.maxint]) 
bin_counts = zip(bins, bins[1:], hist) # [(bin_start, bin_end, count), ... ] 

for bin_start, bin_end, count in bin_counts[:-1]: 
    print '{}-{}: {}'.format(bin_start, bin_end, count) 

# different output required for last bin 
bin_start, bin_end, count = bin_counts[-1] 
print '>{}: {}'.format(bin_start, count) 

Какие выходы:

0-1: 0 
1-2: 5 
2-3: 1 
>3: 4 

Большинство усилий в массирования данных для вывода.

Он также довольно гибкий, так как легко использовать разные интервалы, изменяя аргумент bins на np.histogram(), например. добавить еще один интервал, изменив bins:

hist, bins = np.histogram(float_list, bins=[0,1,2,3,4,sys.maxint]) 

выходы:

0-1: 0 
1-2: 5 
2-3: 1 
3-4: 3 
>4: 1 
Смежные вопросы