首页 > 解决方案 > 从python中的给定日期(不是当前时间)减去一年

问题描述

我有一个文件,其中日期字段的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 年并以相同的格式得到答案。

标签: pythonfiledate

解决方案


您可以使用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所以如果这对您很重要,请务必阅读文档。

为什么不是时间增量?

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

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

[1]中:从datetime导入日期,timedelta

在[2]中:日期(2018, 1, 1)-timedelta(365)
Out[2]: datetime.date(2017, 1, 1)

在 [3] 中:日期(2017, 1, 1) - 时间增量(365)
Out[3]: datetime.date(2016, 1, 2)

推荐阅读