2016-12-29 5 views
0

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

dates = (datetime.strptime(ts, '%Y-%m-%d %H:%M:%S') for ts in timestamps) 
date_strings = [datetime.strftime(d, '%m-%d-%Y') for d in dates] 

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

[datetime.datetime(2016, 11, 21, 0, 0), datetime.datetime(2016, 11, 22, 0, 0), datetime.datetime(2016, 11, 23, 0, 0)]

Я получаю следующее сообщение об ошибке:

TypeError: strptime() argument 1 must be str, not datetime.datetime

+0

'timestamps' уже является списком объектов' datetime'; или, точнее, * по крайней мере один объект в этом списке * является объектом 'datetime'. Вы не можете использовать 'datetime.strptime()' (обратите внимание на * 'p' * там), чтобы снова проанализировать их на объекты' datetime' *. *. –

+0

В вашем понимании списка 'for d in dates' бесполезно используется несвязанный метод' datetime.strftime() '; просто вызовите метод непосредственно в экземплярах 'datetime'. –

ответ

2

Он появляется значения в вашей timestamps последовательности не строки; они уже datetime объектов. Вам не нужно разбирать их дальше. Также возможно, что у вас есть сочетание строк и datetime объектов; исключение, которое вы видите, выбрано потому, что хотя бы одно из значений в timestamps уже является экземпляром datetime.

Просто вызовите datetime.strftime()method на все объекты в ts их форматирование:

date_strings = [d.strftime('%m-%d-%Y') for d in timestamps] 

Демо:

>>> import datetime 
>>> timestamps = [datetime.datetime(2016, 11, 21, 0, 0), datetime.datetime(2016, 11, 22, 0, 0), datetime.datetime(2016, 11, 23, 0, 0)] 
>>> [d.strftime('%m-%d-%Y') for d in timestamps] 
['11-21-2016', '11-22-2016', '11-23-2016'] 

В том случае, если у вас есть смеси строк и datetime экземпляров в timestamps , вам придется выполнить дополнительную обработку:

def convert_as_needed(ts): 
    try: 
     # parse strings 
     datetime.strptime(ts, '%Y-%m-%d %H:%M:%S') 
    except TypeError: 
     # assume it is already a datetime object 
     return ts 

dates = map(convert_as_needed, timestamps) 
date_strings = [d.strftime('%m-%d-%Y') for d in dates] 
+0

большое спасибо. Это помогло. – MCM

+0

следующий вопрос. После преобразования, как я могу добавить день к дате? Использование datetime.timedelta (1) не работает, потому что теперь это строка. Есть ли простой workaroung? – MCM

+0

Добавьте свой timedelta * до * конвертирования в строку. '(d + timedelta (days = 1)). strftime ('% m-% d-% Y')' позволит вам делать оба в одном выражении. –

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