Python - повторять каждую строку в двух файлах CSV и сравнивать значения меток времени - PullRequest
0 голосов
/ 17 мая 2018

У меня есть два следующих файла CSV:

CSV File1:

Range1,2018-05-17 01:50:17+0000,2018-05-17 02:00:17+0000
Range2,2018-05-17 01:50:17+0000,2018-05-17 04:00:17+0000
Range3,2018-05-17 01:50:17+0000,2018-05-17 08:00:17+0000

CSV File2:

TimeStamp1,2018-05-17 01:59:17+0000
TimeStamp2,2018-05-17 03:59:17+0000
TimeStamp3,2018-05-17 07:59:17+0000

Я хотел бы пройтись по каждому диапазону в File1 и определить, какая временная метка попадает в сравниваемый диапазон. Например. вывод моего скрипта Python будет отображаться:

Выход:

TimeStamp1 falls within Range1
TimeStamp1, TimeStamp2 falls within Range2
TimeStamp1, TimeStamp2, TimeStamp3 falls within Range3

Я начал писать что-то подобное, но у меня возникли проблемы с получением выходных данных, и если оператор правильно перебирает исходно через File1 со всеми строками в File2, затем повторю со следующей строкой в ​​File1, повторяя все строки снова в File2. Заранее спасибо.

    import csv 

    with open('File1', 'rb') as range, open('File2', 'rb') as timeStamp: 

    range_reader = csv.reader(range, quotechar='"')
    timeStamp_reader = csv.reader(timeStamp, quotechar='"')
    for range_row in range_reader:
      print range_row[2]
      print range_row[3]
      for timeStamp_row in timeStamp_reader:
        print timeStamp_row[2]
        if range_row[2] <= timeStamp_row[2] and range_row[3] >= timeStamp_row[2]
          print " %s falls within %s "% (timeStamp_row[1], range_row[1])

Ответы [ 3 ]

0 голосов
/ 17 мая 2018
import csv 

with open('File1.csv', 'rb') as ranger, open('File2.csv', 'rb') as timeStamp: 

    range_reader = [x for x in csv.reader(ranger, quotechar='"')]
    timeStamp_reader = [x for x in csv.reader(timeStamp, quotechar='"')]
    for range_row in range_reader:
        temp = []
        for timeStamp_row in timeStamp_reader:
            if range_row[1] <= timeStamp_row[1] and range_row[2] >= timeStamp_row[1]:
                temp.append(timeStamp_row[0])
        if temp:
            print " %s falls within %s "% (','.join(temp), range_row[0])

Lukasas ans хорош, но в случае, если ваш набор данных большой, искать каждый раз в цикле for не может быть хорошей идеей. Просто скопируйте их в начале. Кроме того, чтобы сделать вывод, как вы хотите, вам нужно сохранить их в начале внешнего цикла.

TimeStamp1 falls within Range1
TimeStamp1,TimeStamp2 falls within Range2
TimeStamp1,TimeStamp2,TimeStamp3 falls within Range3
0 голосов
/ 17 мая 2018

Как вы увидите, я сделал много изменений, начав с того, что написал код на Python 3. Используете ли вы Python 2?

В любом случае, с удовольствием отвечу на вопросы. Я думаю, что это работает в основном так, как вы хотите:

import csv 
import datetime


with open('File1', 'r') as range, open('File2', 'r') as timeStamp: 

    range_rows = list(csv.reader(range, quotechar='"'))
    timeStamp_rows = list(csv.reader(timeStamp, quotechar='"'))
    range_list = []
    d=datetime.datetime.now()
    for row in range_rows:
        time = [row[0], d.strptime(row[1][:-5],"%Y-%m-%d %H:%M:%S"), d.strptime(row[2][:-5],"%Y-%m-%d %H:%M:%S")]
        range_list.append(time)
    timeStamp_list = []
    for row in timeStamp_rows:
        time = [row[0], d.strptime(row[1][:-5],"%Y-%m-%d %H:%M:%S")]
        timeStamp_list.append(time)
    for i in range_list:
        for e in timeStamp_list:

            if i[1] <= e[1] and i[2] >= e[1]:
                print(" %s falls within %s "% (e[0], i[0]))

Выход:

 TimeStamp1 falls within Range1 
 TimeStamp1 falls within Range2 
 TimeStamp2 falls within Range2 
 TimeStamp1 falls within Range3 
 TimeStamp2 falls within Range3 
0 голосов
/ 17 мая 2018

В вашем коде мало ошибок.Прежде всего, у вас испортились индексы.Индексирование в этом начинается с 0. Так что просто вычтите 1 из всех ваших индексов.

Вы не можете многократно читать из файла, потому что читатель дойдет до конца, а потом больше ничего не будет читать, потому что он в конце.Итак, для второго цикла, вам нужно сбросить его читатель обратно, чтобы начать.Это можно легко сделать, установив поиск.

import csv 
with open('File1', 'r') as ranges, open('File2', 'r') as timeStamp: 
  range_reader = csv.reader(ranges, quotechar='"')
  timeStamp_reader = csv.reader(timeStamp, quotechar='"')
  rangeArray = {}
  for range_row in range_reader:
    print("%s / %s" % ( range_row[1], range_row[2])) # This looks better, and gives more info than just printing both timestamps on each line
    timeStamp.seek(0) # This will set position of cursor in timeStamp back to start, so it can iterate repeatedly
    rangeArray[range_row[0]] = []
    for timeStamp_row in timeStamp_reader:
      if range_row[1] <= timeStamp_row[1] and range_row[2] >= timeStamp_row[1]:
        rangeArray[range_row[0]].append(timeStamp_row[0])
        print (" %s falls within %s " % (timeStamp_row[0], range_row[0]))

print("\n\n")

# Desired Output:
for key in rangeArray:
  print("%s falls within %s" % (', '.join([str(x) for x in rangeArray[key]]), key))

Это дает следующий вывод:

2018-05-17 01:50:17+0000 / 2018-05-17 02:00:17+0000
 TimeStamp1 falls within Range1
2018-05-17 01:50:17+0000 / 2018-05-17 04:00:17+0000
 TimeStamp1 falls within Range2
 TimeStamp2 falls within Range2
2018-05-17 01:50:17+0000 / 2018-05-17 08:00:17+0000
 TimeStamp1 falls within Range3
 TimeStamp2 falls within Range3
 TimeStamp3 falls within Range3



TimeStamp1 falls within Range1
TimeStamp1, TimeStamp2 falls within Range2
TimeStamp1, TimeStamp2, TimeStamp3 falls within Range3
...