Как вычесть переменное количество дней из переменных дат с помощью timedelta python

#python #datetime #timedelta

#python #datetime #timedelta

Вопрос:

У меня есть набор данных, который содержит исходные даты в этом формате:

 End_date=['Fri, 19 Aug 2011 19:28:17 -0000', 'Sun, 08 Apr 2012 02:14:00 -0000', 
'Wed, 22 Jun 2011 13:33:00 -0000', 'Fri, 30 Dec 2011 04:36:53 -0000'....]

Duration_in_days=[30, 20, 10, 15,....]
  

Как мне использовать цикл, datetime и timedelta, чтобы вычесть продолжительность из End_date для получения даты начала?

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

1. Каков ваш ожидаемый результат?

2. Я ожидаю, что результаты будут отображаться в том же формате, что и в End_date. Допустим, первая переменная минус 30 дней будет «Чт, 20 июля 2011 19:28:17 -0000».

3. Похоже, вы уже получили все это: цикл for, datetime и timedelta. Если вы запутались, посмотрите документацию. В частности, будут полезны strptime и strftime

Ответ №1:

 from datetime import datetime, timedelta

End_date=['Fri, 19 Aug 2011 19:28:17 -0000', 'Sun, 08 Apr 2012 02:14:00 -0000', 
'Wed, 22 Jun 2011 13:33:00 -0000', 'Fri, 30 Dec 2011 04:36:53 -0000']

Duration_in_days=[30, 20, 10, 15]


startDates = []
for date, days in zip(End_date, Duration_in_days):
    x = datetime.strptime(date, "%a, %d %b %Y %H:%M:%S -0000") - timedelta(days=days)
    startDates.append(x)
  

будет установлен startDates список дат начала в качестве объектов datetime

РЕДАКТИРОВАТЬ: Или использовать представление списка, как предложено в комментариях:

 startDates = [
    datetime.strptime(date, "%a, %d %b %Y %H:%M:%S -0000") - timedelta(days=days)
    for date, days in zip(End_date, Duration_in_days)
    ]
  

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

1. почему вы не используете понимание списка?

2. idk, именно так, как я это написал. понимание списка могло бы быть лучше

Ответ №2:

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

 # Need pprint for pretty printing of lists.

import time, datetime, pprint

# Set up test data.

End_date=[
    'Fri, 19 Aug 2011 19:28:17 -0000',
    'Sun, 08 Apr 2012 02:14:00 -0000',
    'Wed, 22 Jun 2011 13:33:00 -0000',
    'Fri, 30 Dec 2011 04:36:53 -0000',
]
Duration_in_days=[30, 20, 10, 15]
fmt = "%a, %d %b %Y %H:%M:%S %z"

# Add each (adjusted) item to a new list.

Start_date = []
for i in range(len(End_date)):
    # Parse end date, subtract and create string from it.

    dt = datetime.datetime.strptime(End_date[i], fmt)
    dt -= datetime.timedelta(days=Duration_in_days[i])
    Start_date.append(datetime.datetime.strftime(dt, fmt))

pprint.pprint(End_date)
pprint.pprint(Start_date)
  

И, несмотря на ваш комментарий об обратном, 20 июля 2011 года была среда 🙂

Выходные данные показывают исходное и скорректированное время:

 ['Fri, 19 Aug 2011 19:28:17 -0000',
 'Sun, 08 Apr 2012 02:14:00 -0000',
 'Wed, 22 Jun 2011 13:33:00 -0000',
 'Fri, 30 Dec 2011 04:36:53 -0000']
['Wed, 20 Jul 2011 19:28:17  0000',
 'Mon, 19 Mar 2012 02:14:00  0000',
 'Sun, 12 Jun 2011 13:33:00  0000',
 'Thu, 15 Dec 2011 04:36:53  0000']
  

Если вам нужен более питонический способ :-), вы можете заменить цикл на:

 Start_date = [datetime.datetime.strftime(datetime.datetime.strptime(dt, fmt) - datetime.timedelta(days=delta), fmt) for dt, delta in zip(End_date, Duration_in_days)]
  

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

1. Спасибо всем за ответы! Я попробовал это на dataset и, кажется, это сработало. Однако я получил префикс datetime в каждом элементе выходных данных. Есть какие-нибудь советы по исправлению? [datetime.datetime(2011, 7, 20, 19, 28, 17), datetime.дата-время(2012, 2, 20, 21, 54, 48), datetime.дата-время(2011, 5, 25, 13, 33), datetime.дата-время(2011, 11, 27, 23, 20, 5)]

2. @Greenday007: если вы видите это, это потому, что вы не используете strftime для преобразования datetime обратно в строку ( datetime.datetime.strftime(dt, fmt) бит). Формат, который вы показываете, является результатом фактического datetime объекта strftime() , который преобразует его в строку желаемого формата (такого же, как при анализе).