【问题标题】:How can I sort through a range in a csv file in python?如何在 python 中对 csv 文件中的范围进行排序?
【发布时间】:2017-02-25 19:13:57
【问题描述】:

我的问题:我有一个 csv 文件,其中包含 90 到 3 米深的数据,并且这些数据会像这样来回传输。我正在使用最新的python。

例如。 (深度) 88, 77, 50, 20, 5, 90, 76, 54, 34, 15, 8, 4, 81, 74, 62,51, 49, 30, 22, 10, 8...等.它一直从 90 到 3,然后又回来。

我想要做的是每次数据介于 90 和 3 之间时将其分开。一旦分开,我想获取该列表中的最后一个值和第一个值。 像这样 前任。 88, 77, 50, 20, 5 (这里分开), 90, 76, 54, 34, 15, 8, 4 (这里分开) 81, 74, 62,51, 49, 30, 22, 10, 8 这里分开)... 等等。它一直从 90 到 3,然后又回来。

我该怎么做呢?或者我如何将它们分成列表,然后使用每个列表中的数据?

这是我目前的代码:

import csv, numpy
from collections import defaultdict

columns = defaultdict(list) # each value in each column is appended to a list

with open('C:\\Users\\AdamStoer\\Documents\\practicedata.csv') as f:

reader = csv.DictReader(f,delimiter=',') # read rows into a dictionary format
for row in reader:
    r = float(row['roll'])
    p = float(row['pitch'])
    if 0.21 <= p <= 0.31:
            if -0.06 <= r <= 0.06:
                columns['pitch'].append(row['pitch'])
                columns['roll'].append(row['roll'])
                columns['i_depth'].append(row['i_depth'])
                columns['irrad2'].append(row['sci_ocr504i_irrad2'])

print ('Pitch:')
print (columns['pitch'])
print ('Roll:')
print (columns['roll'])
print ('Depth')
print (columns['i_depth'])
print ("Irrandiance(2):")
print (columns['irrad2'])


irradlst = columns['irrad2']
irradfirst = irradlst[0]
irradlast = irradlst[-1]

depthlst = columns['i_depth']
depthfirst = depthlst[0]
depthlast = depthlst[-1]

print ("\nDepth 1 is " + depthfirst + " and " + "Depth 2 is " + depthlast)

print ("\nIrradiance 1 is " + irradfirst + " and " + "Irradiance 2 is " +     irradlast)

#Find the Volume Attenuation Coefficient

#irranddiv =  deepest/shallowest
irraddiv = float(irradfirst)/float(irradlast)

#depthdif = deepest-shallowest
depthdif = float(depthfirst) - float(depthlast)

#Find Log of irraddiv
irradlog = numpy.log(irraddiv)           

#Find K
K = irradlog/(-depthdif)

print("\nAttenuation Coefficient")
print (K)

【问题讨论】:

    标签: python python-3.x csv


    【解决方案1】:

    好吧,你的代码有点复杂,我不知道 numpy,无论如何这是我想出的用于分隔数字范围的解决方案:

    l = [88, 77, 50, 20, 5, 90, 76, 54, 34, 15, 8, 4, 81, 74, 62,51, 49, 30, 22, 10, 8,65]
    
    group =0 #since were using dictionaries i use group number as dictionary KEY to distinguish each group of number between 3 to 90 
    temp = [] # this is a list that we keep temporary group of our number ranged between 3 to 90
    splited_list = {} #this is a dictionary that we keep our final result in side it
    lengh = len(l) #this is a lengh of our list of numbers
    
    for i in range(lengh): # we run our code for each number inside our list of number
     if not i == lengh-1: # at this line we check if our number is not the last number in list , because in next line we check our number with the number that comes after our current number and if it's the last number we get "IndexError: list index out of range" error at next line
      if l[i] > l[i+1]: # since our range is between 3 to 90 , so if our current number is bigger than next number, for sure it is bigger than 3, so it is between 3 to 90 and we can add it to our current group of number
       temp.append(l[i])
      else: #if it is not bigger than the next number it is our last number in our current group of number in range of 90 to 3 so we add it to our temp 
       temp.append(l[i])
       group +=1
       splited_list.update({str(group):temp})
       temp = []
     else: # when we reach this line it means that we get to the last number in ourlist , since there is no next number , we check it with previous number , if its bigger it is not belong to current group of number between 3 to 90 and if it's smaller it is belong to the current group of number  
      if l[i] < l[-2]:
       temp.append(l[i])
       group +=1
       splited_list.update({str(group):temp})
       break
      else:
       group +=1
       splited_list.update({str(group):[l[i]]})
       break
    

    它根据需要将范围 90 到 3 分开,它给出以下输出:

    >>> splited_list
    {'2': [90, 76, 54, 34, 15, 8, 4], '1': [88, 77, 50, 20, 5], '4': [65], '3': [81, 74, 62, 51, 49, 30, 22, 10, 8]}
    

    【讨论】:

      【解决方案2】:

      这个任务很简单,numpy.diff()numpy.where() 如下:

      代码:

      import numpy as np
      
      def split_at_mins(a_list):
          end_points = list(1 + np.where(0 < np.diff(a_list))[0])
          return [a_list[i:j] for i, j in
                  zip([0] + end_points, end_points + [len(a_list)])]
      

      测试代码:

      test_data = (
          88, 77, 50, 20, 5,
          90, 76, 54, 34, 15, 8, 4,
          81, 74, 62, 51, 49, 30, 22, 10, 8
      )
      
      print('\n'.join(str(d) for d in split_at_mins(test_data)))
      print('\n'.join('%s %s' % (d[0], d[-1]) for d in split_at_mins(depth)))
      

      生产:

      (88, 77, 50, 20, 5)
      (90, 76, 54, 34, 15, 8, 4)
      (81, 74, 62, 51, 49, 30, 22, 10, 8)
      88 5
      90 4
      81 8
      

      【讨论】:

        猜你喜欢
        • 2015-06-14
        • 2017-04-16
        • 2017-06-23
        • 1970-01-01
        • 2015-05-24
        • 2014-02-07
        • 2019-04-06
        • 1970-01-01
        • 2011-01-06
        相关资源
        最近更新 更多