Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中计算年周数减去周数_Python_Python 3.x_Python 2.7 - Fatal编程技术网

在Python中计算年周数减去周数

在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

我试图找到一个自定义的日期格式,如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.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)