2013-05-01 6 views
0

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

даты: год-месяц-день

раз: час : минута: секунда

так я их аппарт и поместить каждый в отдельный список:

year,month,day = [i.split("-")[0] for i in date], [i.split("-")[1] for i in date], [i.split("-")[2] for i in date] 
hour,minute,second = [i.split(":")[0] for i in time], [i.split(":")[1] for i in time], [i.split(":")[2] for i in time] 

теперь, так как каждый из них длинные списки той же длины, я хочу, чтобы преобразовать их в один список, который содержит их как datetime объектов. Таким образом, я использовал другой список понимание этого:

datetime_column = [datetime.datetime(int(y),int(m),int(d),int(h),int(m),int(s)) for y,m,d,h,m,s in year,month,day,hour,minute,second] 

это дает мне следующую ошибку:

ValueError: too many values to unpack 

Я знаю, что это потому, что он пытается перебирать у, м, д, ч, м и s через каждый список, а не просто соединять их, например y с годом, m с месяцем и так далее. Итак, вот мой вопрос:

Как вы можете использовать понимание списка с 6 переменными, каждый из которых проходит через 1 из 6 отдельных списков? И если это невозможно, то какой эффективный способ сделать эквивалент?

ответ

6

Вы делаете вещи слишком сложными для себя. Zip в date и time списков, а затем использовать datetime.datetime.strptime():

datetime_column = [datetime.datetime.strptime('{} {}'.format(d, t), 
               '%Y-%m-%d %H:%M:%S') 
        for d, t in zip(date, time)] 

zip() пара вверх каждый date строки с каждой time строки, то мы используем каждую пару, чтобы создать полную строку времени, чтобы быть проанализирован методом strptime().

+0

, что работал отлично! один быстрый вопрос ... говорят, что это было не для объектов datetime, и я хотел сделать что-то вроде того, что сказал со списком. Возможно, я написал функцию, которая принимает 6 входов, и я хочу создать список с экземплярами этого ... это возможно? –

+0

@RyanSaxe: вы перебираете каждый отдельный список компонентов; первый элемент цикла представляет собой список «год», затем список «месяц» и т. д., где вы пытаетесь распаковать каждый из этих списков на 6 переменных. Вы тоже хотели использовать 'zip()'. –

+0

Ах, так что все это вместе, так что это одно! Поэтому, если бы я использовал старый метод, кроме как с 'zip (год, месяц, день, час, минута, секунда)', это сработало бы? –

0

Хотя есть лучшие способы сделать то, что вы пытаетесь сделать, вот ответ на вопрос, который вы на самом деле спросил:

datetime_column = [ 
    datetime.datetime(
     int(dt[0]),int(dt[1]),int(dt[2]),int(dt[3]),int(dt[4]),int(dt[5])) 
      for dt in zip(year,month,day,hour,minute,second)] 

или более лаконично:

datetime_column = [ 
    datetime.datetime(*dt) for dt in 
      (map(int, v) for v in zip(year,month,day,hour,minute,second))]