2014-08-13 2 views
38

Я хочу получить данные из временных меток следующим образом: 3/1/2014 9:55 с datetime.strptime или что-то подобное.Анализ ненулевых пронумерованных временных меток в Python

Месяц, день месяца и час не имеют нулевой пробел, но, похоже, нет указателя форматирования, указанного в списке here, который может проанализировать это автоматически.

Каков наилучший способ сделать это? Благодаря!

ответ

68

strptime способен анализировать неполные значения. Тот факт, что они отмечены как заполненные в таблице кодов форматирования, относится к выходу strftime. Таким образом, вы можете просто использовать

datetime.strptime(datestr, "%m/%d/%Y %H:%M") 
1

strptime не требуется 0-заполненные значения. Смотрите пример ниже

datetime.strptime("3/1/2014 9:55", "%m/%d/%Y %H:%M") 
output: datetime.datetime(2014, 3, 1, 9, 55) 
1

Не-модель способ заключается в использовании dateutil.parse модуля, он позволяет разобрать общие форматы дату, даже если вы не знаете, что он использует в настоящее время
Ex:

>>> import dateutil.parser 
>>> 
>>> utc_time  = '2014-08-13T00:00:00' 
>>> verbose_time = '13-Aug-2014' 
>>> some_locale = '3/1/2014 9:55' 
>>> dateutil.parser.parse(utc_time) 
datetime.datetime(2014, 8, 13, 0, 0) 
>>> dateutil.parser.parse(verbose_time) 
datetime.datetime(2014, 8, 13, 0, 0) 
>>> dateutil.parser.parse(some_locale) 
datetime.datetime(2014, 3, 1, 9, 55) 
1

На всякий случай этот ответ помогает кому-то другому - я пришел сюда, думая, что у меня возникла проблема с нулевым заполнением, но на самом деле это было связано с 12:00 и 00:00 и форматом %I.

Формамер %I предназначен для соответствия 12-часовым часам, необязательно с нулевой прокладкой. Но в зависимости от источника данных, вы можете получить данные, говорит, что в полночь или полдень фактически равна нулю, например:

>>> datetime.strptime('2015/01/01 0:12am', "%Y/%m/%d %I:%M%p") 
ValueError: time data '2015/01/01 0:12am' does not match format '%Y/%m/%d %I:%M' 

Что strptime на самом деле хотел было 12, а не ноль:

>>> datetime.strptime('2015/01/01 12:12am', "%Y/%m/%d %I:%M%p") 
datetime.datetime(2015, 1, 1, 0, 12) 

Но мы не всегда контролируем наши источники данных! Мое решение для этого края случае было поймать исключение, попробуйте разбор его с %H, с быстрой проверки, что мы находимся в случае края мы думаем, мы находимся в.

def get_datetime(string): 
    try: 
     timestamp = datetime.strptime(string, "%m/%d/%Y %I:%M%p") 
    except ValueError: 
     # someone used zero for midnight? 
     timestamp = datetime.strptime(string, "%m/%d/%Y %H:%M%p") 
     assert string.lower().endswith('am') 
     assert timestamp.hour == 0 
    return timestamp 
+0

'0:12 am' недействителен вход. Это должно быть «12:12 утра». '11:59 pm' сопровождается' 12:00 am', а не '0:00 am'. Может быть множество способов подачи данных в неправильный формат времени, например, вход может использовать двухзначный год ('% y') вместо четырехзначного года ('% Y') или день/месяц может быть заменен (' % m /% d' против '% d /% m') и т. д. Случай день/месяц может быть неоднозначным, например,« 2015/10/12 »- это« 12 октября »или« 10 декабря »? btw, вы должны использовать '% Y /% m /% d' вместо'% m /% d /% Y', чтобы соответствовать вашему входному формату. – jfs

+0

Спасибо, я понимаю, что это недопустимый ввод, как я уже сказал, он исходит из источника данных, который я не контролирую. – hwjp

-2

Вы можете увидеть документ STRFTIME here , но на самом деле они не все работают хорошо на всех платформах, например, %-d,%-m не работает на win7 с помощью Python 2.7, так что вы можете сделать, как этот

>>> date_str = '{d.year}-{d.month}-{d.day}'.format(d=datetime.datetime.now()) 
>>> print(date_str) 
2016-5-23 
Смежные вопросы