#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()
, который преобразует его в строку желаемого формата (такого же, как при анализе).