Как определить дефис или подчеркивание в строке datetime для использования в strptime? - PullRequest
0 голосов
/ 05 апреля 2019

У меня есть несколько тысяч файлов с указанием даты и времени в их имени.
К сожалению, разделитель между блоками даты и времени не всегда одинаков.
Пример:

  • Data_trul-100A1-Berlin_2019-01-31_150480.dat
  • Data_tral-2000B2-Frankf-2018_02_27-190200.dat
  • Data_bash-300003_Hambrg_2017-04-12_210500.dat

Мне удалось найти часть datetime в строке с регулярным выражением

import re

strings = ['Data_trul-100A1-Berlin_2019-01-31_150430.dat', 
           'Data_tral-2000B2-Frankf-2018_02_27-190200.dat', 
           'Data_bash-300003_Hambrg_2017-04-12_210500.dat']

for part_string in strings:
    match = re.search('\d{4}[-_]\d{2}[-_]\d{2}[-_]\d{6}', part_string)
    print(match.group())

Однако теперь я застрял, чтобы преобразовать группу в datetime

from datetime import datetime
date = datetime.strptime(match.group(), "%Y-%m-%d_%H%M%S")

потому что мне нужно указать тире или подчеркивание.

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

for part_string in strings:
    part_string = part_string.replace('-',"_")
    match = re.search('\d{4}_\d{2}_\d{2}_\d{6}', part_string)
    date = datetime.strptime(match.group(), "%Y_%m_%d_%H%M%S")
    print(date)

Есть ли более элегантный способ? Используя регулярные выражения, чтобы найти делитель и передать его в strptime?

1 Ответ

1 голос
/ 05 апреля 2019

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

match = re.search('(\d{4})[-_](\d{2})[-_](\d{2})[-_](\d{6})', part_string)

Затем объединить их в один стандартный формат строки

fixedstring = "{}_{}_{}_{}".format(match.groups())
date = datetime.strptime(match.group(), "%Y_%m_%d_%H%M%S")

Конечно, в этот момент вы можете просто разделитьHHMMSS часть времени в свои собственные элементы и непосредственно построить объект datetime,

m = re.search('(\d{4})[-_](\d{2})[-_](\d{2})[-_](\d{2})(\d{2})(\d{2})', part_string)
date = datetime.datetime(year=m.group(0), 
                         month=m.group(1), 
                         day=m.group(2), 
                         hour=m.group(3), 
                         minute=m.group(4), 
                         second=m.group(5))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...