【问题标题】:Arranging real-time sensor input data based on timestamp根据时间戳排列实时传感器输入数据
【发布时间】:2020-10-19 08:06:53
【问题描述】:

我有来自两个不同传感器输入的实时时间序列数据。我想按照时间戳来排列数据。

问题是接收到的传感器输入不一致,例如

 sensor      time  data1     data2     data3     data 4  
['sensor_1', '0', '0.1234', '0.3251', '1.4235', '0.4234']
['sensor_1', '1', '0.1432', '0.3452', '1.4245', '0.1434']
['sensor_2', '0', '0.6543', '0.3231', '1.1235', '0.3434']
['sensor_1', '2', '0.1654', '0.3243', '1.5445', '0.1234']
['sensor_2', '1', '0.1544', '0.3345', '1.5425', '0.6534']
['sensor_2', '2', '0.5432', '0.4551', '1.8755', '0.4245']

我如何加入它们(当我接收数据时)以便合并具有相同时间戳的传感器数据,如下所示:

 time  data1_1   data1_2   data1_3   data1_4   data2_1   data2_2   data2_3   data2_4    
['0', '0.1234', '0.3251', '1.4235', '0.4234', '0.6543', '0.3231', '1.1235', '0.3434']
['1', '0.1432', '0.3452', '1.4245', '0.1434', '0.1544', '0.3345', '1.5425', '0.6534']
['2', '0.1654', '0.3243', '1.5445', '0.1234', '0.5432', '0.4551', '1.8755', '0.4245']

我通过子进程接收数据(一次一行):

process = subprocess.Popen(['node', 'server.js'], stdout=subprocess.PIPE)
while True:
     Byte_data = process.stdout.readline()
     string_data = byte_data.rstrip().decode("utf-8") # From byte to string
     list_data = string_data.split(",") # Comma separate strings

     # Sort data here...

【问题讨论】:

    标签: python sorting real-time


    【解决方案1】:

    您需要回顾并匹配时间戳,就像这样。

    • 从您的问题的表述来看,时间戳似乎是匹配的。如果它们不是有序的,而只是有序的,事情就会变得有点复杂。
    • 如果缺少某些帧,它们将无限期地停留在回溯字典中。如果这个东西运行了很长时间,您可能需要定期清除旧框架。
    def time(row):
        return row[1]
    
    def synchronized(rows):
        lookback = {'sensor_1': {}, 'sensor_2': {}}
        for row in rows:
            # add row to lookback
            sensor = row[0]
            lookback[sensor][time(row)] = row
    
            # check for matching timestamps
            rms = []
            for t, r in sorted(lookback['sensor_1'].items(), key=time):
                if t in lookback['sensor_2']:
                    yield r, lookback['sensor_2']
                    rms.append(t)
    
            for rm in rms:
                for tmp in lookback.values():
                    del tmp[rm]
    
    def parse(rows):
        for row in rows:
            yield tuple(row.decode().rstrip().split(','))
    
    import subprocess
    process = subprocess.Popen(['node', 'server.js'], stdout=subprocess.PIPE)
    for row1, row2 in synchronized(parse(process.stdout)):
        print(row1, row2)
    
    

    【讨论】:

      【解决方案2】:

      由于您的时间戳都是整数,您可以将它们用作排序列表的索引,并在数据进入等于时间戳的索引时追加或添加数据。

      sorted_data = []
      
      process = subprocess.Popen(['node', 'server.js'], stdout=subprocess.PIPE)
      while True:
          Byte_data = process.stdout.readline()
          string_data = byte_data.rstrip().decode("utf-8") # From byte to string
          list_data = string_data.split(",") # Comma separate strings
      
          try:
              sorted_data[int(list_data[1])] += list_data[2:]
          except IndexError:
              sorted_data.append(list_data[1:])
      
          # prints sorted data in real time
          print(str(sorted_data).replace("],", "],\n"))
      
      # prints out final list with sorted data
      print(str(sorted_data).replace("],", "],\n"))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-12-30
        • 2023-04-05
        • 2014-05-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-06
        相关资源
        最近更新 更多