计算用Python

时间:2018-04-13 03:33:57

标签: 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.strptime(myDate, "%Y %W %w")
print(date)

但我无法找到一种可以减去的方法,例如。从201642起43周,获得201552的结果。

编辑1:使用评论中的建议,这是解决方案。

从datetime导入日期时间 来自datetime import timedelta

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)

3 个答案:

答案 0 :(得分:2)

除了自己做数学之外,这是尝试使用日期时间。使用ISO周数(使用this answer中的方法)执行所有操作:

if(isTruncated()){ return truncated }else{ return long_data }

@ Hildy的修改版本的答案如下:

>>> import datetime
>>> date = '201642'
>>> weeks = 43
>>> year = date[:4]
>>> week = date[4:]

>>> start = iso_to_gregorian(int(year), int(week), 1)
>>> start
datetime.date(2016, 10, 17)
>>> start.isocalendar()
(2016, 42, 1)
>>> offset_weeks = datetime.timedelta(weeks=43)
>>> end = start - offset_weeks
>>> end
datetime.date(2015, 12, 21)
>>> end.isocalendar()
(2015, 52, 1)
>>> '{}{}'.format(*end.isocalendar())
'201552'

答案 1 :(得分:2)

您实际上并未在示例代码中正确解析日期,但由于您说的是您的实际代码,请忽略它。

所以,你有一个datetime对象。你想减去43周。所有你需要做的就是......确切地说,使用timedelta

>>> dt = datetime.datetime(2016, 10, 21)
>>> dt - datetime.timedelta(weeks=43)
datetime.datetime(2015, 12, 25, 0, 0)

结果是同一时间,一周中的同一天,43周前。

但值得注意的是,对于当地时代而言,由于穿越了夏令时的边界,“同一时间”可能会被关闭一小时。当你正在使用午夜时,一小时的休息可能会特别令人困惑。因此,通常最好使用date个对象而不是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)

无论哪种方式,如果您想将其重新转换为YYYYWW字符串,datetimedate都有strftime方法:

>>> d2 = dt - datetime.timedelta(weeks=43)
>>> d2.strftime('%Y%W')
'201551'

答案 2 :(得分:2)

这可以通过dateutil库中的相对delta来完成;应该注意的是,所述库是Python 2x中标准库的一部分,但不是3x ......你必须安装它。

接下来你需要知道的是,根据Python docs,“当与strptime()方法一起使用时,%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()可以以类似的方式使用。