построение массива дат из текста

1

У меня есть файл журнала (текст) с этим синтаксисом

1/21/18, 22:48 - ~text~
1/21/18, 22:48 - ~text~
1/23/18, 22:48 - ‪~text~
~text~
~text~
1/24/18, 22:48 - ~text~

И я хотел бы получить массив всех дат, например ["1/21/18","1/21/18","1/23/18","1/24/18"]

Потому что моя конечная цель - построить гистограмму частот для каждой даты, чтобы знать количество событий, которые каждый день имел (просто знать эволюцию событий во времени) (поэтому, если вы хотите дать совет, чтобы сделать это проще, его приветствовать!)

Я попробовал регулярное выражение в соответствии с вопросом 4709652, но это не работает должным образом. В любом случае, одна из моих проблем заключается в том, что текстовый файл большой (сотни мегабайт), что приводит к замедлению.

Каков оптимальный способ сделать это?

Спасибо!

  • 1
    pandas.read:csv () - как-читать-6-gb-csv-file-with-pandas - вы не находитесь рядом с «большим» файлом - тем не менее: padas делает возможным чтение события csv в чанках - он может конвертировать вашу дату, возможно, в дату, или вы можете сделать это самостоятельно, если она импортируется как строка. Он даже может делать гистограммы: гистограмма панд на колонке - я просто знаю о пандах, не очень-то с ней работал, но, кажется, это то, что вы могли бы использовать для получения своих результатов
Теги:
date
text
parsing

4 ответа

2
Лучший ответ

Как предложил @Patrick, панды были бы более простым и эффективным способом сделать это.

import pandas as pd
p = pd.read_csv(<name of the file>,names=["date","random"])
p['date'] = pd.to_datetime(p['date'],errors='coerce') #converts the first column to date type and puts a NaT in place of texts.
p = p.dropna() #drop rows containing NaT
print(p['date'])

Выход:

0   2018-01-21
1   2018-01-21
2   2018-01-23
5   2018-01-24

Вы даже можете передать столбец даты функции гистограммы, если она игнорирует NaT, не отбрасывая их.

  • 0
    Эта идея действительно крутая, проблема в том, что ~ text ~ может иметь запятые ... Есть ли способ разрешить pd.read_csv использовать только запятую, которую он читает?
  • 0
    Я также получаю эту ошибку. Ваш пример хорошо работает, но мне нужно немного его настроить, чтобы избежать ошибок синтаксического анализа -8 'кодек не может декодировать байт 0xf1 в позиции 67: недопустимый байт продолжения
Показать ещё 2 комментария
1

Вы можете читать файл по строкам и применять регулярное выражение для каждой строки, например:

import re

list = list()
with open('logs.txt', 'r') as fp:
    line = fp.readline()
    while line:
        dates = re.findall('(\d+\/\d+\/\d+)', line)
        map(list.append, dates)
        line = fp.readline()

print(list)

Выход:

['1/21/18', '1/21/18', '1/23/18', '1/24/18']
1

Предполагая, что весь текстовый файл имеет тот же формат, это должно работать.

def process():
    file = open('test.txt')

    dates = []

    for line in file.readlines():
        if line[0] != '~':
            dates.append(line.strip(' - ~text~').split(',')[0])

    return dates

print(process())

Это результат.

['1/21/18', '1/21/18', '1/23/18', '1/24/18']
1

Вы можете использовать re.findall для этого

import re
text = '1/21/18, 22:48 - ~text~\n1/21/18, 22:48 - ~text~\n1/23/18, 22:48 - ~text~\n~text~\n~text~\n1/24/18, 22:48 - ~text~'
re.findall(r'^([\d/]+),', text, re.MULTILINE)
# ['1/21/18', '1/21/18', '1/23/18', '1/24/18']

Ещё вопросы

Сообщество Overcoder
Наверх
Меню