сортировка строк по дате и времени с использованием python из файла .txt - PullRequest
0 голосов
/ 13 мая 2019

Я только что написал код Python для извлечения данных из примерно 700 текстовых файлов в один файл с именем out_data.txt

Содержимое файла out_data.txt выглядит примерно так:

datetime, V_1, V_2, V_3, V_4, V_5, V_6, V_7

2013-03-17 18: 01: 48,372,100,884,776,009,6553, FFFF, 987

2013-03-17 18: 02: 03,828,876,632,887,008,5423,879,443

2013-05-17 20: 13: 52,488,543,987,233,112,098,344,123

2013-08-17 23: 09: 08,171,667,9887, 9897,09876,0987,098,0987

2013-01-17 35: 06: 04,172,267,987,6897,9876,1287,3498,2987

.....

всего 5783374 строк в файле out_data.txt, и каждая строка (после заголовка) начинается со значения datetime

Однако проблема в том, что написанный мной код извлекает данныеиз каждого отдельного файла и добавляет в мой файл out_data.txt, но строки не в порядке даты и времени, как вы можете видеть выше.Я надеялся, что мои строки будут в порядке даты и времени, потому что мне нужно построить эти данные.

Любая помощь будет высоко оценена.

import re  #regular expressions
import glob #file management and reading

if __name__ == "__main__":   #opening for python
all_header=[]       #list declaration
all_values=[]       #list declaration
i=0
with open('out_data.txt', 'w') as of:    #output file
    for infile in glob.glob("/Users/name/Desktop/raw_data/*.txt"):      #input file
            with open(infile) as fobj:
            print "processing file {}".format(infile)
            for line in fobj:
                data = line.split()   #split each line into individual tokens
                if len(data)==2 and re.search(r'(\d+-\d+-\d+)',    data[0]):    #regular expression to identify date and time
                    header=['datetime']  #column name datetime
                    values=[data[0]+" "+data[1]]  #date+time as one value
                else:
                    header=[d for d in data if data.index(d)%2==0]
                    values=[d for d in data if data.index(d)%2!=0]
                all_header.extend(header)
                all_values.extend(values)
                if not header:
                    if i==0:
                        of.write(','.join(all_header))
                    i=i+1
                    of.write("\n")
                    of.write(','.join(all_values))
                    all_header = []
                    all_values = []
        of.write("\n")
        of.write(','.join(all_values))

Мой ожидаемый результат от приведенных выше примеров данных будет

datetime, V_1, V_2, V_3, V_4, V_5, V_6, V_7

2013-01-17 35: 06: 04,172,267,987,6897,9876,1287,3498,2987

2013-03-17 18: 01: 48,372,100,884,776,009,6553, ffff, 987

2013-03-17 18: 02: 03,828,876,632,887,008,5423,879,443

2013-05-17 20: 13: 52,488,543,987,233,112,098,344,123

2013-08-17 23: 09: 08.171, 667,9887,9897,09876,0987,098,0987

но, конечно, я не мог понять, как включить элемент сортировки в код или есть ли другой способ сделать это.

Спасибо !!

Ответы [ 2 ]

0 голосов
/ 13 мая 2019

Вы можете выполнить обычную (в порядке словаря) сортировку с помощью ввода в 1-м поле, если дата / время отформатированы с фиксированной длиной.

Пожалуйста, попробуйте следующее:

import csv

with open("out_data.txt", "r") as f:
    reader = csv.reader(f, delimiter=",")
    header = next(reader)
    sortedlist = sorted(reader, key = lambda x: x[0])

with open("sorted.txt", "w") as f:
    writer = csv.writer(f, lineterminator="\n")
    writer.writerow(header)
    writer.writerows(sortedlist)

Это будет легко встроить фрагмент выше в ваш код.

В качестве альтернативы, вы можете сказать с bash:

head -1 out_data.txt > sorted.txt
tail +2 out_data.txt | sort -t, -k1 >> sorted.txt

Надеюсь, это поможет.

0 голосов
/ 13 мая 2019

Вы можете использовать панд. Простой пример будет следующим:

import pandas as pd
import glob

df_list = []
for infile in glob.glob("/Users/name/Desktop/raw_data/*.txt"):
    df_list.append(pd.read_csv(infile,parse_dates=['datetime']))
df = pd.concat(df_list).sort_values(by='datetime')
df.to_csv('out_data.txt',index=False)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...