разделите две даты, используя пробел - PullRequest
1 голос
/ 09 июля 2020

У меня две даты подряд, и я хочу разделить их пробелом. Сложность в том, что формат даты постоянно меняется.

Примеры:

good one : "01/27/19 09/31/18"
sample1 : "1/19/2011/19/19", expected "01/19/20 11/19/19"
sample2: "01/12/1812/15/1", expected "01/12/18 12/15/1"

Я пробовал что-то вроде этого:

код:

a['Text'] = a['Text'][0:8] + " " + a['Text'][-8:]

вывод для кода выше:

sample 1: "1/19/201 11/19/19"
 sample 2: "01/12/1 812/15/1"

Ответы [ 4 ]

2 голосов
/ 09 июля 2020

Вот настоящий уродливый способ решить эту проблему:

>>> sample1 = "1/19/2011/19/19"
>>> sample2 = "01/12/1812/15/1"
>>> samples = [sample1, sample2]
>>> for sample in samples:
...   " ".join(["{:0>2}/{:0>2}/{:0>2}".format(*i) for i in re.findall(r"(?:(\d{1,2})/(\d{1,2})/(\d{1,2}))", sample)])
...
'01/19/20 11/19/19'
'01/12/18 12/15/01'

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

1 голос
/ 09 июля 2020

Из вашего кода я могу сделать вывод, что a - это pandas.DataFrame со столбцом с именем Text. Чтобы добавить в a еще два столбца, содержащие первую и вторую дату, хранящиеся в Text, мы можем использовать некоторое регулярное выражение для разделения дат посреди среднего числа 4-di git, которое, кажется, всегда присутствует.

import pandas as pd
import re

a = pd.DataFrame({'Text': ['1/19/2011/19/19', '01/12/1812/15/1']})

a['first_date'] = a['Text'].apply(lambda x: re.findall('(\d+\/\d+\/\d{2})', x)[0])
a['second_date'] = a['Text'].str.replace('(\d+\/\d+\/\d{2})', '', n=1)

#               Text first_date second_date
# 0  1/19/2011/19/19    1/19/20    11/19/19
# 1  01/12/1812/15/1   01/12/18     12/15/1
1 голос
/ 09 июля 2020

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

Если это всегда формат 2 sla sh, как показано выше, где первая часть всегда состоит из 2 цифр, вы можете сделайте это в двух частях. Вы можете прочитать суффикс, посмотрев «назад» на две косые черты, а затем вернувшись на 2 цифры.

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

Тогда первая дата - это просто оставшийся строковый текст.

С этой целью на самом деле, вероятно, существует решение группы захвата регулярных выражений.

0 голосов
/ 09 июля 2020
if len(date) >=16:
    do regular date split
elif len(date) ==15:
    date_list = date.split('/')
    
    n = date_list[0] + '/' + date_list[1] + '/' + date_list[2][0:2] + ' ' + date_list[2][-2:] + '/' +  date_list[3] + '/' + date_list[4]

Пожалуйста, опубликуйте, если у кого-нибудь есть лучшее решение, чем это.

...