2017-01-19 1 views
3

Я использую python 3.6 и получил некоторые проблемы для расчета даты.Перечислить элементы в формат времени и рассчитать разницу по времени с сегодняшнего дня

У меня есть список, состоящий из элементов даты, как показано ниже:

dates = [['2017','01','15'], ['2017','01','14'], ['2017','01','13'],...] 

Я хотел бы сделать это в формат времени и рассчитать дни с сегодняшнего дня.

Как я могу исправить свой код?

Ниже мой код:

dates = [['2017', '01', '15'], ['2017', '01', '14'], ['2017', '01', '13']] 

for date in dates: 
    date_cand = "-".join(date) 
    date_cand_time = time.strptime(date_cand,"%Y-%m-%d") 
    (datetime.date.today() - datetime.date(date_cand_time)).days 

У меня есть сообщение об ошибке сейчас:

TypeError: an integer is required (got type time.struct_time) 

Результат, который я хотел бы иметь это:

4 
5 
6 

Пожалуйста, помогите мне для этого.

ответ

5

date_cand_time не является целым числом, это tuple с целыми числами. Вы не можете просто передать это объекту datetime.date(). Вы должны были бы пройти в первых 3-х элементах, как отдельные аргументы вместо:

(datetime.date.today() - datetime.date(*date_cand_time[:3])).days 

* говорит Python, чтобы применить значение выражения lst_reg_date_cand_time[:3] в виде отдельных аргументов.

Однако, я не стал бы обходить через time.strptime(); только эти 3 строки в целые числа и передавать их непосредственно:

date_cand = datetime.date(*map(int, date)) 
(datetime.date.today() - date_cand).days 

Аргументы datetime.date(), в конце концов, year, month и day, в том же порядке, у вас есть свои строки.

Если вы должны использовать strptime, а затем использовать datetime.datetime.strptime() и извлечь date объект от:

date_cand = datetime.datetime.strptime("-".join(date), "%Y-%m-%d") 
(datetime.date.today() - date_cand.date()).days 

Demo:

>>> import datetime 
>>> dates = [['2017','01','15'], ['2017','01','14'], ['2017','01','13']] 
>>> for date in dates: 
...  # using map, produces a date 
...  date_cand = datetime.date(*map(int, date)) 
...  print(date_cand, (datetime.date.today() - date_cand).days) 
...  # using datetime.datetime.strptime, produces a datetime 
...  date_cand = datetime.datetime.strptime("-".join(date), "%Y-%m-%d") 
...  print(date_cand, (datetime.date.today() - date_cand.date()).days) 
... 
2017-01-15 4 
2017-01-15 00:00:00 4 
2017-01-14 5 
2017-01-14 00:00:00 5 
2017-01-13 6 
2017-01-13 00:00:00 6 
+1

В случае люди задаются вопросом, * карта (Int, дата) дату карты в тип Int. Эффективно преобразует строки даты в ints. * Затем оператор разбивает список на позиционные аргументы. http://stackoverflow.com/questions/5239856/foggy-on-asterisk-in-python –

4

Этот код, кажется, работает. Обратите внимание, что я использую datetime.strptime вместо time.strptime, в случае, если это делает никакой разницы:

from datetime import datetime 


def parse_dates(dates_array): 
    today = datetime.today() 
    for date_array in dates_array: 
     date = datetime.strptime('-'.join(date_array), '%Y-%m-%d') 
     yield (today - date).days 


if __name__ == '__main__': 
    dates = [['2017', '01', '15'], ['2017', '01', '14'], ['2017', '01', '13']] 
    for days_from_today in parse_dates(dates): 
     print(days_from_today) 

Выходной

4 
5 
6 

Caveat

Я двигаюсь расчет today вне для цикла для незначительных преимуществ в производительности, но это приведет к поломке кода, если вы оставите этот код за последний период IGHT.:)

1

Поскольку datetime.date использовался в вашем коде для вычисления дельты, здесь приведен чистый способ сделать то, что вы хотите.

import datetime 
dates = [['2017', '01', '15'], ['2017', '01', '14'], ['2017', '01', '13']] 
today = datetime.date.today() 
for date in dates: 
    year,month,day = [int(s) for s in date] #convert to int and assign to vars : year, month, day 
    date_cand_time = datetime.date(year,month,day) #convert date to datetime.date 
    delta = (today - date_cand_time).days #calculate the day delta 
    print delta 

Выход

4 
5 
6 
2

Это Python 2/Python 3 код представляет собой сочетание Мартейн-х и ответы ВАРУ в.

from datetime import datetime 

def parse_dates(dates_array): 
    today = datetime.today() 
    for d in dates_array: 
     yield (today - datetime(*map(int, d))).days 

if __name__ == '__main__': 
    dates = [ 
     ['2017', '01', '15'], 
     ['2017', '01', '14'], 
     ['2017', '01', '13'], 
    ] 
    for d in parse_dates(dates): 
     print(d) 

выход

4 
5 
6 

Как сказал ВАР, если дата может измениться в то время как этот код работает, то вам нужно переместить today = datetime.today() внутри цикла for.


Вот по существу то же самое, без функции:

from datetime import datetime 

dates = [ 
    ['2017', '01', '15'], 
    ['2017', '01', '14'], 
    ['2017', '01', '13'], 
] 

today = datetime.today() 

for d in dates: 
    delta = (today - datetime(*map(int, d))).days 
    print(delta) 
Смежные вопросы