【问题标题】:How to write Previous,Current and Next row to an output CSV file based on a condition in input CSV如何根据输入 CSV 中的条件将上一行、当前行和下一行写入输出 CSV 文件
【发布时间】:2019-09-16 12:26:54
【问题描述】:

我只想根据条件将输入 CSV 文件中的某些行写入输出 CSV:如果满足条件,则将 上一行、当前行和下一行写入输出 CSV。这是我到目前为止所做的:

with open('DATA 12-09-19.csv',newline ='') as csvfile:
  bData = csv.reader(csvfile,delimiter=',')
  header = next(bData)
  data = []  

  for row in bData:
      date = datetime.strptime(row[0], '%d/%m/%Y %H:%M')
      open_price = float(row[1])
      high_price = float(row[2])
      low_price = float(row[3])
      close_price = float(row[4])
      sup = ((high_price - open_price)* 100)
      sown = ((open_price - low_price)* 100)
      data.append([date,open_price,high_price,low_price,close_price,round(sup),round(sown)])

with open("Result_Data.csv",'w',newline='') as f_output:
    csv_output = csv.writer(f_output,delimiter=',')
    csv_output.writerow(header)
    for row in data:
        if row[0].time() >= datetime.strptime(starting_time, '%H:%M').time() and row[0].time() <= datetime.strptime(ending_time, '%H:%M').time(): #Condition 1 to be met
            if row[5] >= 7 or row[6] >= 7: #Condition 2 to be met
                csv_output.writerow(row) # Only outputting current row

我的数据列是:

日期,开,高,低,收,上,播。

我应该怎么做才能将上一行和下一行写入输出 CSV,而不是像现在使用 csv 模块那样只写入当前行?

【问题讨论】:

    标签: python csv


    【解决方案1】:

    我会尝试为您的行使用索引。

    for i in range(1, len(data)-1):
        if data[i][0].time() >= datetime.strptime(starting_time, '%H:%M').time() and data[i][0].time() <= datetime.strptime(ending_time, '%H:%M').time(): #Condition 1 to be met
            if data[i][5] >= 7 or data[i][6] >= 7: #Condition 2 to be met
                csv_output.writerow(data[i-1])
                csv_output.writerow(data[i]) 
                csv_output.writerow(data[i+1])
    

    范围在 1 和 len(data)-1 之间,否则第一行或最后一行会出现索引错误。

    附加说明:如果 2 个相连的行(例如第 2 行和第 3 行)都满足条件,第 2 行和第 3 行显然会被写入两次。我不知道这是您的意图还是标准阻止了这种情况的发生。

    编辑:

    ids = []
    for i in range(1, len(data)-1):
        if data[i][0].time() >= datetime.strptime(starting_time, '%H:%M').time() and data[i][0].time() <= datetime.strptime(ending_time, '%H:%M').time(): #Condition 1 to be met
            if data[i][5] >= 7 or data[i][6] >= 7: #Condition 2 to be met
                if (i-1) not in ids:
                    csv_output.writerow(data[i-1])
                    ids.append(i-1)
                if i not in ids:
                    csv_output.writerow(data[i]) 
                    ids.append(i)
                if (i+1) not in ids:
                    csv_output.writerow(data[i+1])
                    ids.append(i+1)
    

    【讨论】:

    • 非常感谢伙计,这正是我所需要的。我现在通过您的附加说明了解您的意思,这确实很烦人。如何防止重复行?
    • 在我的头上:您可以创建一个包含行索引的列表,并检查您要写入的行是否已经写入。可能有一个更聪明的解决方案。我会在几秒钟内进行编辑
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-25
    • 2019-11-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多