У меня есть длинная строка, которая содержит даты в нескольких форматах (дд-мм-гггг, мм-дд-гггг и т. Д.).Как мне конвертировать их все в один формат? - PullRequest
2 голосов
/ 31 мая 2019

Я работаю над Python. У меня много длинных текстов данных. Каждый текст можно рассматривать как строку. Внутри каждой строки мне нужно разделить строку на элементы списка, где бы ни присутствовала дата.

eg. long string1 (date format: mm.dd.yyyy): 

05.12.2016 15:58:31 jsfkgskdlfsgfdslkcbj 05.13.2016 15:58:31  sdfasjdcakscsdv
01.14.2016fsdkjgfdhkvjxdbvxd

eg. long string2 (date format: dd/mm/yyyy): 

05/12/2016 15:58:31 jsfkgskdlfsgfdslkcbj 05.1.2016 15:58:31  sdfasjdcakscsdv
21/11/2016fsdkjgfdhkvjxdbvxd

Шаг 1: Мне нужно написать обобщенный код, чтобы можно было передавать обе строки в одном и том же коде.

Step2: Цель кода - преобразовать строку в список с элементами разделены по дате.

например. длинная строка 1 в список 1 [05.12.2016 15:58:31 jsfkgskdlfsgfdslkcbj, 05.13.2016 15:58:31 sdfasjdcakscsdv, 14.01.2016fsdkjgfdhkvjxdbvxd]

Шаг 3: и затем взять элемент с самой ранней датой

вывод из приведенного выше примера: 14.01.2016fsdkjgfdhkvjxdbvxd

Я получил помощь для выполнения шагов 2 и 3, и я могу сделать это, когда все строки имеют одинаковый формат даты. Но моя задача - сначала прочитать строку и выяснить, какой формат даты она использует, а затем проанализировать и отсортировать ее по дате

У меня есть код, если указан один формат даты.

text = '05/12/2016 15:58:31 jsfkgskdlfsgfdslkcbj 05.1.2016 15:58:31  sdfasjdcakscsdv 21/11/2016fsdkjgfdhkvjxdbvxd'

list1 = list()
for d, t in zip(*[iter(re.split(r'(\d+[\/.]\d+[\/.]\d+ \d+:\d+:\d+)', text)[1:])]*2):
    list1.append(d + t)

from datetime import datetime
list_sorted=sorted(list1,key=lambda s: datetime.strptime(s[0:19], "%d.%m.%Y %H:%M:%S") if '.' in s[0:19] else datetime.strptime(s[0:19], "%d/%m/%Y %H:%M:%S"))

complaint = list_sorted[0]
print(complaint)

Приведенный выше код хорошо работает для одной строки для одного формата даты. Как мне обобщить, чтобы сначала определить формат даты в строке, а затем проанализировать его соответственно

1 Ответ

1 голос
/ 31 мая 2019

Вы можете использовать dateutil.parser , присутствующий в модуле dateutil , который может проанализировать для вас строку даты и времени независимо от формата

In [17]: from dateutil import parser                                                                                                                                                   

In [18]: parser.parse('05/12/2016 15:58:31', fuzzy=True)                                                                                                                                           
Out[18]: datetime.datetime(2016, 5, 12, 15, 58, 31)

In [19]: parser.parse('05.1.2016 15:58:31', fuzzy=True)                                                                                                                                            
Out[19]: datetime.datetime(2016, 5, 1, 15, 58, 31)

In [20]: parser.parse('21/11/2016', fuzzy=True)                                                                                                                                                    
Out[20]: datetime.datetime(2016, 11, 21, 0, 0)

Или другой пример, который собирает объекты даты и времени и сортирует исходный список в соответствии с ним

from dateutil import parser

#List of textdate srings
textdate = ['5.13.2001 21:23:54 fgdsgd', '05.12.2001 09:43:32 arfehfks']

#Collect datetime objects
dates = []
for item in textdate:
    dates.append(parser.parse(item, fuzzy=True))

#Sort datetime objects and obtained original list on sorting
res = [textdate[i[0]] for i in sorted(enumerate(dates), key=lambda x:x[1])]
print(res)

Вывод будет

['05.12.2001 09:43:32 arfehfks', '5.13.2001 21:23:54 fgdsgd']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...