2015-02-16 5 views
3

Для проекта мне нужно проанализировать несколько строк даты. Одна дата дается, что в понедельник недели, например: 16 февраля, 2015.Строки с временем начала и окончания datetime

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

['Wednesday', '11:00AM', '7:00PM'] 
['Friday', '10:15AM', '4:30PM'] 
['Sunday', '12:00AM', '5:00PM'] 

Где Первое значение, очевидно, день, второе значение - время начала, а последнее значение - время окончания (это для событий).

Я хотел был бы преобразовать это в фактический python datetime объектов, но он должен совпадать с датой начала.

То, что я пытался до сих пор использует это:

# Beginning of week 
BoW = datetime.strptime('Feb 16, 2015', "%b %d, %Y") 

# List of days 
for day in days: 
    # Find the Day of the Week 
    # This outputs a number, 0 = Monday, 6 = Sunday 
    DoW = table.index(tr) 

    schedule.append({ 
     'start' : BoW + timedelta(days=DoW), 
     'end' : BoW + timedelta(days=DoW) 
    }) 

Как вы можете видеть, это будет только успешно установить дату, но не в час/минуту. Есть ли способ легко достичь этого?

ответ

6

Вы можете разобрать время с strptime(), а также:

timevalue = datetime.strptime(timecomponent, '%I:%M%p').time() 

%I является 12-часовым форматом время часов значения (так между 1 и 12) и %p является отборочными AM или PM.

Вы можете использовать datetime.datetime.combine() объединить этот компонент времени с датой:

BoW = datetime.strptime('Feb 16, 2015', "%b %d, %Y").date() 
start = datetime.strptime(start_time, '%I:%M%p').time() 
end = datetime.strptime(end_time, '%I:%M%p').time() 
start, end = datetime.combine(BoW, start), datetime.combine(BoW, end) 

Демо:

>>> from datetime import datetime, timedelta 
>>> BoW = datetime.strptime('Feb 16, 2015', "%b %d, %Y").date() 
>>> datetime.strptime('11:00AM', '%I:%M%p').time() 
datetime.time(11, 0) 
>>> datetime.combine(BoW, _) 
datetime.datetime(2015, 2, 16, 11, 0) 
+0

Удивительно, спасибо за подробное объяснение! Он работал безупречно. – Diederik

1

Не уверен, что именно тип ситуации вы находитесь, но вы можете попробовать классная библиотека анализа времени NLP parsedatetime. Это позволит вам сделать что-то вроде этого:

import parsedatetime 

cal = parsedatetime.Calendar() 
WoY_timetuple, status = cal.parse("Feb 16, 2015") 
DoW_timetuple, status = cal.parse("Wednesday", sourceTime=WoY_timetuple) 
start, status = cal.parseDT("11:00AM", sourceTime=DoW_timetuple) 
end, status = cal.parseDT("7:00PM", sourceTime=DoW_timetuple) 

Таким образом, вы можете легко установить контекст синтаксический анализ, чтобы каждый раз в день строки в полном datetime объекта. Вам нужно будет убедиться, что вы тщательно обрабатываете коды состояния, возвращаемые методом .parse. Если ваши входные данные имеют некоторую изменчивость в форматировании даты, этот подход может сэкономить время, в противном случае подход Martijn, вероятно, намного безопаснее.

+0

Это выглядит очень многообещающе! Спасибо за это предложение. – Diederik