从python中的给定日期(不是当前时间)中减去一年

时间:2018-07-11 00:19:13

标签: python file date

我有一个文件,其中日期字段为YYYYMMDD格式。我需要减去12个月来选择其他产品的日期和产品,以获取其他信息。

文件1

20180131,Apple
20180228,Orange
20180331,Grapes

文件2

20170131,Apple,45
20170131,Orange,20
20170228,Orange,35
20170331,Apple,25

输出

20180131,Apple,45
20180228,Orange,35
20180331,Grapes,null

如何从给定日期(yyyymmdd)中减去12个月或1年,并以相同的格式获得答案。

1 个答案:

答案 0 :(得分:-1)

您可以使用标准库中的strptime来解析日期,但是不幸的是,标准库中没有日历支持,因此您必须使用dateutil库来减去年份。

import datetime
from dateutil.relativedelta import relativedelta
d = datetime.datetime.strptime('20180131', '%Y%m%d').date()
print((d - relativedelta(years=1)).strftime('%Y%m%d')) 

这将打印20170131。

请注意,如果输入是20160229,它将打印出来20150228。我不确定relativedelta的语义到底是什么,因此如果这对您很重要,请务必阅读文档。

为什么不使用timedelta?

datetime.timedelta是不合适的,不能正常工作。 timedelta代表时间的持续时间,或者代表天数,但是与直觉相反,一年不是持续时间,而是日历的概念。一年是365天或366天,具体取决于哪一年。

很明显,一旦找到正确的测试用例,timedelta将不起作用:

In [1]: from datetime import date, timedelta

In [2]: date(2018, 1, 1) - timedelta(365)
Out[2]: datetime.date(2017, 1, 1)

In [3]: date(2017, 1, 1) - timedelta(365)
Out[3]: datetime.date(2016, 1, 2)