从.txt中提取数据并使用Python写入.txt

从.txt中提取数据并使用Python写入.txt,python,python-3.x,pandas,Python,Python 3.x,Pandas,我试图找出如何使用python编写以下问题的代码。假设在.txt文件中有以下数据集: datatype1 designator1 3:45:14AM datatype1 designator1 3:45:19AM datatype1 designator1 3:45:26AM datatype1 designator1 3:45:31AM datatype1 designator1 4:10:05AM datatype1 designator1 4:10:21AM datatype1 desig

我试图找出如何使用python编写以下问题的代码。假设在.txt文件中有以下数据集:

datatype1 designator1 3:45:14AM
datatype1 designator1 3:45:19AM
datatype1 designator1 3:45:26AM
datatype1 designator1 3:45:31AM
datatype1 designator1 4:10:05AM
datatype1 designator1 4:10:21AM
datatype1 designator1 4:10:30AM
datatype1 designator1 4:10:46AM
记下时间间隔。我需要我的代码来读取文本文件,如果时间间隔中断,则将文件拆分并将以下内容写入另一个文本文件:

datatype1 designator1 3:45:14AM 3:45:31AM
datatype1 designator1 4:10:05AM 4:10:46AM
换句话说,我想将原始数据压缩为单独的“会话”,由具有开始和结束时间的单行表示


谢谢你的帮助

执行以下步骤:

  • 解析每一行,提取时间
  • 从每次开始,将其转换为日期/时间结构
  • 对照以前的日期/时间结构(如有)进行检查
  • 如果差值大于某个预定义值,则启动一个新文件
  • 写出完整的一行

