Запуск функции для всех элементов в списке (Преобразование списка дат в метку времени Unix)

#python #datetime #timestamp

Вопрос:

Я застрял, пытаясь понять, что не так с моим циклом for. Почему это добавляет одну и ту же метку времени UNIX во все переменные даты UNIX?

 now = datetime.datetime.today()
dates = []
for x in range(7):
    d = now - timedelta(days=x)
    dates.append(d.strftime("%Y/%m/%d"))
print(dates)
unixdates = []
for date in dates:
    e = time.mktime(datetime.datetime.strptime(datetime.date.today().strftime("%m/%d/%Y"), '%m/%d/%Y').timetuple())
    unixdates.append(e)
print(unixdates)
 

Вот результат:

 ['2021/11/03', '2021/11/02', '2021/11/01', '2021/10/31', '2021/10/30', '2021/10/29', '2021/10/28']
[1635912000.0, 1635912000.0, 1635912000.0, 1635912000.0, 1635912000.0, 1635912000.0, 1635912000.0]
 

Ответ №1:

потому что вы используете одну и ту же дату снова и снова, что всегда будет давать одно и то же время UNIX ( datetime.date.today() datetime здесь используется модуль datetime).

упростите свой код, используя метод datetime.timestamp для получения времени UNIX:

 from datetime import datetime, timedelta

today = datetime.now().date()
dates, unixdates = [], []

for x in range(7):
    d = today - timedelta(days=x)
    dates.append(d.strftime("%Y/%m/%d"))
    unixdates.append(datetime.combine(d, datetime.min.time()).timestamp())

print(dates)
print(unixdates) # my machine is on UTC 1
# ['2021/11/03', '2021/11/02', '2021/11/01', '2021/10/31', '2021/10/30', '2021/10/29', '2021/10/28']
# [1635894000.0, 1635807600.0, 1635721200.0, 1635631200.0, 1635544800.0, 1635458400.0, 1635372000.0]
 

Также обратите внимание, что здесь вы используете наивное время даты, которое будет предполагать местное время, если вы не зададите аргумент tz, например

 today = datetime.now(timezone.utc)
 

чтобы получить UTC.

Комментарии:

1. Ух ты, спасибо тебе. Это работает как заклинание