2015-06-01 2 views
19

Прямо сейчас у меня есть:питон формат strptime с дополнительными битами

timestamp = datetime.strptime(date_string, '%Y-%m-%d %H:%M:%S.%f') 

Это прекрасно работает, если я не буду преобразовывать строку, которая не имеет микросекунд. Как я могу указать, что микросекунды являются необязательными (и их следует считать 0, если они не указаны в строке)?

ответ

17

Вы можете использовать try/except блок:

try: 
    timestamp = datetime.strptime(date_string, '%Y-%m-%d %H:%M:%S.%f') 
except ValueError: 
    timestamp = datetime.strptime(date_string, '%Y-%m-%d %H:%M:%S') 
9

насчет просто добавив его, если он не существует?

if '.' not in date_string: 
    date_string = date_string + '.0' 

timestamp = datetime.strptime(date_string, '%Y-%m-%d %H:%M:%S.%f') 
2

Я предпочитаю использовать регулярные выражения вместо try и except. Это позволяет использовать множество резервных копий приемлемых форматов.

# full timestamp with milliseconds 
match = re.match(r"\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d+Z", date_string) 
if match: 
    return datetime.strptime(date_string, "%Y-%m-%dT%H:%M:%S.%fZ") 

# timestamp missing milliseconds 
match = re.match(r"\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z", date_string) 
if match: 
    return datetime.strptime(date_string, "%Y-%m-%dT%H:%M:%SZ") 

# timestamp missing milliseconds & seconds 
match = re.match(r"\d{4}-\d{2}-\d{2}T\d{2}:\d{2}Z", date_string) 
if match: 
    return datetime.strptime(date_string, "%Y-%m-%dT%H:%MZ") 

# unknown timestamp format 
return false 

Не забудьте импортировать «re», а также «datetime» для этого метода.

0
datetime(*map(int, re.findall('\d+', date_string))) 

может анализировать как '%Y-%m-%d %H:%M:%S.%f' и '%Y-%m-%d %H:%M:%S'. Это слишком разрешительно, если ваш вход не фильтруется.

Это быстро и грязно, но иногда strptime() работает слишком медленно. Его можно использовать, если вы знаете, что ввод имеет ожидаемый формат даты.

+0

Это дает неверные результаты, если в 'date_string' конечные нули пропущены из микросекундной части. – jez

+1

@jez: да, вот почему я сказал, что это «слишком разрешительно». Он работает только в том случае, если вход имеет ожидаемый формат (нет или 6 цифр для микросекунд). 2- о вашем редактировании: посмотрите на вопрос: 'datetime' - это класс здесь, а не модуль. – jfs

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