#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