执行以下步骤:

  • 解析每一行,提取时间
  • 从每次开始,将其转换为日期/时间结构
  • 对照以前的日期/时间结构(如有)进行检查
  • 如果差值大于某个预定义值,则启动一个新文件
  • 写出完整的一行

    • 您可以使用
      itertools.groupby

      import itertools
      file_data = [i.strip('\n').split() for i in open('filename.txt')]
      final_data = [(a, list(b)) for a, b in itertools.groupby(file_data, key=lambda x:':'.join(x[-1].split(':')[:2]))]
      new_final_data = [' '.join([' '.join(b[0][:-1]), ' '.join([b[0][-1], b[-1][-1]])]) for _, b in final_data]
      print(new_final_data)
      with open('filename.txt', 'a') as f:
         f.write('\n'.join(new_final_data))
      
      输出:

      ['datatype1 designator1 3:45:14AM 3:45:31AM', 'datatype1 designator1 4:10:05AM 4:10:46AM']
      

      您可以使用
      itertools.groupby

      import itertools
      file_data = [i.strip('\n').split() for i in open('filename.txt')]
      final_data = [(a, list(b)) for a, b in itertools.groupby(file_data, key=lambda x:':'.join(x[-1].split(':')[:2]))]
      new_final_data = [' '.join([' '.join(b[0][:-1]), ' '.join([b[0][-1], b[-1][-1]])]) for _, b in final_data]
      print(new_final_data)
      with open('filename.txt', 'a') as f:
         f.write('\n'.join(new_final_data))
      
      输出:

      ['datatype1 designator1 3:45:14AM 3:45:31AM', 'datatype1 designator1 4:10:05AM 4:10:46AM']
      

      使用熊猫,此任务变得更具可读性:

      import pandas as pd
      import io
      
      data = '''\
      datatype1 designator1 3:30:14AM
      datatype1 designator1 3:30:18AM
      datatype1 designator1 3:45:14AM
      datatype1 designator1 3:45:19AM
      datatype1 designator1 3:45:26AM
      datatype1 designator1 3:45:31AM
      datatype1 designator1 4:10:05AM
      datatype1 designator1 4:10:21AM
      datatype1 designator1 4:10:30AM
      datatype1 designator1 4:10:46AM'''
      
      
      # Recreate dataset
      df = pd.read_csv(io.StringIO(data),sep='\s+', header=None)
      
      # Use this instead of above for real file
      #df = pd.read_csv('path/to/file',sep='\s+', header=None)
      
      # Get first and last by hour (convert to dt)
      df[2] = sorted(pd.to_datetime(df[2]))
      newdf = df.groupby((df[2].dt.hour, df[2].dt.minute // 15)).agg(['first', 'last'])
      
      # Rename columns and drop duplicates
      newdf.columns = list(range(len(newdf.columns)))
      newdf.drop(newdf.columns[[1,3]], axis=1, inplace=True)
      
      # Format time
      newdf[[4,5]] = newdf[[4,5]].apply(lambda x: x.dt.strftime('%#H:%M:%S%p'))
      
      # Output
      print(newdf.to_csv('output.csv', index=False, header=False, sep=' '))
      
      output.csv:

      datatype1 designator1 3:30:14AM 3:30:18AM
      datatype1 designator1 3:45:14AM 3:45:31AM
      datatype1 designator1 4:10:05AM 4:10:46AM
      

      使用熊猫,此任务变得更具可读性:

      import pandas as pd
      import io
      
      data = '''\
      datatype1 designator1 3:30:14AM
      datatype1 designator1 3:30:18AM
      datatype1 designator1 3:45:14AM
      datatype1 designator1 3:45:19AM
      datatype1 designator1 3:45:26AM
      datatype1 designator1 3:45:31AM
      datatype1 designator1 4:10:05AM
      datatype1 designator1 4:10:21AM
      datatype1 designator1 4:10:30AM
      datatype1 designator1 4:10:46AM'''
      
      
      # Recreate dataset
      df = pd.read_csv(io.StringIO(data),sep='\s+', header=None)
      
      # Use this instead of above for real file
      #df = pd.read_csv('path/to/file',sep='\s+', header=None)
      
      # Get first and last by hour (convert to dt)
      df[2] = sorted(pd.to_datetime(df[2]))
      newdf = df.groupby((df[2].dt.hour, df[2].dt.minute // 15)).agg(['first', 'last'])
      
      # Rename columns and drop duplicates
      newdf.columns = list(range(len(newdf.columns)))
      newdf.drop(newdf.columns[[1,3]], axis=1, inplace=True)
      
      # Format time
      newdf[[4,5]] = newdf[[4,5]].apply(lambda x: x.dt.strftime('%#H:%M:%S%p'))
      
      # Output
      print(newdf.to_csv('output.csv', index=False, header=False, sep=' '))
      
      output.csv:

      datatype1 designator1 3:30:14AM 3:30:18AM
      datatype1 designator1 3:45:14AM 3:45:31AM
      datatype1 designator1 4:10:05AM 4:10:46AM
      

      你的意思是按小时开始和结束时间?你的意思是按小时开始和结束时间?谢谢,这很有帮助。一个小调整:数据中有许多实例在一小时内有多个“会话”。修改您提供的代码以适应这种情况的最佳方式是什么?我最初的想法是使用一个“if”语句,比如“if time(i+1)-i>15分钟,然后切断并开始一个新的会话。(i=index)@Vincent你能分享一些示例数据和预期的输出吗?@Vincent我猜你想要15分钟的窗口:你可以向groupby传递另一个变量,即每15分钟的div(所以0,1,2,3)。或者你想迭代剪切?谢谢,这非常有用。一个小调整:数据中有许多实例在一小时内有多个“会话”。修改你提供的代码以适应这种情况的最佳方式是什么?我最初的想法是使用“if”语句,类似于如果时间(i+1)-i>15分钟,则中断并开始新的会话。(i=index)@Vincent您可以共享一些示例数据和预期输出吗?@Vincent我猜您希望有15分钟的窗口:您可以将另一个变量传递给groupby,即每15分钟的div(因此为0,1,2,3)。或者您希望迭代剪切?