Как извлечь последнюю дату из строки в панде dataframe - PullRequest
1 голос
/ 20 апреля 2019

Мне нужно найти последнюю дату, предшествующую конкретному тексту в строке для каждой строки в панде. Текст может быть где угодно после даты в строке.

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

Ref No  Audit
abc123  "text1, text2, text3"
abc124  "text1, text2, text3"

Ссылочный номер относится к элементу в базе данных, Аудит - это аудит всех изменений, внесенных в элемент. Каждый разделенный запятыми элемент в тексте - это одно изменение (например, text1 - это изменение, text2 - это изменение и т. Д.). Только когда в новую дату вносятся изменения, дата добавляется в начало части текста. Каждый элемент в столбце Аудит выглядит примерно так:

«01.01.2009 09:15:12 задание 1 выполнено, задание 2 выполнено, задание 3 выполнено, 01.02.2009 15:26:03 задание 4 выполнено, задание 5 выполнено».

Я пытаюсь найти способ определить, когда конкретное задание выполнено. В приведенном выше примере, если бы я хотел знать, когда задача 5 была выполнена, это было бы 02/01 / 2019.

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

import pandas as pd

audit = pd.read_csv('audit_export1.csv', encoding='latin1')

audit['Audit'].apply(pd.Series)
audit['Audit'] = audit['Audit'].str.split(',')

Я надеюсь получить фрейм данных, содержащий 2 столбца; ссылка и дата изменения были найдены.

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

Редактировать

27.03 2019 09:34:41 Джон Смит Поле «Обработчик» было изменено со старого значения «» на новое значение «Джон Доу», поле «Состояние рабочего процесса» изменено со старого значения «Ожидание» присвоение "новому значению" С помощью обработчика ", 27.03 2019 22:24:19 Джейн Доу Поле" Обработчик "было изменено со старого значения" Джейн Доу "на новое значение" Билл Смит ", 10/04/2019 04:58:43 Джилл Смит Поле «Статус рабочего процесса» было изменено со старого значения «С помощью обработчика» на новое значение «Передано в центр очистки», 04.10 2019 06:31:09 Сэм Джонс Поле «Статус рабочего процесса» "было изменено со Старого значения" Передано в Центр очистки "на новое значение" QC ", 13/04/2019 08:30:49 Дейв Джонс Поле" Обработчик QC "было изменено со Старого значения" "на новое значение" Дейв Джонс ", поле" Статус рабочего процесса "изменено со старого значения" QC "на новое значение" QC - With Handler ", 13/04/2019 09:06:36 Дейв Джонс Поле" Статус рабочего процесса "было изменено от старого значения «QC - With Handler» к новому значению «Passed back to re-work», 17/04/201 9 23:52:11 Салли Смит Поле «Статус рабочего процесса» было изменено со старого значения «Передано для повторной обработки» на новое значение «Контроль качества - передано в справочную службу», 18/04/2019 2:45:30 Билл Джонс Поле «Статус рабочего процесса» было изменено со Старого значения «QC - Передано в Центр очистки» на новое значение «Обработка жалоб»

Редактировать 2

import pandas as pd
import re
a = pd.read_csv('audit_export1.csv')
to_find = "Workflow Status"

for cases in a:
    date_list = re.findall(r'\d+/\d+/\d+ \d+:\d+:\d+ ', a['Audit Trail'])

    s = re.split(r'\d+/\d+/\d+ \d+:\d+:\d+ ', a['Audit Trail'])
    task_list = [i for i in s if i != '']

    for  i, item in enumerate(task_list):
        if to_find in item:
            a['Audit Date'] = date_list[i]

Редактировать 3

import pandas as pd
from datetime import datetime

to_find = 'Workflow'
a = pd.read_csv('audit_export2.csv')

a.Audit = a.Audit.str.split(',')

overall_list = []
for tmplist in a.Audit:
    dl = []
    for i in tmplist:
        i = i.strip()
        try: 
            sdate = datetime.strptime(i[:10],'%d/%m/%Y')
            dl.append(str(sdate) + i[10:])
        except ValueError: # if its NOT a date, adding the date got from the try block to the string
            dl.append(str(sdate) + i)
        dl = dl[::-1]
    overall_list.append(dl)

a['Audit_date'] = pd.Series(overall_list)

Ответы [ 2 ]

0 голосов
/ 20 апреля 2019

Строго говоря, исходя из того, что дата, которая вас интересует, будет в первой части, и всегда будет дата в самом первом тексте каждой строки, создается код ниже

import pandas as pd
from datetime import datetime

a = pd.read_csv('audit_export1.csv')

a.Audit = a.Audit.str.split(',')

overall_list = []
for tmplist in a.Audit:
    dl = []
    for i in tmplist:
        i = i.strip()
        try: 
            sdate = datetime.strptime(i[:19],'%d/%m/%Y %H:%M:%S')
            dl.append(str(sdate) + i[19:])
        except ValueError: # if its NOT a date, adding the date got from the try block to the string
            dl.append(str(sdate) + i)
    overall_list.append(dl)

a['Audit_date'] = pd.Series(overall_list)

Я попытался воспроизвести часть даты в тех строках, в которых она отсутствует, и создал новый столбец с датой, вставленной в начале строк. Вы можете использовать полученный список по своему усмотрению.Например, вывод будет выглядеть так:

print(a.Audit_date[0])

['2019-01-01 09:15:12 task 1 completed',
 '2019-01-01 09:15:12task 2 completed',
 '2019-01-01 09:15:12task 3 completed',
 '2019-01-02 15:26:03 task 4 completed',
 '2019-01-02 15:26:03task 5 completed']
0 голосов
/ 20 апреля 2019

Это не полный код, он просто дает вам представление о том, как начать, также вам нужно поставить некоторые проверки, чтобы соответствовать другим возможностям

у вас есть множество вариантов, если ваш формат данных соответствует

когда вы загружаете записи из CSV-файла, каждая запись будет выглядеть следующим образом: «02/01/2019 15:26:03 задача 4 выполнена», вы можете работать с этой строкой просто так

text = "02/01/2019 15:26:03 task 4 completed"
i = text.index('task')
print(text[i:])
print(text[:i-1])

выход:

task 4 completed
02/01/2019 15:26:03

или, как вы сказали, если ваш формат даты всегда будет одинаковым, вы можете использовать индекс напрямую:

print(text[20:])
print(text[:20])

Редактировать : для работы с конкретной ситуацией, когда существует одна дата для более чем одной задачи, см. Ниже:

мы будем использовать регулярное выражение, чтобы разбивать текст при каждом появлении даты и сохранять задачи в списке задач, а также находить все даты и помещать их в другой список, а затем оставлять будет легко

text = "01/01/2019 09:15:12 task 1 completed, task 2 completed, task 3 completed, 02/01/2019 15:26:03 task 4 completed, task 5 completed"

import re
def get_date(task):
    date_list = re.findall(r'\d+/\d+/\d+ \d+:\d+:\d+ ', text)

    s = re.split(r'\d+/\d+/\d+ \d+:\d+:\d+ ', text)
    task_list = [i for i in s if i != '']

    for  i, item in enumerate(task_list):
        if task in item:
            return date_list[i]

чтобы проверить это

my_task = 'task 5'
result = get_date(my_task)
print(my_task, 'completed on', result)

выход:

task 5 completed on 02/01/2019 15:26:03 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...