【问题标题】:Python - Iterate each line in two CSV files and compare timestamp valuesPython - 迭代两个 CSV 文件中的每一行并比较时间戳值
【发布时间】:2018-10-27 07:38:59
【问题描述】:

我有以下两个 CSV 文件:

CSV 文件 1:

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 文件 2:

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 中的每个 Range 并确定哪个 TimeStamp 落在被比较的 Range 内。例如。我的 Python 脚本的输出将显示:

输出:

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

我开始写这样的东西,但是在获取输出和 if 语句时遇到问题,无法正确地通过 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])

【问题讨论】:

  • 只是澄清一下:我想取 File1 中的第一行,并遍历 File2 中的每一行以查看 Timestamp 是否在第一个 Range1 内。然后取 File1 中的第二行,并再次遍历 File2 中的每一行,然后取 File1 中的第三行,并再次遍历 File2 中的每一行等...

标签: python csv timestamp compare range


【解决方案1】:
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

【讨论】:

    【解决方案2】:

    您的代码中几乎没有错误。首先,你的索引搞砸了。这里的索引从 0 开始。所以只需从所有索引中减去 1。

    你不能重复从文件中读取,因为阅读器会读到它的结尾,然后它就不会再读任何东西了,因为它在结尾。因此,对于第二个循环,您需要重新设置它的阅读器以重新开始。这可以通过设置 seek 轻松完成。

    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
    

    【讨论】:

      【解决方案3】:

      如您所见,我做了很多改动,首先是用 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 
      

      【讨论】:

        猜你喜欢
        • 2017-09-07
        • 2014-08-24
        • 1970-01-01
        • 2022-01-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多