2015-03-26 2 views
5

У меня есть строка с переменной длиной, и я хочу дать формат strptime, чтобы остальная часть строки была проигнорирована. Позвольте мне привести пример. У меня есть что-то вродеdatetime strptime - установить формат для игнорирования конечной части строки

9/4/2013,00:00:00,7.8,7.4,9.53 
10/4/2013,00:00:00,8.64,7.4,9.53 

и я хочу, формат, который делает работу команды strptime(line,format) читать эти строки. Что-то вроде format='%d/%m/%Y,%H:%M:%S*', хотя я знаю, что это не работает. Я думаю, мой вопрос похож на this one, но никакой ответ там не может помочь мне, и моя проблема немного хуже, потому что полная длина моей строки может отличаться. У меня такое чувство, что dateutil может решить мою проблему, но я не могу найти что-то там, что делает трюк.

Возможно, я могу сделать что-то вроде strptime(''.join(line.split(',')[:2]),format), но я бы не хотел прибегать к этому по вопросам, связанным с пользователем.

+0

Я дал решение построить динамическую строку формата. Примите мой ответ. –

+0

Это сводится к расширению запроса на strptime, чтобы разрешить произвольные регулярные выражения, по крайней мере в конечной части строки: 'format = '% d /% m /% Y,% H:% M:% S. *''. Это общая просьба и заслуживает внимания. Фактически [люди просили его в течение 13 лет] (https://bugs.python.org/issue1006786). – smci

ответ

3

Для создания строки форматирования без разделения времени строки и отбрасывая дополнительный текст, просто включить дополнительный текст в строке форматирования. t[t.index(',',t.index(',') + 1):] - дополнительный текст.

from datetime import datetime 
l = ['9/4/2013,00:00:00,7.8,7.4,9.53', '10/4/2013,00:00:00,8.64,7.4,9.53'] 
for t in l: 
    print datetime.strptime(t,'%d/%m/%Y,%H:%M:%S'+t[t.index(',',t.index(',')+1):]) 

Если строка с '%' может быть заменена пустой строкой.

l = ['9/4/2013,00:00:00,7.8,7.4,9.53', '10/4/2013,00:00:00,8.64,7.4,9.53'] 
for t in l: 
    t = t.replace('%','') 
    fmt = '%d/%m/%Y,%H:%M:%S' + t[t.index(',',t.index(',')+1):] 
    print datetime.strptime(t, fmt) 

Или с струнной нарезки и статическую строку формата,

for t in l: 
     print datetime.strptime(t[:t.find(',',t.find(',')+1)],'%d/%m/%Y,%H:%M:%S') 

2013-04-09 00:00:00
2013-04-10 00:00:00

+1

Итак, что произойдет, если дополнительная строка содержит '%' символов? Обратите внимание, что вы по существу делаете раскол в обратном порядке; вы разбиваете * остаток * и добавляете его в строку формата. –

+0

Сохраняются вероятности появления% в поле даты и времени. Я ответил на ОП. –

+0

Правильно, но я тоже, но у него нет проблем, которые есть у вашего «решения». Иногда ответ на самом деле - это вы не можете сделать, но вот как вы решаете проблему *. –

9

Вы не можете иметь datetime.strptime() игнорировать часть входа; ваш только вариант действительно состоит в том, чтобы сначала отделить дополнительный текст.

Так что да, вы сделать должны разделить и воссоединиться вашу строку:

format = '%d/%m/%Y,%H:%M:%S' 
datetime.strptime(','.join(line.split(',', 2)[:2]), format) 

или найти какие-то другие средства для извлечения информации. Вы можете использовать регулярные выражения, например:

datetime_pattern = re.compile(r'(\d{1,2}/\d{1,2}/\d{4},\d{2}:\d{2}:\d{2})') 
format = '%d/%m/%Y,%H:%M:%S' 
datetime.strptime(datetime_pattern.search(line).group(), format) 
+0

OP не хотел отделять дополнительный текст. Он хочет, чтобы строка формата считывала строки. –

+0

@NizamMohamed: ОП попросил чего-то, чего не существует. –

+0

Я дал решение. –

Смежные вопросы