首页 > 解决方案 > 如何使用timedelta python从可变日期中减去可变天数

问题描述

我有一个具有这种格式的原始日期的数据集:

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,....]

如何使用循环、日期时间和时间增量从 End_date 中减去持续时间以得出开始日期?

标签: pythondatetimetimedelta

解决方案


下面的程序展示了如何做到这一点,减去天数,最后得到一个基于字符串的集合:

# 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)

而且,尽管您的评论相反,2011 年 7 月 20 日是星期三 :-)

输出显示原始时间和调整后的时间:

['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']

如果您追求更 Pythonic 的方式:-),则可以将循环替换为:

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)]

推荐阅读