在Python中计算年周数减去周数
我试图找到一个自定义的日期格式,如YYYYW,例如201620,在减去一些周周期后 到目前为止,我已经能够使用以下代码将像YYYYW这样的日期字符串转换为日期在Python中计算年周数减去周数,python,python-3.x,python-2.7,Python,Python 3.x,Python 2.7,我试图找到一个自定义的日期格式,如YYYYW,例如201620,在减去一些周周期后 到目前为止,我已经能够使用以下代码将像YYYYW这样的日期字符串转换为日期 from datetime import datetime myDate = "201642" year = myDate[:4] week = myDate[-2:] day = '1' myDate = year + " " + week + " " + day print(myDate) date = datetime.strpt
from datetime import datetime
myDate = "201642"
year = myDate[:4]
week = myDate[-2:]
day = '1'
myDate = year + " " + week + " " + day
print(myDate)
date = datetime.strptime(myDate, "%Y %W %w")
print(date)
但我无法找到一种方法,从201642中减去43周,得到类似201552的结果
编辑1:使用评论中的建议,下面是解决方案
从日期时间导入日期时间
从日期时间导入时间增量
myDate = "201642"
year = myDate[:4]
week = myDate[-2:]
day = '1'
myDate = year + " " + week + " " + day
print(myDate)
date = datetime.strptime(myDate, "%Y %W %w")
print(date)
new_date = date - timedelta(weeks=42)
str_new_date = datetime.strftime(new_date, '%Y%W')
print(str_new_date)
除了自己计算之外,这里还有一个使用datetime的尝试。使用ISO周数做所有事情(使用以下方法): @Hildy答案的修改版本如下:
In [29]: start = datetime.datetime.strptime(date + '0', '%Y%W%w')
In [30]: start
Out[30]: datetime.datetime(2016, 10, 23, 0, 0)
In [31]: start.strftime('%Y%W')
Out[31]: '201642'
In [32]: end = start - datetime.timedelta(weeks=43)
In [33]: end
Out[33]: datetime.datetime(2015, 12, 27, 0, 0)
In [34]: end.strftime('%Y%W')
Out[34]: '201551'
您在示例代码中没有正确解析日期,但既然您说实际代码解析了日期,我们就忽略它 因此,您有一个
datetime
对象。你想从中减去43周。你所要做的就是…确切地说,使用:
结果是同一时间,一周的同一天,提前43周
但值得注意的是,对于当地时间,由于跨越夏时制边界,“同一时间”可能会缩短一小时。当你使用午夜时,休息一个小时会让你特别困惑。因此,对于此类工作,通常最好使用对象而不是
datetime
对象:
>>> dt = datetime.datetime(2016, 10, 21)
>>> dt.date()
datetime.date(2016, 10, 21)
>>> dt.date() - datetime.timedelta(weeks=43)
datetime.date(2015, 12, 25)
无论哪种方式,如果您想将其转换回
yyyww
字符串,则datetime
和date
都有相应的方法:
>>> d2 = dt - datetime.timedelta(weeks=43)
>>> d2.strftime('%Y%W')
'201551'
这可以通过dateutil库中的相对增量来完成;应该注意的是,该库是Python 2x标准库的一部分,但不是3x…您必须安装它 接下来您需要知道的是,根据Python,“当与strtime()方法一起使用时,
%U
和%W
仅在指定了星期几和年份的计算中使用。”
试试这个:
from dateutil.relativedelta import relativedelta
from datetime import datetime
#I've added the day number here, as described in the docs
myDate = "2016042"
# with '%w' added, strptime() will work
date = datetime.strptime(myDate, "%Y%w%W")
# now use relativedelta() to do the date math
date = date - relativedelta(weeks=2)
# finally, use strftime() to return the date back to the format you like
myDate = date.strftime("%Y%W")
print(string_date)
我在ETL操作中使用了它来计算会计期间之类的事情,它非常有效。正如这里的其他人所指出的,
timedelta()
可以以类似的方式使用 提示:一年有52周。我确实考虑过这个问题,但不确定它是否适用于闰年,因为它有52.2周。你的代码必须处理小数周吗?您输入的整年和整周似乎意味着没有。很好的一点,它不是小数,因为您有一个datetime
对象。从同一模块导入timedelta
类型。然后,您只需执行date-timedelta(weeks=43)
,然后使用strftime
将其转换回字符串格式即可。(虽然您可能希望使用date
对象而不是datetime
)我应该选择谁的答案,但你们都给出了相同的建议。对不起,我刚刚习惯了这么多礼节。听@Hildy的回答。它比较短。也许在你的实际代码中结合了这两者。
>>> d2 = dt - datetime.timedelta(weeks=43)
>>> d2.strftime('%Y%W')
'201551'
from dateutil.relativedelta import relativedelta
from datetime import datetime
#I've added the day number here, as described in the docs
myDate = "2016042"
# with '%w' added, strptime() will work
date = datetime.strptime(myDate, "%Y%w%W")
# now use relativedelta() to do the date math
date = date - relativedelta(weeks=2)
# finally, use strftime() to return the date back to the format you like
myDate = date.strftime("%Y%W")
print(string_date)