Выберите конкретную подстанцию — динамическое индексирование

#python #object-slicing

#python #нарезка объектов

Вопрос:

У меня есть несколько файлов .csv с 2 немного разными форматами.

Формат 1: X-XXX_2020-11-05_13-54-55-555__ XX.
Формат csv 2: X-XXX_2020-11-05_13-54-55-555__ ХХХ.csv

Мне нужно извлечь поле dametime, чтобы добавить его в фрейм данных pandas. Обычно я бы просто использовал простое нарезание

 datetime.datetime.strptime(string1[-31:-8], "%Y-%m-%d_%H-%M-%s-%f")
  

что дало бы мне желаемый результат, но только для Format1.

Для Format2 мне нужно переместить индексы для нарезки на 1 из-за другого окончания.
Также я не могу индексировать с самого начала из-за других операций.

На данный момент я обошел это, используя оператор IF, который выглядит следующим образом:

 def tdate():
    if string1[-7]=='X':
        return datetime.datetime.strptime(string1[-32:-9], "%Y-%m-%d_%H-%M-%s-%f")
    else:
        return datetime.datetime.strptime(string1[-31:-8], "%Y-%m-%d_%H-%M-%s-%f")
  

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

Спасибо!

Ответ №1:

Использование str.split с нарезкой списка

Пример:

 import datetime

for i in ("X-XXX_2020-11-05_13-54-55-555__XX.csv", "X-XXX_2020-11-05_13-54-55-555__XXX.csv"):
    print(datetime.datetime.strptime("_".join(i.split("_")[1:3]), "%Y-%m-%d_%H-%M-%S-%f"))
  

ИЛИ с помощью регулярных выражений.

Пример:

 import re
import datetime

for i in ("X-XXX_2020-11-05_13-54-55-555__XX.csv", "X-XXX_2020-11-05_13-54-55-555__XXX.csv"):
    d = re.search(r"(?<=_)(. )(?=__)", i)
    if d:
        print(datetime.datetime.strptime(d.group(1), "%Y-%m-%d_%H-%M-%S-%f"))
  

Вывод:

 2020-11-05 13:54:55.555000
2020-11-05 13:54:55.555000